清除图像中的噪音

时间:2011-03-15 13:36:30

标签: matlab image-processing

我需要知道如何使用Matlab清除图像中的噪点。

让我们看一下这个例子:

enter image description here enter image description here

如你所见,数字看起来不太清楚。

所以如何清除噪音和非数字的像素,以便识别更容易。

感谢。

4 个答案:

答案 0 :(得分:22)

让我们一步一步地在Mathematica中做到:

(*first separate the image in HSB channels*)
i1 = ColorSeparate[ColorNegate@yourColorImage, "HSB"]

enter image description here

(*Let's keep the B Channel*)
i2 = i1[[3]]

enter image description here

(*And Binarize it *)
i3 = Binarize[i2, 0.92]

enter image description here

(*Perform a Thinning to get the skeleton*)
i4 = Thinning[i3]

enter image description here

(*Now we cut those hairs*)
i5 = Pruning[i4, 10]

enter image description here

(*Remove the small lines*)
i6 = DeleteSmallComponents[i5, 30]

enter image description here

(*And finally dilate*)
i7 = Dilation[i6, 3]

enter image description here

(*Now we can perform an OCR*)
TextRecognize@i7
-->"93 269 23"  

完成!

答案 1 :(得分:17)

由于这个问题被标记为MATLAB,我翻译了@belisarius的解决方案(我认为它优于当前接受的答案):

%# read image
I = imread('http://i.stack.imgur.com/nGNGf.png');

%# complement it, and convert to HSV colorspace
hsv = rgb2hsv(imcomplement(I));
I1 = hsv(:,:,3);                %# work with V channel

%# Binarize/threshold image
I2 = im2bw(I1, 0.92);

%# Perform morphological thinning to get the skeleton
I3 = bwmorph(I2, 'thin',Inf);

%# prune the skeleton (remove small branches at the endpoints)
I4 = bwmorph(I3, 'spur', 7);

%# Remove small components
I5 = bwareaopen(I4, 30);

%# dilate image
I6 = imdilate(I5, strel('square',2*3+1));

%# show step-by-step results
figure('Position',[200 150 700 700])
subplot(711), imshow(I)
subplot(712), imshow(I1)
subplot(713), imshow(I2)
subplot(714), imshow(I3)
subplot(715), imshow(I4)
subplot(716), imshow(I5)
subplot(717), imshow(I6)

enter image description here

最后,您可以应用某种形式的OCR来识别这些数字。不幸的是,MATLAB没有相当于Mathematica中TextRecognize[]的内置函数......同时,看看File Exchange,我相信你会发现几十个提交填补空白:)< / p>

答案 2 :(得分:7)

你是从双层(双色,黑色和白色)开始的吗?或者你自己对它进行了限制?

如果是后者,您可能会发现在阈值之前更容易进行降噪。在这种情况下,请上传阈值之前的图像。

如果是前者,那么就像传统的降噪一样,你将度过难关。原因是许多降噪方法利用了噪声和实际自然图像之间的统计特性的区别。通过阈值处理,这种区别基本上就被破坏了。

修改

好的,从技术上讲,你的图像并不是真的很吵 - 它很模糊(字母相互碰撞)并且有背景干扰。

但无论如何,这是我如何处理它:

  • 选择要使用的颜色通道(RGB是三个通道,通常一个就足够了)。我选择了绿色,因为它看起来最容易操作。
  • 模糊图像(我在GIMP中使用5x5高斯内核)
  • 使用经验确定的阈值的阈值(基本上,尝试每个阈值,直到获得一个不错的结果)。如果某些数字有差距就可以了 - 我们可以在下一步中关闭它们
  • 形态图像处理(侵蚀和膨胀)

绿色频道:

enter image description here

模糊(5x5高斯):

enter image description here

阈值图像(我在GIMP中使用了约93的阈值):

enter image description here

最终结果:

enter image description here

你可以看到中间6和9的差距消失了。不幸的是,我无法让左边3的间隙消失 - 它太大了。以下是导致此问题的原因:

  • 图像顶部的线条比3的某些部分暗得多。如果使用阈值移除线条,则会创建间隙。如果你以某种方式删除那一行(例如通过更热心的裁剪),就3而言,阈值处理结果会好得多。
  • 此外,中间2和6一起运行。需要进行大量阈值处理以防止它们在阈值处理后形成相同的斑点。

答案 3 :(得分:0)

我认为你可以做两件事来使它们更容易被发现:

  1. 删除小于一定数量像素的小块(这会删除数字组之间的点)
  2. 数字应为“封闭”形式,因此您需要一种算法来检测应更改为黑色的像素(位于每个数字的顶部)以“关闭”数字“形状”。
  3. 您还可以使用线性特征作为噪声信号的一部分,可通过边缘/线路检测进行检测。

    检测连续的“区域”并计算紧凑度或长度/高度等特征也可能有助于确定要保留哪些结构......