我正在尝试进行字符检测,必须在它们周围画一个框,然后裁剪然后输入神经网络进行识别。一切正常,但在我在单色背景图像上使用字符集之前,很容易进行分割。
然而,对于真实照片,我有不同的光照条件,并且很难找到轮廓。 在应用了一些自适应阈值后,我设法得到了以下结果,但从那开始我真的无法想象如何正确地进行和检测每个字符。我可以轻松地检测到一半的角色,但不是全部。可能是因为它们周围有许多小的无关紧要的轮廓。 我感觉还有一步,但我无法确定哪一个。 查找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)
下面的图片 - 原始图片和中间结果的一些变化。
所以问题是 - 分割字符后的步骤/步骤是什么?
答案 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)
<强>结果:强>