【问题标题】:How to separate foreground text from noisy background in Python?如何在 Python 中将前景文本与嘈杂的背景分开?
【发布时间】:2020-03-03 11:14:38
【问题描述】:

我正在尝试从这张图片中提取文本

.

我尝试使用 OpenCV 调整对比度和亮度、平滑(例如 GaussianBlur、中值模糊)和阈值技术(例如 Otsu),仍然有很多剩余噪声。

还有什么我可以尝试的吗?

【问题讨论】:

  • 简单。正文内容为:Birthplace LONDON, UNITED KINGDOMResidence MILL BAY, BRITISH COLUMBIA :D
  • @jonathan.scholbach 是的,我使用阈值方法将其转换为二值图像,结果并不好。背景噪音变黑。
  • 请始终显示您的代码。你用了什么阈值方法。有几种。也许您还需要使用一些形态学和/或噪声过滤。

标签: python image opencv image-processing filtering


【解决方案1】:

如果需要更通用的解决方案,请继续阅读。否则,您可以参考 nathancy 的答案,或本网站中的许多其他答案。


我认为

从这张图片中提取文字

表示您希望将此图像中的文本作为字符串或文本的 ROI。

这称为 OCR(光学字符识别),是一个非常复杂的深度学习问题,专门针对您发布的图像类型(嘈杂、低清晰度、低动态范围等)。如果您正在寻找一个可以开箱即用的普通 OpenCV 库,那么据我所知,没有。

查看这些链接以获取源代码和解释 -

  1. OCR with pytesseract
  2. Text ROI detection using EAST

【讨论】:

    【解决方案2】:

    您可以尝试结合使用高斯模糊、阈值处理和形态学运算来隔离文本。这是一个管道

    模糊-> 阈值-> 打开-> 膨胀-> 按位与

    import cv2
    
    image = cv2.imread('1.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (7,7), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,2))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
    
    # Repair text
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
    dilate = cv2.dilate(opening, kernel, iterations=2)
    
    # Bitwise-and with input image
    result = cv2.bitwise_and(image,image,mask=dilate)
    result[dilate==0] = (255,255,255)
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('opening', opening)
    cv2.imshow('dilate', dilate)
    cv2.imshow('result', result)
    cv2.waitKey()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多