我正在完成我的学士学位的最终项目,我想创建一个OCR以使用python进行瓶检查。我需要一些图像识别方面的帮助。我是否需要以更好的方式应用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
答案 0 :(得分:1)
从得到的结果和预期的结果中,您可以看到某些字符已正确识别。假设您使用的图像与本教程中显示的图像不同,建议您更改threshold
和getStructuringElement
的值。
这些值根据图像颜色效果更好。教程作者必须已对其进行优化以供他/她使用(通过反复试验或其他方式)。
long_normalize
是一个视频,如果您想使用opencv中的滑块来使用这些值。您还可以在同一循环中打印结果,以查看是否获得所需的结果。
答案 1 :(得分:0)
“我是否需要以更好的方式应用cv2操作,训练tesseract还是应该尝试其他方法?”
首先,对进行此项目并将其付诸实践的荣誉。从OpenCV / cv2的角度来看,您所拥有的一切看起来都很好。
现在,如果您想让Tesseract承担其余的整个过程,那么至少您必须对其进行培训。在这里,您有一个艰难的选择:投资于培训Tesseract,或编制CNN以识别有限的字母。如果您有一种方法可以对图像进行分割,那么我很想选择后者。
答案 2 :(得分:0)
您可以采取的提高字符识别度的潜在措施是扩大字符,以便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)