我需要知道如何使用Matlab清除图像中的噪点。
让我们看一下这个例子:
如你所见,数字看起来不太清楚。
所以如何清除噪音和非数字的像素,以便识别更容易。
感谢。
答案 0 :(得分:22)
让我们一步一步地在Mathematica中做到:
(*first separate the image in HSB channels*)
i1 = ColorSeparate[ColorNegate@yourColorImage, "HSB"]
(*Let's keep the B Channel*)
i2 = i1[[3]]
(*And Binarize it *)
i3 = Binarize[i2, 0.92]
(*Perform a Thinning to get the skeleton*)
i4 = Thinning[i3]
(*Now we cut those hairs*)
i5 = Pruning[i4, 10]
(*Remove the small lines*)
i6 = DeleteSmallComponents[i5, 30]
(*And finally dilate*)
i7 = Dilation[i6, 3]
(*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)
最后,您可以应用某种形式的OCR来识别这些数字。不幸的是,MATLAB没有相当于Mathematica中TextRecognize[]
的内置函数......同时,看看File Exchange,我相信你会发现几十个提交填补空白:)< / p>
答案 2 :(得分:7)
你是从双层(双色,黑色和白色)开始的吗?或者你自己对它进行了限制?
如果是后者,您可能会发现在阈值之前更容易进行降噪。在这种情况下,请上传阈值之前的图像。
如果是前者,那么就像传统的降噪一样,你将度过难关。原因是许多降噪方法利用了噪声和实际自然图像之间的统计特性的区别。通过阈值处理,这种区别基本上就被破坏了。
修改强>
好的,从技术上讲,你的图像并不是真的很吵 - 它很模糊(字母相互碰撞)并且有背景干扰。
但无论如何,这是我如何处理它:
绿色频道:
模糊(5x5高斯):
阈值图像(我在GIMP中使用了约93的阈值):
最终结果:
你可以看到中间6和9的差距消失了。不幸的是,我无法让左边3的间隙消失 - 它太大了。以下是导致此问题的原因:
答案 3 :(得分:0)
我认为你可以做两件事来使它们更容易被发现:
您还可以使用线性特征作为噪声信号的一部分,可通过边缘/线路检测进行检测。
检测连续的“区域”并计算紧凑度或长度/高度等特征也可能有助于确定要保留哪些结构......