opencv 我可以做些什么来改善我的OCR结果使用pytesseract?

cbeh67ev  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(144)

我尝试使用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可以真正读取图像?任何帮助将不胜感激!
先谢谢你,
斯廷纳特

qlvxas9a

qlvxas9a1#

这个问题有点挑战性,不过度拟合问题的解决方案……
假设文本是明亮的,无色的,并且被彩色像素包围。我们也可以假设背景是相对均匀的。
我们可以从result3.png开始,并使用以下阶段:

  • 用左上角像素的颜色添加填充。

padding用作floodFill的准备(需要,因为某些彩色像素会接触到图像边距)。

  • 用浅蓝色填充背景。

请注意,所选颜色有点过拟合,因为饱和度需要接近红色像素的水平。

  • 从BGR转换到HSV颜色空间,并提取饱和度通道。
  • 应用阈值(使用cv2.THRESH_OTSU进行自动阈值)。
  • pytesseract.image_to_string应用于阈值化图像。

代码示例:

import cv2
import numpy as np
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'  # May be required when using Windows

img = cv2.imread('result3.png')  # Read result3.png

# Add padding with the color of the top left pixel
pad_color = img[0, 0, :]
padded_img = np.full((img.shape[0]+10, img.shape[1]+10, 3), pad_color, np.uint8)
padded_img[5:-5, 5:-5, :] = img

cv2.floodFill(padded_img, None, (0, 0), (255, 100, 100), loDiff=(10, 10, 10), upDiff=(10, 10, 10))  # Fill the background with blue color.
cv2.imwrite('result7.png', padded_img)

# Convert from BGR to HSV color space, and extract the saturation channel.
hsv = cv2.cvtColor(padded_img, cv2.COLOR_BGR2HSV)
s = hsv[:, :, 1]
cv2.imwrite('result8.png', s)

# Apply thresholding (use `cv2.THRESH_OTSU` for automatic thresholding)
thresh = cv2.threshold(s, 0, 255, cv2.THRESH_OTSU)[1]
cv2.imwrite('result9.png', thresh)

# Pass preprocessed image to PyTesseract
text = pytesseract.image_to_string(thresh, config="--psm 6")
print("Text found: " + text)

输出:
Text found: Jules -Lv: 175 -P.17
result7.png(漫灌后):

result8.png(提取饱和度通道后):

result9.png(阈值处理后):

相关问题