使用OpenCV去除噪点

5
我正在尝试使用openCV从输入图像中检测文本。为此,我需要从图像中去除噪声成分。我所使用的标准是,如果某些组件的像素计数小于15,则将该特定组件消除。
例如,假设以下提供的图像作为函数的输入: input image 1 Input image 2 正如可以看到的那样,两个图像都包含许多不必要的噪点,特别是第一个图像。
因此,如果有人能够建议实现这一目标的可行方法,将不胜感激。

文本看起来也像是噪音。请参见第一张图片中的“从数据中学习”。 - Abid Rahman K
是的,我知道。实际上,“从数据中学习”并不是必需的,它只是外边框的颜色。在后期阶段,可以获得填充了纯色的“从数据中学习”。因此,暂时可以将该特定文本视为噪音。事实上,在第一张图片中,几乎需要消除所有内容。在第二种情况下,水平的“从数据中学习”是有用的,并且符合我们的要求。 - Koustav
侵蚀或膨胀,开运算,闭运算?你试过这些吗? - Seçkin Savaşçı
我已经尝试过腐蚀和膨胀,但在这种情况下,我的文本也被篡改了。我还尝试了中值滤波器。但是在这种情况下,实际的文本也变得太模糊了。 - Koustav
只是一个天真的建议:字母对齐,文本行几乎呈现出裸码的形式。这不是你噪音的情况。你能利用这些特点吗? - Quentin Geissmann
1个回答

2

好的,抱歉但这不是用c编写的,也没有使用opencv,然而我相信在opencv中一定可以进行标注,只是我还没有使用过......所以这可能有所帮助......基本上的想法是:

  1. 找到并标记图像中所有单独的斑点
  2. 删除所有不符合某些约束条件(大小、形状)的斑点

在这里,我使用python中的scipy来实现此功能,但仅适用于大小(不包括形状,虽然这很容易并且可以消除第一幅图像中的长细线)。为使其正常工作,我们必须知道字母的可接受尺寸范围——然而,在标记后,您可以通过查看平均斑点大小来确定这一点。您仍然可能会得到字母大小的误报,但这些可能可以通过观察它们是否落在某些密集斑点区域的特定区域之外来消除(因为文本在空间上是规则的)......此外,最小句子长度可能是一个强大的约束。

无论如何,下面是代码:

import scipy
from scipy import ndimage

im = scipy.misc.imread('learning2.png',flatten=1)
#threshold image, so its binary, then invert (`label` needs this):
im[im>100]=255
im[im<=100]=0
im = 255 - im
#label the image:
blobs, number_of_blobs = ndimage.label(im)
#remove all labelled blobs that are outside of our size constraints:
for i in xrange(number_of_blobs):
    if blobs[blobs==i].size < 40 or blobs[blobs==i].size>150:
        im[blobs==i] = 0
scipy.misc.imsave('out.png', im)

结果:

在此输入图片描述 在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接