繁体   English   中英

如何从图像中提取虚线文本?

[英]How to extract dotted text from image?

我正在攻读我的学士学位最终项目,我想用python创建一个用于瓶子检查的OCR。 我需要一些图像文本识别方面的帮助。 我是否需要以更好的方式应用cv2操作,训练tesseract或我应该尝试其他方法?

我在图像上尝试了图像处理操作,并使用pytesseract识别字符。

使用我从这张照片得到的代码:

在此输入图像描述

到这一个:

在此输入图像描述

然后到这一个:

在此输入图像描述

锐化功能:

def sharpen(img):
  sharpen = iaa.Sharpen(alpha=1.0, lightness = 1.0)
  sharpen_img = sharpen.augment_image(img)
  return sharpen_img

图像处理代码:

textZone = cv2.pyrUp(sharpen(originalImage[y:y + h - 1, x:x + w - 1])) #text zone cropped from the original image

sharp = cv2.cvtColor(textZone, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(sharp, 127, 255, cv2.THRESH_BINARY)

#the functions such as opening are inverted (I don't know why) that's why I did opening with MORPH_CLOSE parameter, dilatation with erode and so on

kernel_open = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
open = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel_open)

kernel_dilate = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,7))
dilate = cv2.erode(open,kernel_dilate)

kernel_close = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5))
close = cv2.morphologyEx(dilate, cv2.MORPH_OPEN, kernel_close)

print(pytesseract.image_to_string(close))

这是pytesseract.image_to_string的结果:

22203;?!)

92:53 a

预期的结果是:

22/03/20

02:53 A

根据您获得的结果和预期结果,您可以看到某些字符被正确识别。 假设您使用的是与教程中显示的图像不同的图像,我建议您更改thresholdgetStructuringElementthreshold

这些值根据图像颜色更好地工作。 教程作者必须针对他/她的使用进行优化(通过反复试验或其他方式)。

如果你想在opencv中使用滑块来玩这些值, 是一个视频。 您还可以在同一循环中打印结果,以查看是否获得了所需的结果。

“我是否需要以更好的方式应用cv2操作,训练tesseract或我应该尝试其他方法?”

首先,赞赏这个项目,并与之相提并论。 你从OpenCV / cv2的角度看到的东西看起来很不错。

现在,如果你想把Tesseract带到剩下的路上,至少你必须训练它。 在这里你有一个艰难的选择:投资培训Tesseract,或者通过CNN来识别有限的字母表。 如果你有办法分割图像,我很想接受后者。

你可以做的一件事就是提高对角色的认识,扩大角色,使pytesseract得到更好的结果。 对字符进行扩展会将各个blob连接在一起,并可以修复/A字符。 所以从最新的二进制图像开始:

原版的

使用3x3内核扩展, iterations=1 (左)或iterations=2 (右)。 您可以尝试使用其他值但不要执行太多操作,否则字符将全部连接。 也许这将为您提供更好的结果OCR。

import cv2

image = cv2.imread("1.PNG")
thresh = cv2.threshold(image, 115, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilate = cv2.dilate(thresh, kernel, iterations=1)
final = cv2.threshold(dilate, 115, 255, cv2.THRESH_BINARY_INV)[1]

cv2.imshow('image', image)
cv2.imshow('dilate', dilate)
cv2.imshow('final', final)
cv2.waitKey(0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM