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

问题描述 投票:0回答:1

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

这是原始图片:

enter image description here

并且,预处理图像:

enter image description here

OCR结果是:Sicemn clone

如上图所示的预处理图像,字母周围留有一些“雾”,阻止OCR模块正常工作。

有没有办法以编程方式识别那些“雾”来删除,或者做一些图像处理来从预处理的图像中删除/减少它?

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

任何建议都是非常受欢迎的。


更新

显然,sixela的答案很棒,并且适用于大多数情况。它不起作用的情况是背景也包括类似的文字颜色

不工作案例:

enter image description here

结果示例:

enter image description here

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

c++ image ocr tesseract
1个回答
1
投票

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

方法如下:

  1. 我开始以灰度转换原始图像
  2. 应用高斯模糊(9x9内核)对灰度图像进行去噪
  3. Top Hat形态操作(3x3内核)获取白色文本
  4. 大津阈值法
  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
© www.soinside.com 2019 - 2024. All rights reserved.