【问题标题】:How do i remove highlight from a printed text book in python?如何从 python 中的印刷教科书中删除突出显示?
【发布时间】:2019-12-26 09:54:54
【问题描述】:

我正在从教科书中提取突出显示的文本。我已经找到了突出显示并提取了里面的文本。为了处理高光,我将图像转换为灰度,并使用 OTSU 阈值去除背景高亮颜色。 当高光是黄色或绿色等浅色时,这非常有用,但当高光是深色时,阈值处理失败,我得到黑色背景覆盖了大部分文本,这阻碍了 ocr 阅读。

我已尝试将亮度标准化,但似乎不起作用。

我需要一些方法来确定前景色和背景色,然后去除背景色。或者我需要一些方法来动态阈值图像以获得黑色文本和白色背景。

        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        normalized_gray = cv2.equalizeHist(gray)
        (thresh, processed_image) = cv2.threshold(normalized_gray, 127, 255, cv2.THRESH_OTSU)

测试图片: https://ibb.co/856YtMx

一些测试结果:

当我在阈值之前运行 equalizeHist 时。 https://ibb.co/HT0jpKW

当我在阈值化后运行 equalizeHist 时。 https://ibb.co/ZXSz97J

当我使用二进制阈值时,文本被吹走: https://ibb.co/DLXywXz

【问题讨论】:

    标签: python ocr tesseract


    【解决方案1】:

    例如像这样的东西应该可以工作:

    import cv2
    import numpy as np
    
    image = cv2.imread('photo-2019-08-12-12-44-59.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # adjust contrast
    gray_contract = cv2.multiply(gray, 1.5)
    
    # create a kernel for the erode
    kernel = np.ones((2, 2), np.uint8)
    img_eroded = cv2.erode(gray_contract, kernel, iterations=1)
    
    # binarize with otsu
    (thresh, otsu) = cv2.threshold(img_eroded, 127, 255,
                                   cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    

    你也可以看看How to remove shadow from scanned images using OpenCV的帖子

    【讨论】:

    • 如果要包含后图像,则应包含前图像。
    • @DanD.:我不明白你想用你的评论说什么。
    • #adjust contrast gray_contract = cv2.multiply(gray, 1.5) 这只是因为 1.5 是静态值,所以可以摆脱单张图像的背景,有没有办法动态设置这个值?例如:这张图片我需要大约 2.2 ibb.co/Tbx78B3
    • 如果可以同时看到输入和输出,就更容易判断转换是否正确。
    • @DanD.:我使用了有问题的输入(测试图像)。我看不出再把它放在这里的结果。
    【解决方案2】:

    这里需要自适应阈值。

    我的代码输出。可以微调。

    import cv2
    import numpy as np
    
    img = cv2.imread("high.jpg")
    
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    gaus = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 20)
    
    cv2.imshow("Gaussian", gaus)
    cv2.waitKey(0)
    
    cv2.imwrite('output.png', gaus)
    

    更新

    将参数更改为adaptiveThreshold 函数,即您发布的第二张图片。

    gaus = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 8)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2014-01-02
      • 1970-01-01
      • 2011-08-31
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多