python - Canny边缘检测后如何填补字母中的空白
问题描述
我正在尝试使用 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)
结果:
这是一个示例图像,它既不能用于阈值处理,也不能用于 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)
推荐阅读
- java - logback:以编程方式和全局添加一个新的 appender,如 logback.xml
- html - HTML/Bootstrap - 媒体查询问题
- mysql - MySQL查询慢不知道如何优化
- spring-boot - 如何读取从 keycloak 到 spring boot 的新修改记录的事件
- swiftui - @Published 变量在没有 didSet 的情况下导致崩溃
- c# - 抽象成员导致的“构造函数中的虚拟成员调用”
- python-3.x - python - 如何根据另一列中的特定值和Python Pandas中的指定比例为行分配二进制值?
- java - 如何仅获得第一个排列?
- html - 有没有办法在 html 合并文档中使用逻辑语句?
- laravel - Vue.js:基于计算属性的条件渲染