Tesseract OCR的Opencv图像转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tesseract OCR的Opencv图像转换相关的知识,希望对你有一定的参考价值。

我有以下图像,我想提供给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运行它。

答案

我认为你应该在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

另一答案

在阈值图像之前尝试使用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替换阈值类型,它应该没有任何问题。尝试使用参数,我相信你可以使它与你的所有图像一起使用。干杯!

另一答案

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

enter image description here

以上是关于Tesseract OCR的Opencv图像转换的主要内容,如果未能解决你的问题,请参考以下文章

进行 OCR 之前的预处理(tesseract、OpenCV)

如何使用 openCV 或 OCR tesseract 从图像中提取文本? [复制]

使用Python,OpenCV进行Tesseract-OCR绑定及识别

Python+OpenCV+Tesseract实现OCR字符识别

文本的检测识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别

如何使用 Tesseract 对图像进行 OCR