如何对简单的灰度图像进行去噪

时间:2014-12-26 08:01:41

标签: matlab image-processing

这是具有更好视觉的原始图像:我们可以在主骨架周围看到很多噪声,圆形物体,我想要将它们移除,并且不会影响主骨架。我不确定它是否叫噪音

我正在对图像进行去模糊处理,此图像是运动模糊内核,用于识别相机捕获图像时的相机运动。

ps:这个图像是一个案例的内核,我需要的是这里的一般方法。谢谢你的帮助

CVPR2014中有一篇名为“可分离内核的图像去模糊”的论文,谈到这一点,我想提取图像的主要骨架,使内核更加健壮,对不起在这里解释,因为我的英语不好< / p>

enter image description here

这里是真彩色灰度图像:

enter image description here

我希望它是这样的:

enter image description here

如何使用Matlab进行操作?

这里有一些其他内核映像:

enter image description here enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

正如 @rayryeng 所解释的那样,中值滤波是清除图像中噪声的最佳选择,我在研究图像恢复时就意识到了这一点。但是,在您的情况下,您需要做的就是清除图像中的噪点。您希望更有可能消除图像中的火花。

我只是将单个阈值应用到您的嘈杂图像中以消除火花。

试试这个:

desIm     = imread('http://i.stack.imgur.com/jyYUx.png');  % // Your expected (desired) image
nIm       = imread('http://i.stack.imgur.com/pXO0p.png');  % // Your original image
nImgray   = rgb2gray(nIm); 
T         = graythresh(nImgray)*255; % // Thereshold value
S         = size(nImgray);
R         = zeros(S) + 5;            % // Your expected image bluish so I try to close it
G         = zeros(S) + 3;            % // Your expected image bluish so I try to close it
B         = zeros(S) + 20;           % // Your expected image bluish so I try to close it
logInd    = nImgray > T;             % // Logical index of pixel exclude spark component
R(logInd) = nImgray(logInd);         % // Get original pixels without sparks
G(logInd) = nImgray(logInd);         % // Get original pixels without sparks
B(logInd) = nImgray(logInd);         % // Get original pixels without sparks
rgbImage  = cat(3, R, G, B);         % // Concatenating Red Green Blue channels
figure,
subplot(1, 3, 1)
imshow(nIm); title('Original Image');
subplot(1, 3, 2)
imshow(desIm); title('Desired Image');
subplot(1, 3, 3)
imshow(uint8(rgbImage)); title('Restoration Result');

我得到的是: enter image description here

答案 1 :(得分:1)

我唯一可以看到的是两个图像之间不同的是,在对象的周边存在一些量化噪声/误差。这类似于salt and pepper noise,消除噪音的最佳方法是使用median filtering。中值滤波器基本上分析图像中的局部重叠像素邻域,对强度进行排序,并选择中值作为每个像素邻域的输出。盐和胡椒噪声通过随机选择像素并将其强度设置为黑色(胡椒)或白色(盐)来破坏图像像素。通过使用中值滤波器,对强度进行排序会将这些噪声像素放在较低端和较高端,通过选择中值,您将获得可能存在的最佳强度。

要在MATLAB中进行中值滤波,请使用medfilt2函数。假设您已安装图像处理工具箱。如果你不这样做,那么我提出的建议是行不通的。假设你有它,你可以用以下方式调用它:

out = medfilt2(im, [M N]);

im将是imread中加载的图片,MN是要分析的像素邻域大小的行和列。通过选择7 x 7像素邻域(即M = N = 7),并直接从StackOverflow读取图像,这是我得到的结果:

enter image description here

将此图片与原始图片进行比较:

如果您还查看所需的输出,这或多或少会模仿您想要的内容。

另外,我使用的代码如下......只有三行!

im = rgb2gray(imread('http://i.stack.imgur.com/pXO0p.png'));
out = medfilt2(im, [7 7]);
imshow(out);

第一行我必须将图像转换为灰度,因为原始图像实际上是RGB。我不得不使用rgb2gray来做到这一点。第二行使用7 x 7邻域对图像执行中值滤波,最后一行使用imshow在单独的窗口中显示图像。


想自己实施中值过滤吗?

如果您想了解如何自己编写中值过滤算法,请查看我最近的帖子。提问者要求在不使用medfilt2的情况下实施过滤机制,我提供了答案。

Matlab Median Filter Code


希望这有帮助。

祝你好运!