python - 从图像中去除噪声线

标签 python opencv image-processing noise-reduction

我的图像带有一些随机线条,如下所示:
enter image description here
我想对它们进行一些预处理,以消除不需要的噪音(扭曲文字的线条),以便我可以将它们与 OCR (Tesseract) 一起使用。
我想到的想法是用膨胀来去除噪声,然后在第二步用腐 eclipse 来修复书写缺失的部分。
为此,我使用了这段代码:

import cv2
import numpy as np

img = cv2.imread('linee.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
cv2.imwrite('delatedtest.png', img)

不幸的是,膨胀效果不佳,噪声线仍然存在。

enter image description here
我尝试更改内核形状,但情况变得更糟:文字被部分或完全删除。
我还找到了一个 answer说可以通过

删除行

turning all black pixels with two or less adjacent black pixels to white.

这对我来说有点复杂,因为我是计算机视觉和 opencv 的初学者。
任何帮助将不胜感激,谢谢。

最佳答案

检测像这样的线条是 path opening被发明的。 DIPlib有一个实现(披露:我在那里实现了它)。作为替代方案,您可以尝试使用 the implementation by the authors我上面链接的论文。该实现没有 the "constrained" mode我在下面使用。

这是一个关于如何使用它的快速演示:

import diplib as dip
import matplotlib.pyplot as pp

img = 1 - pp.imread('/home/cris/tmp/DWRTF.png')
lines = dip.PathOpening(img, length=300, mode={'constrained'})

这里我们首先反转图像,因为这样可以让后面的事情变得更容易。如果不反转,请改用路径闭合。 图像:

lines

接下来我们减去线条。一个小区域开口去除了被路径开口过滤掉的线条的几个孤立像素:

text = img - lines
text = dip.AreaOpening(text, filterSize=5)

text

但是,我们现在在文本中添加了空白。填写这些内容并非易事。这是一个快速而肮脏的尝试,您可以将其用作起点:

lines = lines > 0.5
text = text > 0.5
lines -= dip.BinaryPropagation(text, lines, connectivity=-1, iterations=3)
img[lines] = 0

final result

关于python - 从图像中去除噪声线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54028493/

相关文章:

python - 如何在 Anaconda 中安装 Matplotlib 3.4.1?

python - pytest fixture 传递值

opencv - DFT 和 FFT(幅度)结果之间的差异

python - 使用 opencv videowriter python 提高视频中的图像质量

python - glpk.LPX 向后兼容性?

python - RobuSTLY 在 Python 中解析 HTML

android - 在OpenCV2.3.1中使用VideoCapture捕获android相机

python - 如何使用 OpenCV 或深度学习从平面图扫描房间轮廓数据?

python - 获取矩形 mask 的真实边界框

python - 使用opencv,tensorflow和python进行人体检测