如何从图像中分离噪声和文本以进行 OCR 预处理
How to split noise and text from the image for preprocessing of OCR
我正在对电视镜头中的字幕应用 OCR。 (我正在使用 Tesseact 3.x w/ C++)我正在尝试拆分文本和背景部分作为 OCR 的预处理。
这是原始图片:
并且,预处理图像:
OCR结果为:Sicemn clone
如上图所示,字母周围有一些 "fog" 残留物,妨碍 OCR 模块正常工作。
是否有任何方法可以通过编程方式识别那些 "fog" 以从预处理图像中移除或对 remove/reduce 进行一些图像处理?
由于预处理逻辑经过大量优化以处理不同的图像,我宁愿找到一种方法来 "clean" 预处理图像,而不是修改预处理逻辑(因为优化此图片会影响其他图片)
非常欢迎任何建议。
更新
显然,sixela 的回答很好,并且适用于大多数情况。
它不起作用的情况是背景还包括相似颜色的文本
无效案例示例:
结果示例:
看来,高斯滤波器似乎会导致此类镜头出现问题。
这意味着,不同的镜头可能需要不同的方法。
我通过使用形态学操作和阈值处理得到了更清晰(不完美)的图像。
方法如下:
- 我首先将原始图像转换为灰度
- 应用高斯模糊(9x9 内核)对灰度图像进行去噪
- Top Hat Morphological operation (3x3 kernel)得到白色文本
- Otsu 阈值法
- 扩张
- 反转二进制阈值以获得黑色的白色文本
我终于得到了下图
作为 OCR 结果,此文本给出:"Since vou don'k"
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
我正在对电视镜头中的字幕应用 OCR。 (我正在使用 Tesseact 3.x w/ C++)我正在尝试拆分文本和背景部分作为 OCR 的预处理。
这是原始图片:
并且,预处理图像:
OCR结果为:Sicemn clone
如上图所示,字母周围有一些 "fog" 残留物,妨碍 OCR 模块正常工作。
是否有任何方法可以通过编程方式识别那些 "fog" 以从预处理图像中移除或对 remove/reduce 进行一些图像处理?
由于预处理逻辑经过大量优化以处理不同的图像,我宁愿找到一种方法来 "clean" 预处理图像,而不是修改预处理逻辑(因为优化此图片会影响其他图片)
非常欢迎任何建议。
更新
显然,sixela 的回答很好,并且适用于大多数情况。 它不起作用的情况是背景还包括相似颜色的文本
无效案例示例:
结果示例:
看来,高斯滤波器似乎会导致此类镜头出现问题。 这意味着,不同的镜头可能需要不同的方法。
我通过使用形态学操作和阈值处理得到了更清晰(不完美)的图像。
方法如下:
- 我首先将原始图像转换为灰度
- 应用高斯模糊(9x9 内核)对灰度图像进行去噪
- Top Hat Morphological operation (3x3 kernel)得到白色文本
- Otsu 阈值法
- 扩张
- 反转二进制阈值以获得黑色的白色文本
我终于得到了下图
作为 OCR 结果,此文本给出:"Since vou don'k"
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