【问题标题】:Characters detection on a non-uniform background image非均匀背景图像上的字符检测
【发布时间】:2018-05-24 03:31:16
【问题描述】:

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

但是对于真实照片,我有不同的照明条件,很难找到轮廓。 在应用了一些自适应阈值后,我设法得到了以下结果,但从那开始,我真的不知道如何正确地进行和检测每个字符。我可以很容易地检测到一半的字符,但不是全部。可能是因为它们被许多不相关的小轮廓包围。 我有一种感觉,还剩一步,但我不知道是哪一步。 Find 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

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

【问题讨论】:

  • 你试过减少噪音吗? Tutorialwiki。 Wiki 中有一些可怕的名称,因此请尝试在 opencv 中搜索特定技术以查看结果(例如 dilation, erosion 等)
  • 谢谢!这个我其实没试过。是的,可怕的名字并不那么可怕:)

标签: python opencv


【解决方案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)

结果:

【讨论】:

  • 太好了,谢谢!这实际上比我所有的努力都产生了更好的结果
  • @Alex 尝试改变内核的大小并看到不同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多