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

Python 如何从图像中提取虚线文本?,python,opencv,image-processing,ocr,python-tesseract,Python,Opencv,Image Processing,Ocr,Python Tesseract,我正在做我的学士学位期末项目,我想用python为瓶子检查创建一个OCR。我需要一些从图像中识别文本的帮助。我是否需要以更好的方式应用cv2操作,培训tesseract,还是应该尝试其他方法 我尝试对图像进行图像处理操作,并使用pytesseract识别字符 使用我从这张照片中获得的代码: 到这个: 然后转到这个: 锐化功能: def sharpen(img): sharpen = iaa.Sharpen(alpha=1.0, lightness = 1.0) sharpen_im

我正在做我的学士学位期末项目,我想用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_字符串的结果:

22203;?!)

92:53 a
预期结果是:

22/03/20

02:53 A

从您得到的结果和预期的结果中,您可以看到一些字符被正确识别。假设您使用的图像与教程中显示的图像不同,我建议您更改
threshold
getStructuringElement
的值

根据图像颜色,这些值的效果更好。教程作者必须对其进行了优化(通过反复试验或其他方式)

如果您想使用opencv中的滑块播放这些值,则为视频。您也可以在同一循环中打印结果,以查看是否获得了所需的结果。

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

首先,我要感谢你承担了这个项目,并取得了这么大的成就。从OpenCV/cv2的角度来看,您所拥有的看起来相当不错


现在,如果你想让Tesseract带你走完剩下的路,至少你得训练它。在这里,你有一个艰难的选择:投资培训Tesseract,或与CNN合作识别有限的字母表。如果你有一种分割图像的方法,我会倾向于使用后者。

你可以做一件潜在的事情来提高对字符的识别能力,那就是放大字符,这样pytesseract可以提供更好的结果。扩展字符会将各个blob连接在一起,并可以修复
/
A
字符。因此,从您最新的二进制图像开始:

原创的

使用
3x3
内核扩展,其中
iterations=1
(左)或
iterations=2
(右)。您可以尝试使用其他值,但不要做得太多,否则所有字符都会连接起来。也许这将为您提供更好的OCR结果


你能告诉tesseract预期的字符吗?(0-9/:)?@OznOg我不熟悉tesseract和python,所以如果我做得好,我就不是舒尔。我修改了对以下内容的image-to-string调用:pytesseract.image-to-string(close,config=“-c tessedit\u char\u whitelist=0123456789abcdefghijklmnopqrstuvwxyz/:-psm 6”),结果稍微好了一点:2343/20 92:53谢谢,我会试试看!
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)