Tesseract OCR的Opencv图像转换

问题描述 投票:0回答:3

我有以下图像,我想提供给tesseract检测文本:

输入图片:

enter image description here

我正在使用OTSU转换处理此图像:代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt
import glob


for img in glob.glob("/home/image.jpg"):

    cv_img=cv2.imread(img,0)    
    #img = cv2.imread('1.jpg',0)
    cv_img = cv2.medianBlur(cv_img,5)

    ret,th1 = cv2.threshold(cv_img,127,255,cv2.THRESH_BINARY)
    th2 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
    th3 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)


    cv2.imwrite('OTSU.jpg', th3)

我在此转换后得到的输出图像是:

enter image description here

以下是我的条件:我面临的主要障碍是在图像上随机出现的白线。实际图像的数量可能比1993年的数量多,但干扰图像的白线数量可能会增加,我想清理这些图像文件,以便它们可以用于Tesseract OCR。

我已经在原始图像上尝试了Canny边缘检测,这似乎给出了轮廓

Canny边缘探测器输出:enter image description here

如何清除输入图像以消除文本上重叠的白线?我的目标是通过Tesseract OCR运行它。

python-3.x opencv python-tesseract
3个回答
0
投票

我认为你应该在opencv中研究形态转换。文档可以找到here

从我的脚本中使用侵蚀和扩张的起点制作了一小段代码:

import cv2
import numpy as np

cv_img = cv2.imread('1993.jpg', 0)


cv_img = cv2.medianBlur(cv_img, 5)

ret, th1 = cv2.threshold(cv_img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(cv_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)

kernel_erosion = np.ones((3,3), np.uint8)
kernel_dilation = np.ones((1,1), np.uint8)
erosion = cv2.erode(th2, kernel_erosion, iterations=1)
dilation = cv2.dilate(erosion, kernel_dilation, iterations=1)

cv2.imwrite('morph.jpg', dilation)

您可以使用不同的内核或不同的转换。这是我得到的输出:

Erosion and dilation


0
投票

在阈值图像之前尝试使用CLAHE 。这是我试过的:

import cv2
import numpy as np

image = cv2.imread("numbers.jpg")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

clahe = cv2.createCLAHE(clipLimit=10, tileGridSize=(5, 5))
gray = clahe.apply(gray)
ret, thresh = cv2.threshold(v, 140, 150, cv2.THRESH_BINARY_INV)
morph = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((5,5), np.uint8), 
                        iterations=1)
morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, np.ones((3,1), np.uint8), 
                         iterations=1)

结果:

Result

您可以使用cv2.THRESH_OTSU替换阈值类型,它应该没有任何问题。尝试使用参数,我相信你可以使它与你的所有图像一起使用。干杯!


0
投票

cv2.ximgproc.niBlackThreshold还有一个结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.