【问题标题】:clean noise from an image清除图像中的噪声
【发布时间】:2012-02-29 06:58:50
【问题描述】:

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

让我们看看这个例子:

你看到的数字不是很清楚。

那么我怎样才能清除噪声和不是数字的像素,以便识别更容易。

谢谢。

【问题讨论】:

  • 你的图片很吵。如果字体始终相同且已知,您可能会有很大的优势。如果你有它,请发布一张图片,其数字与你已经发布的图片大小相同,看看这是否足以让你开始使用
  • @belisarius 谢谢,但我不明白你在说什么。是的,字体总是一样的,但它对我有什么帮助。
  • 发布一张图片,所有数字都采用该字体,比例与您上面的图片相同

标签: matlab image-processing


【解决方案1】:

让我们在 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"  

完成!

【讨论】:

    【解决方案2】:

    由于这个问题被标记为 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,我相信你会发现有几十个提交填补了空白:)

    【讨论】:

    • 您的解决方案很棒,但在 misha 的解决方案确实有效时,它不适用于其他情况。谢谢。
    • @Michael:显然在图像处理中,没有一种解决方案适合所有情况。因此,您需要调整参数以适应您的特殊情况(如二进制阈值、膨胀大小等......)
    • @Michael 另外,也许更重要的是,您应该在发布图像处理问题时提供一组测试用例。这是我们其他人可以照顾你的宇宙的唯一方式
    【解决方案3】:

    您是否从双层(两种颜色,黑色和白色)开始?还是您自己设置阈值?

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

    如果是前者,那么就传统降噪而言,您将遇到困难。原因是许多降噪方法利用了噪声和实际自然图像之间统计特性的区别。通过阈值化,这种区别基本上被破坏了。

    编辑

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

    但无论如何,这是我的处理方式:

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

    绿色通道:

    模糊(5x5 高斯):

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

    最终结果:

    您可以看到中间 6 和 9 的空隙已经消失。不幸的是,我无法让左边三分的空隙消失——它实在是太大了。以下是导致此问题的原因:

    • 图像顶部的线条比 3 的某些部分要暗得多。如果使用阈值去除线条,则会产生间隙。如果您以某种方式删除该线(例如通过更积极的裁剪),就 3 而言,阈值结果会好得多。
    • 另外,中间的2和6是一起跑的。需要进行大量阈值处理,以防止它们在阈值处理后形成相同的斑点。

    【讨论】:

    • @misha 感谢您的回复。原始图像为 RGB 比例,我将其转换为黑白。如果我的图像是 RGB 比例而不是黑白,它对我有什么帮助。再次感谢。
    • 如果您的原始图像是 RGB,那么您可以执行颜色通道操作和自适应中值滤波等操作来减少噪声的影响。如果你发布你的 RGB 图片会更容易解释,所以请上传并告诉我。
    • @misha 非常感谢您的帮助。我现在正在工作,所以我稍后会发布 RGB 图像。我家的电脑上有。非常感谢。
    • @misha 如何选择要处理的颜色?以及我需要如何使用 5x5 高斯来模糊图像?如您所见,我的 Matlab 技能不是很高,所以如果您能详细说明,那就太好了。非常感谢您的帮助。
    • 您可以通过目测选择颜色通道。绿色通常是一个安全的选择,因为它是执行灰度转换时的主要颜色(人眼对绿色最敏感)。至于高斯滤波,试试这个链接:dsprelated.com/groups/matlab/show/2521.php
    【解决方案4】:

    我认为你可以做两件事来让它们更容易被检测到:

    1. 删除小于特定像素数的补丁(这将删除数字集之间的斑点)
    2. 数字应该是“闭合”形式,因此您需要一种算法来检测应更改为黑色的像素(在每个数字的顶部),以便“闭合”数字“形状”。

    您还具有作为噪声信号一部分的线性特征,可以通过边缘/线检测来检测。

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

    【讨论】:

    • 我不是 Matlab 专家,所以如果您能更具体一些,我将不胜感激。我应该使用哪个函数来删除小于一定像素数的补丁。谢谢。
    • @michael 注意删除小元素只会处理数字之间的点。其余的噪音是最大的问题,需要更多的思考。
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2023-04-05
    • 2014-05-22
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多