【问题标题】:How do I make masks to set all of image background, except the text, to white?如何制作蒙版以将除文本之外的所有图像背景设置为白色?
【发布时间】:2019-06-06 04:20:50
【问题描述】:

我正在尝试提取该区域中的文本以运行 OCR,但杂散的黑色边缘会干扰某些结果。有没有办法隔离这个文本?

找到这个轮廓后,我用黑色背景蒙版将其从原始图像中裁剪出来。我不太确定如何将背景更改为白色,也无法找到摆脱轮廓周围黑边的方法。对图像进行阈值处理似乎可以消除文本中的一些黑色像素,这是我不想要的。

理想情况下,输出应该只是黑色文本和白色背景。

这是我尝试过的原始掩码代码中的一部分-

mask = np.ones(orig_img.shape).astype(orig_img.dtype)
cv2.fillPoly(mask, [cnt], (255,255,255))
cropped_contour = cv2.bitwise_and(orig_img, mask)

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    要隔离文本,一种方法是获取所需 ROI 的边界框坐标,然后将该 ROI 蒙版到空白图像上。主要思想是:

    • 将图像转换为灰度
    • 阈值图像
    • 放大图像以将文本连接为单个边界框
    • 查找轮廓并过滤使用的轮廓区域以查找 ROI
    • 将 ROI 放置在遮罩上

    阈值图像(左)然后扩大连接文本(右)

    您可以使用 cv2.boundingRect() 找到轮廓,然后一旦您有了 ROI,您就可以将这个 ROI 放置在蒙版上

    mask = np.zeros(image.shape, dtype='uint8')
    mask.fill(255)
    mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]
    

    找到轮廓然后过滤 ROI(左),最终结果(右)

    根据您的图像大小,您可能需要调整轮廓区域的过滤器。

    import cv2
    import numpy as np
    
    original_image = cv2.imread('1.png')
    image = original_image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
    dilate = cv2.dilate(thresh, kernel, iterations=5)
    
    # Find contours
    cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    
    # Create a blank white mask
    mask = np.zeros(image.shape, dtype='uint8')
    mask.fill(255)
    
    # Iterate thorugh contours and filter for ROI
    for c in cnts:
        area = cv2.contourArea(c)
        if area < 15000:
            x,y,w,h = cv2.boundingRect(c)
            cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
            mask[y:y+h, x:x+w] = original_image[y:y+h, x:x+w]
    
    cv2.imshow("mask", mask)
    cv2.imshow("image", image)
    cv2.imshow("dilate", dilate)
    cv2.imshow("thresh", thresh)
    cv2.imshow("result", image)
    cv2.waitKey(0)
    

    【讨论】:

    • 谢谢!扩张然后找到文本本身的边界框非常直观。我想知道如果文本以某种方式触及多边形的边缘(或几乎没有触及它)是否会成为问题。然后对文本进行扩张,可能没有轮廓,因为文本将连接到白色背景。
    • 如果文本靠近边缘,您可能会遇到问题,因为它会与外部合并。如果文本连接到背景,将很难找到 ROI
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    相关资源
    最近更新 更多