如何在 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)
我正在尝试使用 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)