gpt4 book ai didi

c++ - 如何从图像中分离噪声和文本以进行 OCR 预处理

转载 作者:行者123 更新时间:2023-11-28 04:53:51 26 4
gpt4 key购买 nike

我正在对电视镜头中的字幕应用 OCR。 (我正在使用带 C++ 的 Tesseact 3.x)我正在尝试拆分文本和背景部分作为 OCR 的预处理。

这是原图:

enter image description here

然后,预处理图像:

enter image description here

OCR结果为:Sicemn clone

如上图所示,字母周围有一些“雾”,妨碍了 OCR 模块正常工作。

是否有任何方法可以通过编程方式识别那些“雾”以将其移除,或者进行一些图像处理以从预处理图像中移除/减少它?

由于预处理逻辑经过大量优化以处理不同的图像,我宁愿找到一种方法来“清理”预处理图像,而不是修改预处理逻辑(因为优化此图片会影响其他图片)

非常欢迎任何建议。


更新

显然,sixela 的回答很好,并且适用于大多数情况。它不起作用的情况是背景还包括相似颜色的文本

不工作的例子:

enter image description here

结果示例:

enter image description here

从表面上看,高斯滤波器似乎会在此类镜头中引起问题。这意味着,不同的镜头可能需要不同的方法。

最佳答案

通过使用形态学操作和阈值处理,我设法获得了更清晰(不完美)的图像。

方法如下:

  1. 我首先将原始图像转换为灰度
  2. 应用高斯模糊(9x9 内核)对灰度图像进行去噪
  3. Top Hat Morphological operation (3x3 kernel)得到白色文本
  4. Otsu 阈值法
  5. 膨胀
  6. 反转二进制阈值以获得黑色的白色文本

最终得到了如下图

enter image description here

作为 OCR 结果,它给出了这段文字:“既然你不知道”

PS:当然可以通过调整参数(例如内核大小)来改善此结果,但我希望它能为您提供指导。我在 Python 中使用 OpenCv 来快速尝试这些方法。

import cv2

image = cv2.imread('./inputImg.png', 0)
imgBlur = cv2.GaussianBlur(image, (9, 9), 0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
imgTH = cv2.morphologyEx(imgBlur, cv2.MORPH_TOPHAT, kernel)
_, imgBin = cv2.threshold(imgTH, 0, 250, cv2.THRESH_OTSU)

imgdil = cv2.dilate(imgBin, kernel)
_, imgBin_Inv = cv2.threshold(imgdil, 0, 250, cv2.THRESH_BINARY_INV)

cv2.imshow('original', image)
cv2.imshow('bin', imgBin)
cv2.imshow('dil', imgdil)
cv2.imshow('inv', imgBin_Inv)

cv2.imwrite('./output.png', imgBin_Inv)
cv2.waitKey(0)

在此之后,我尝试使用以下命令在 Tesseract 上输出图像:

tesseract output.png stdout

关于c++ - 如何从图像中分离噪声和文本以进行 OCR 预处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com