Image 噪声图像边缘提取的最佳方法

Image 噪声图像边缘提取的最佳方法,image,matlab,image-processing,edge-detection,Image,Matlab,Image Processing,Edge Detection,我有一个噪声图像,如下图。假设它是高斯噪声。 目前,我使用两个步骤来查找边缘 使用高斯滤波器G平滑图像 根据方程求边 g=1/(1+β)∇ (I*G)^2) 其中G是高斯滤波器。β是控制噪声级的权重 然而,高斯滤波器是图像边缘丢失的原因。我想找到一种更好的方法来保存边缘信息。你能告诉我找到那张图像边缘的最佳方法吗 这是我对上述步骤的结果 这是我正在处理的添加了噪音的图像: 为了获得边缘,这是我编写的MATLAB代码: beta=0.01; G = fspecial('gaussian',[3

我有一个噪声图像,如下图。假设它是高斯噪声。 目前,我使用两个步骤来查找边缘

  • 使用高斯滤波器G平滑图像
  • 根据方程求边

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

  • 其中G是高斯滤波器。β是控制噪声级的权重

    然而,高斯滤波器是图像边缘丢失的原因。我想找到一种更好的方法来保存边缘信息。你能告诉我找到那张图像边缘的最佳方法吗

    这是我对上述步骤的结果

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

    为了获得边缘,这是我编写的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,[]);
    
    规范过滤器应该非常适合您的特定应用程序。这些同时去除噪声(高斯分布,我应该添加…),同时尽可能保持边缘。经典的例子包括:He Kaiming、Gastal和Oliveira(我在过去成功地使用过)甚至

    为了快速尝试,引导图像过滤器现在作为一个官方函数包含在图像处理工具箱中,因为MATLAB R2014a通过该函数。如果您没有MatlabR2014A或更高版本,那么您可以通过以下链接下载原始的MATLAB源代码:,但您可以从我上面链接到您的主网站上获得

    假设您没有R2014a,下载引导图像过滤器代码,让我们使用它来过滤您的示例。鉴于您指向被噪声破坏的示例图像的链接,我下载了它,并在下面的代码中使用它:

    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, []);
    
    我们显示原始图像,然后在右侧显示引导过滤结果:

    一旦我们做到了这一点,尝试使用任何标准的边缘检测器来检测边缘。您正在使用的方法在找到边缘之前会预模糊图像,但它使用标准平滑,并且会遗漏某些边缘。因为使用引导图像过滤器使我们能够保持边缘,并且整体图像基本上无噪声,所以我们可以尝试一些简单的方法,例如对边缘平滑结果使用Sobel过滤器:

    [Gmag,~] = imgradient(q, 'sobel');
    imshow(max(Gmag(:)) - Gmag,[]);
    
    上面的代码用于查找图像梯度,然后我们通过反转强度来显示图像,使黑色值变为白色,白色变为黑色,如示例中所示

    。。。我们得到这个:


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

    为了给@rayryeng非常完整和有趣的答案添加另一种方法,我将向你展示如何使用著名的Split-Bregman全变分算法去噪

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

    Matlab没有实现TV,但是可以检查

    使用示例(代码是自解释的)

    ]

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


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

    谢谢rayryeng。我看了看我的成绩和你的成绩,发现你的成绩比我的好。但是,我们需要一些证据来证明您的方法可以实现边缘保持。你知道有什么定量测量可以证明你的方法比我的方法好吗?有很多定量测量可以用来确定一个结果是否比另一个好,但这需要参考原始边缘图像。如果你没有,那么你只能定性地看待它。假设你有一个参考,你可以使用PSNR,MSE或任何相关的东西。这就是说,如果没有可比较的参考,你就无法比较我的方法和你的方法。@Benoit_11-Merci:)我使用拉普拉斯算子从分割图像(4个标签)中制作了一个参考边。您可以在或下载,如果您想自己创建。您可以在下载分割图像。希望你的方法取得了良好的效果performance@user3051460-我认为最好是你自己将我写的和安德写的进行比较,然后自己找出更好的方法。你是最好的决定者,让我们为你做比较不会让你学到任何东西。一个简单的测试可以是对梯度图像设置阈值,使其成为边缘像素,然后在两个图像之间进行SSD。峰值信噪比也是一种很好的方法,您可以在这里了解如何计算峰值信噪比:
    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');
    
    mu=40
    
    mu=1;