如何在 Canny 边缘检测后填充字母中的空白

How to fill the gaps in letters after Canny edge detection

我正在尝试使用 Tesseract 进行阿拉伯语 OCR,但 OCR 不起作用,除非字母填充为黑色。 Canny边缘检测后如何填补空白?

这里是示例图片和示例代码:

import tesserocr
from PIL import Image
import pytesseract
import matplotlib as plt
import cv2
import imutils
import numpy as np

image = cv2.imread(r'c:\ahmed\test3.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray = cv2.bilateralFilter(gray,30,40,40)
#gray = cv2.GaussianBlur(gray,(1,1), 0)
gray =cv2.fastNlMeansDenoising(gray ,None, 4, 7, 21)

image = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY,11,2)
k = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))

blur = cv2.medianBlur(image,3)
erode = cv2.erode(blur, k)
dilat = cv2.dilate(erode,k)
cv2.imshow("gray", dilat)

#cv2.imshow("dilation", img_dilation)
#thresh = cv2.Canny(thresh, 70, 200)

#crop_img = gray[215:215+315, 783:783+684]
#cv2.imshow("cropped", crop_img)

#resize = imutils.resize(blur, width = 460)
#cv2.imshow("resize", resize)

text = pytesseract.image_to_string(dilat, lang='ara')
print(text)
with open(r"c:\ahmed\file.txt", "w", encoding="utf-8") as myfile:
    myfile.write(text)
cv2.waitKey(0)

结果:

This is a sample image 阈值化和 Canny 都不起作用。

在这种情况下,因为文本是黑色的,所以最好简单地找到所有黑色像素。

使用 NumPy 完成此操作的一种非常简单的方法如下:

import matplotlib.pyplot as pp
import numpy as np

image = pp.imread(r'/home/cris/tmp/Zuv3p.jpg')
bin = np.all(image<100, axis=2)

这样做是找到所有三个通道的值都低于 100 的所有像素。我随机选择了 100 的阈值,可能有更好的方法来选择阈值。 :)


备注:

1- 在处理彩色输入时,将转换为灰度值图像作为第一步通常不是一个好主意。这丢掉了很多信息。有时是合适的,但在这种情况下最好不要。

2- 边缘检测非常好,但通常是错误的方法。需要查找边缘时使用边缘检测。当你不想要边缘时使用其他东西。


编辑:如果出于某种原因 np.all 抱怨数据类型(对我来说不是),您应该能够将其输入转换为正确的类型:

bin = np.all(np.array(image<100, dtype=np.bool), axis=2)

或者也许

bin = np.all(np.array(image<100, dtype=np.uint8), axis=2)