【问题标题】:Remove false text regions from an image从图像中删除虚假文本区域
【发布时间】:2024-05-19 16:10:01
【问题描述】:

我正在做一个项目来检测图像中的文本。到目前为止,我已经能够隔离候选文本区域。我在计数器的边界框内使用了纵横比、轮廓区域和白色像素计数的一些阈值来删除非文本区域。但是我不能为这些参数给出太小的阈值,因为有些图像的字体很小。仍然存在一些非文本区域。我读到 Stroke Width Transform 是这个问题的解决方案,但它很复杂。有没有其他方法可以删除这些非文本区域? 想过用文字的曲线形状来区分区域,但想不出具体的实现方式。

这是一个示例图像

识别区域

【问题讨论】:

  • 获取轮廓并过滤区域以去除小的无关区域。

标签: python image opencv image-processing computer-vision


【解决方案1】:

您可以使用简单的轮廓区域过滤来去除噪声。这个想法是找到轮廓,使用cv2.contourArea() 过滤,然后将有效轮廓绘制到空白蒙版上。为了在没有噪声的情况下重建图像,我们将输入图像与掩码进行逐位运算以得到我们的结果。

要移除的噪音以绿色突出显示

结果

代码

import cv2
import numpy as np 

# Load image, create blank mask, grayscale, Otsu's threshold
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Find contours and filter using contour area
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 250:
        cv2.drawContours(mask, [c], -1, (255,255,255), -1)

# Bitwise and to reconstruct image
result = cv2.bitwise_and(image, mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()

注意:如果您知道文本将是黄色的,另一种方法是使用颜色阈值来隔离文本。您可以使用this HSV color thresholder script 来确定下限/上限

【讨论】:

  • 感谢您的回答。如果与非文本区域相比字体大小更大,则此方法非常有效。但是如果字体更小怎么办?那我就不能使用阈值了。
  • 您可以找到平均轮廓值并将其用作动态阈值。此外,您可以通过使用 Otsu 的阈值动态计算阈值来对图像进行二值化,从而改进二值图像。另一个想法是 morph close 将文本连接在一起,使它们形成单个轮廓,这将有助于在过滤时增加轮廓区域
最近更新 更多