繁体   English   中英

使用opencv消除OCR的背景噪音

[英]Remove the background noise for OCR with opencv

我正在尝试对tesseract进行OCR,以获得更好的结果,我想在将背景噪声发送到tessseract之前将其去除。

我已经知道文本具有固定的颜色,并使用cv2.inrange删除噪点背景,但是问题是背景噪点的颜色与文本颜色相似,因此我陷入了这种情况。

这是我用于处理原始测试的图像:

img.png

我试过的

  • 通过过滤内部文本颜色来使用cv2.inRange(颜色代码:#d7d4cf,像白色,但不是白色,有点灰色),但是背景噪音很大。 结果图像使用白色

1个

  • 通过过滤类似黑色的颜色来使用cv2.inRange(#171510),它看起来更好,但仍然不如我想要的那样,结果图像:使用黑色

2

  • 我也尝试使用bitwise_and将白色和黑色合并在一起,但是得到了相似的结果,但都不好。 有人可以帮助我或向我推荐任何东西,谢谢。

    from PIL import Image
    from pytesseract import *
    import cv2
    import numpy as np

    def img_hsv_mask_white(img):
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)           
        # for hsv, OpenCV uses H: 0-179, S: 0-255, V: 0-255
        lower_hsv = np.array([0,0,185])           
        upper_hsv = np.array([179,17,235])
        mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
        blur = cv2.blur(mask,(3,3))
        img2 = cv2.bitwise_and(img, img, mask = blur)
        #cv2.imshow("mask", mask)
        #cv2.waitKey (0)
        return img2

    def img_hsv_mask_black(img):
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)           
        # for hsv, OpenCV uses H: 0-179, S: 0-255, V: 0-255
        lower_hsv = np.array([0,0,0])
        upper_hsv = np.array([60,80,70])
        mask = cv2.inRange(hsv, lower_hsv, upper_hsv)

        blur = cv2.blur(mask,(8,8))
        #return blur
        img2 = cv2.bitwise_and(img, img, mask = blur)
        #cv2.imshow("mask", mask)
        #cv2.waitKey (0)
        return img2

    def immerge(img1, img2):
        img = cv2.bitwise_and(img1,img2)
        return img

    #require module: numpy, opencv-python, Pillow, pytesseract

    if __name__ == "__main__":
        pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract'
        #print(pytesseract.get_tesseract_version())
        for x in range(1,9):
            file = str.format("0711/{0}.png",x)
            srcimg = cv2.imread(file,cv2.IMREAD_UNCHANGED)
            white = img_hsv_mask_white(srcimg)
            black = img_hsv_mask_black(srcimg)
            merged = immerge(white, black)
            #cv2.imwrite("result.png",mask)
            code = pytesseract.image_to_string(merged, lang ='eng')
            print(code)
            cv2.imshow(file, merged)
            cv2.waitKey(0)
            #break

从第一个结果开始,您可以消除以下噪声:

  • 太大或太小而不能写字母

  • 没有与其余文字垂直居中

import cv2 as cv
import numpy as np

im = cv.imread('ocr.png')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)

def size_threshold(bw, minimum, maximum):
    retval, labels, stats, centroids = cv.connectedComponentsWithStats(bw)
    for val in np.where((stats[:, 4] < minimum) + (stats[:, 4] > maximum))[0]:
      labels[labels==val] = 0
    return (labels > 0).astype(np.uint8) * 255

def y_centroid_threshold(bw, minimum, maximum):
    retval, labels, stats, centroids = cv.connectedComponentsWithStats(bw)
    for val in np.where((centroids[:, 1] < minimum) + (centroids[:, 1] > maximum))[0]:
      labels[labels==val] = 0
    return (labels > 0).astype(np.uint8) * 255

sized = size_threshold(thresh, 60, 300)
centered = y_centroid_threshold(sized, 40, 63)
cv.imwrite('ocr_out.png', centered)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM