在非均匀背景图像上检测字符

时间:2018-05-23 16:19:21

标签: python opencv

我正在尝试进行字符检测,必须在它们周围画一个框,然后裁剪然后输入神经网络进行识别。一切正常,但在我在单色背景图像上使用字符集之前,很容易进行分割。

然而,对于真实照片,我有不同的光照条件,并且很难找到轮廓。 在应用了一些自适应阈值后,我设法得到了以下结果,但从那开始我真的无法想象如何正确地进行和检测每个字符。我可以轻松地检测到一半的角色,但不是全部。可能是因为它们周围有许多小的无关紧要的轮廓。 我感觉还有一步,但我无法确定哪一个。 查找Countours只能查找大约一半的字符。

现在,简而言之,我正在做:

im_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
im_gray = cv2.GaussianBlur(im_gray, (5, 5), 0)
_, th1 = cv2.threshold(im_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cim, ctrs, hier = cv2.findContours(th1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

th2 = cv2.adaptiveThreshold(im_gray,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2)

下面的图片 - 原始图片和中间结果的一些变化。

Original pic

After some thresholding

After some thresholding

Inverse thresholding

所以问题是 - 分割字符后的步骤/步骤是什么?

1 个答案:

答案 0 :(得分:1)

你可以执行高斯差异。我们的想法是用两个不同的内核模糊图像并减去它们各自的结果:

<强>代码:

im = cv2.imread(img, 0)

#--- it is better to take bigger kernel sizes to remove smaller edges ---
kernel1 = 15
kernel2 = 31

blur1 = cv2.GaussianBlur(im,(kernel1, kernel1), 0) 
blur2 = cv2.GaussianBlur(im,(kernel2, kernel2), 0) 

cv2.imshow('Difference of Gaussians',blur2 - blur1)

<强>结果:

enter image description here