【问题标题】:How to detect the noise type and remove it from image matrix如何检测噪声类型并将其从图像矩阵中删除
【发布时间】:2019-05-16 04:11:18
【问题描述】:

我有一个图像矩阵,我想要一种方法来检测噪声类型,然后使用 MATLAB 找到一个过滤器来去除该噪声。

我的问题:我绘制了图像的直方图,它看起来与盐和纸张噪声的直方图相同(我的图像只有三个像素的噪声)。我尝试使用中值滤波器去除噪点,但它改变的图像不仅仅是去除噪点。

1   1   1   1   1   1   1   1   1 
1  100 100 100 100 100  1   1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1  100 100  1  100
1  100 100  1   1  100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1   1   1   1   1
1  100 100  1   80  1   1   1   90

【问题讨论】:

  • 我已删除您对检测边缘的帮助请求,因为这与主要问题无关。请将每个问题保留在一个主题上。见How to Ask

标签: matlab image-processing filtering noise


【解决方案1】:

中值过滤器会像这样切掉图像的角落。鉴于您的图像或多或少是二进制的,去除噪点的一种简单方法在这种情况下是去除孤立的像素:被比自身低得多的值包围的像素。

这可以通过图像处理工具箱在 MATLAB 中使用形态学开环 (imopen) 轻松完成:

img = [1   1   1   1   1   1   1   1   1
       1  100 100 100 100 100  1   1   1
       1  100 100 100 100 100 100  1   1
       1  100 100  1   1  100 100  1  100
       1  100 100  1   1  100 100  1   1
       1  100 100 100 100 100 100  1   1
       1  100 100 100 100 100 100  1   1
       1  100 100  1   1   1   1   1   1
       1  100 100  1   80  1   1   1   90];
img = padarray(img,[1,1]); % proper boundary conditions needed
img = max(imopen(img,[1,1]),imopen(img,[1;1]));
img = img(2:end-1,2:end-1); % remove padding again

我们使用了两个开口:一个带有 SE [1,1],一个带有 SE [1;1]。它们中的任何一个都可能删除 1 像素粗线,但两者都不会删除任何线。因此,我们取两个结果中的最大值:如果两个过滤器都删除了像素,它将保持被删除,但如果只有一个过滤器删除了它,我们希望保留这个像素(它属于一条线)。

还有其他识别孤立像素的方法,但这种方法基于工具箱中的现有功能实现起来非常简单。

【讨论】:

  • 我怎样才能确定这张图片的噪点种类和类型?我不认为它的盐和纸噪音
  • @LounaAkkad:您知道图像有什么噪音,因为您分析了它是如何获得的。您分析噪声的来源(理论上或实验上)并了解它们的特征。我不知道您的图像是如何获得的(似乎经过了很多处理),因此无法告诉您任何有关噪点的信息。
  • 其实我不知道我有这个矩阵,并要求猜测噪音的种类并将其移除,所以我猜它是一种脉冲噪音,但我想确定
  • @LounaAkkad:是的,这看起来像脉冲噪声,因为只有几个像素受到影响,而且影响很大。
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 2018-07-20
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多