kac*_*aci 6 python opencv image image-processing python-3.x
因此,我正在尝试创建一个程序,该程序可以查看图像的编号并在控制台中打印整数。(我正在使用 python 3)
例如,程序识别出以下图像(程序必须检查的实际图像)是数字 2:
我试图将它与其中包含 2 的其他图像进行比较,cv2.matchTemplate()但是每次蓝色像素的 rgb 值对于每个图像都有一点不同,并且图像可能会更大或更小。例如下图:
除了其他蓝色数字图像(0-9)之外,它还必须识别它,例如以下图像:
我尝试了多个匹配模板代码,并制作了一个包含数字 0-9 图像的文件夹作为模板,但每次几乎每个数字都在需要识别的数字中被识别。例如数字 5 在数字 2 的图像中被识别。如果它不能识别所有这些,它就会识别错误的。
我试过的那些:
但就像我之前说的那样,这些问题也随之而来。
我还尝试查看每张图像中蓝色的百分比,但这些数字接近于通过查看其中的蓝色来告诉数字不同。
有没有人有办法解决吗?我是不是很笨,cv2.matchTemplate()有没有更简单的选择?(我不介意为此使用库,因为这是更大代码段的一部分,但我更喜欢对其进行编码,而不是库)
代替使用模板匹配,更好的方法是使用Pytesseract OCR读取带有image_to_string(). 但在进行OCR之前,需要对图像进行预处理。为了获得最佳 OCR 性能,预处理的图像应具有OCR 所需的黑色文本/数字/字符,背景为白色。一个简单的预处理步骤是将图像转换为灰度、Otsu 阈值以获得二值图像,然后反转图像。这是预处理步骤的可视化:
输入图像->灰度->Otsu 阈值->准备 OCR 的反转图像
Pytesseract OCR 的结果
2
这是其他图像的结果:
2
5
我们使用--psm 6配置选项来假设单个统一的文本块。请参阅此处了解更多配置选项。
代码
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# Load image, grayscale, Otsu's threshold, then invert
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
invert = 255 - thresh
# Perfrom OCR with Pytesseract
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
注意:如果您坚持使用模板匹配,则需要使用比例变体模板匹配。看看如何隔离轮廓内的所有内容、缩放轮廓并测试与图像的相似性?和Python OpenCV 线检测来检测图像中的 X 符号作为一些示例。如果您确定图像是蓝色的,那么另一种方法是使用颜色阈值来cv2.inRange()获取二值蒙版图像,然后在图像上应用 OCR。
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |