找到噪声图像边缘的最佳方法

时间:2015-08-13 18:09:24

标签: image matlab image-processing edge-detection

我有一个噪音图像,如波纹图。假设它是高斯噪声。 目前,我正在使用两个步骤来找到边缘

  1. 使用高斯滤镜G
  2. 平滑图像
  3. 根据等式

    找到边缘

    g = 1 /(1 +β∇(I * G)^ 2)

  4. 其中G是高斯滤波器。 β是控制噪音水平的重量。

    然而,高斯滤波器是图像边缘丢失的原因。我想找到一个更好的方法来保存边缘信息。您能否向我建议找到该图像边缘的最佳方法?

    这是我上述步骤的结果

    enter image description here

    这是我正在处理的添加了噪音的图像:

    enter image description here

    为了获得优势,这是我写的MATLAB代码:

    beta=0.01;
    G = fspecial('gaussian',[3 3],1);
    I_G = conv2(I,G,'same');
    [Gx,Gy] = gradient(I_G);
    NormGrad = sqrt(Gx.^2 + Gy.^2); 
    g = 1./ (1 + beta* NormGrad.^2);
    imshow(g,[]);
    

2 个答案:

答案 0 :(得分:5)

Canonical edge-preserving smoothing过滤器应该足以满足您的特定应用。这些同时消除噪声(高斯分布式I应添加......),同时尽可能保持边缘。经典示例包括bilateral filter,Kaiming He的Guided image filter,Gastal和Oliveira的Domain Transform filtering(我过去成功使用过)甚至anisotropic diffusion

为了快速尝试,Guided图像滤镜现在作为官方功能包含在MATLAB R2014a中通过imguidedfilter功能成为图像处理工具箱的一部分。如果您没有MATLAB R2014a或更高版本,那么您可以通过此链接下载代码的原始MATLAB源代码:http://kaiminghe.com/eccv10/guided-filter-code-v1.rar,但您可以从我上面链接到您的主网站上获取此代码。

假设您没有R2014a,请下载Guided图像过滤器代码,然后使用它来过滤您的示例。鉴于您链接到已被噪声损坏的示例图像,我下载了它并在下面的代码中使用它:

I = im2double(imread('http://i.stack.imgur.com/ACRE8.png')); %// Load in sample image that was corrupted by noise
r = 2; %// Parameters for the Guided image filter
eps = 0.1^2;

%// Filter the image, using itself as a guide
q = guidedfilter(I, I, r, eps);

%// Show the original image and the filtered result
figure;
subplot(1,2,1); imshow(I, []);
subplot(1,2,2); imshow(q, []);

我们显示原始图像,然后是右侧的引导过滤器结果:

enter image description here

一旦我们有了这个,尝试使用任何规范的边缘检测器来检测边缘。您使用的那个在找到边缘之前预先模糊图像,但是使用标准平滑并且它将错过某些边缘。因为使用Guided图像滤镜可以使我们保持边缘并且整个图像基本上没有噪声,所以我们可以在边缘平滑结果上尝试像Sobel滤镜一样简单的东西:

[Gmag,~] = imgradient(q, 'sobel');
imshow(max(Gmag(:)) - Gmag,[]);

上面的代码使用imgradient来查找图像渐变,然后我们通过反转强度显示图像,以便黑色值变为白色,白色变为黑色,如示例所示。

......我们得到了这个:

enter image description here

正如你所看到的,即使存在噪音,我们仍然能够敲击很多边缘。

答案 1 :(得分:3)

为了向@ rayryeng的完全有趣的答案添加另一种方法,我将向您展示如何使用众所周知的Split-Bregman Total变换算法去噪。

此算法强制图像具有“可能的灰度级别”*。因此,它会对图像进行去噪(因为类似的gary-level将被转换为相同的图像),但它会保留边缘。

Matlab没有实现电视,但您可以查看this implementation

使用样本(希望代码可以自我解释)

N = 256; n = N^2;

% Read image;
g=double(imread('http://i.stack.imgur.com/ACRE8.png'));
%fill it with zeroes to make a NxN image
sz=size(g);
img=zeros(N);
img(1:size(g,1),1:size(g,2))=g;
g=img;

% the higher this parameter is, the stronger the denoising
mu = 6;

% denoise 
g_denoise_atv = SB_ATV(g,mu);
%prepare output
denoised=reshape(g_denoise_atv,N,N);
denoised=denoised(1:sz(1),1:sz(2));

% edges
[Gmag,~] = imgradient(denoised, 'sobel');

subplot(131); imshow(g(1:sz(1),1:sz(2)),[]);title('Original');
subplot(132); imshow(denoised,[]);title('Denoised');
subplot(133); imshow(max(Gmag(:)) - Gmag,[]);title('Edges');

enter image description here]

如果您使用mu参数,您可以获得非常去噪(但图像数据丢失)的图像或非常少的去噪(但图像质量数据更加保留);

mu=40

enter image description here

mu=1;

enter image description here

*这是该方法的非数学解释。对于纯粹主义者,请检查L1正则化技术。