如何从图像中提取虚线文本?
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
从你得到的结果和预期的结果可以看出,部分字符被正确识别了。假设您使用的图像与教程中显示的图像不同,我建议您更改 threshold
和 getStructuringElement
的值。
根据图像颜色,这些值效果更好。教程作者必须针对 his/her 使用对其进行了优化(通过反复试验或其他方式)。
Here 是一个视频,如果你想在 opencv 中使用滑块来玩弄这些值。您还可以在同一个循环中打印您的结果,看看您是否得到了想要的结果。
"Do I need to apply the cv2 operations in a better way, train tesseract or should I try another method?"
首先,感谢您继续这个项目并取得如此进展。从 OpenCV/cv2 的角度来看,你所拥有的看起来不错。
现在,如果您正在考虑让 Tesseract 带着您走完剩下的路,至少您需要训练它。在这里,您有一个艰难的选择:投资训练 Tesseract,或者构建 CNN 来识别有限的字母表。如果你有办法分割图像,我很想用后者。
为了提高对字符的识别,您可以做的一件事是扩大字符,以便 pytesseract 提供更好的结果。膨胀字符会将各个斑点连接在一起,并可以修复 /
或 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)
我正在研究我的学士学位期末项目,我想使用 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
从你得到的结果和预期的结果可以看出,部分字符被正确识别了。假设您使用的图像与教程中显示的图像不同,我建议您更改 threshold
和 getStructuringElement
的值。
根据图像颜色,这些值效果更好。教程作者必须针对 his/her 使用对其进行了优化(通过反复试验或其他方式)。
Here 是一个视频,如果你想在 opencv 中使用滑块来玩弄这些值。您还可以在同一个循环中打印您的结果,看看您是否得到了想要的结果。
"Do I need to apply the cv2 operations in a better way, train tesseract or should I try another method?"
首先,感谢您继续这个项目并取得如此进展。从 OpenCV/cv2 的角度来看,你所拥有的看起来不错。
现在,如果您正在考虑让 Tesseract 带着您走完剩下的路,至少您需要训练它。在这里,您有一个艰难的选择:投资训练 Tesseract,或者构建 CNN 来识别有限的字母表。如果你有办法分割图像,我很想用后者。
为了提高对字符的识别,您可以做的一件事是扩大字符,以便 pytesseract 提供更好的结果。膨胀字符会将各个斑点连接在一起,并可以修复 /
或 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)