我尝试使用OpenCV和Python-tesseract应用OCR将以下图像转换为文本:Original image。
但是tesseract还没有成功地正确读取图像。它读到:uleswylly Bie 7 Srp a7。
我已经采取了以下步骤来预处理图像,然后再将其馈送到tesseract:
1.首先,我放大图像:
# Image scaling
def set_image_dpi(img):
# Get current dimensions of the image
height, width = img.shape[:2]
# Define scale factor
scale_factor = 6
# Calculate new dimensions
new_height = int(height * scale_factor)
new_width = int(width * scale_factor)
# Resize image
return cv2.resize(img, (new_width, new_height))
图像结果:result1.png
1.规格化图像:
# Normalization
norm_img = np.zeros((img.shape[0], img.shape[1]))
img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)
图像结果:result2.png
1.然后,我删除一些噪音:
# Remove noise
def remove_noise(img):
return cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 15)
图像结果:result3.png
1.获取灰度图像:
# Get grayscale
def get_grayscale(img):
return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
图像结果:result4.png
1.应用阈值:
# Thresholding
def thresholding(img):
return cv2.threshold(img, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) [1]
图像结果:result5.png
1.反转图像颜色:
# Invert the image
def invert(img):
return cv2.bitwise_not(img)
图像结果:result6.png
1.最后,我将图像传递给pytesseract:
# Pass preprocessed image to pytesseract
text = pytesseract.image_to_string(img)
print("Text found: " + text)
pytesseract输出:“uleswylly Bie7 Srp a7”
我想改善我的预处理,使pytesseract可以真正读取图像?任何帮助将不胜感激!
先谢谢你,
斯廷纳特
1条答案
按热度按时间qlvxas9a1#
这个问题有点挑战性,不过度拟合问题的解决方案……
假设文本是明亮的,无色的,并且被彩色像素包围。我们也可以假设背景是相对均匀的。
我们可以从
result3.png
开始,并使用以下阶段:padding用作
floodFill
的准备(需要,因为某些彩色像素会接触到图像边距)。请注意,所选颜色有点过拟合,因为饱和度需要接近红色像素的水平。
cv2.THRESH_OTSU
进行自动阈值)。pytesseract.image_to_string
应用于阈值化图像。代码示例:
输出:
Text found: Jules -Lv: 175 -P.17
result7.png
(漫灌后):result8.png
(提取饱和度通道后):result9.png
(阈值处理后):