我有一个噪音图像,如波纹图。假设它是高斯噪声。 目前,我正在使用两个步骤来找到边缘
根据等式
找到边缘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,[]);
答案 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, []);
我们显示原始图像,然后是右侧的引导过滤器结果:
一旦我们有了这个,尝试使用任何规范的边缘检测器来检测边缘。您使用的那个在找到边缘之前预先模糊图像,但是使用标准平滑并且它将错过某些边缘。因为使用Guided图像滤镜可以使我们保持边缘并且整个图像基本上没有噪声,所以我们可以在边缘平滑结果上尝试像Sobel滤镜一样简单的东西:
[Gmag,~] = imgradient(q, 'sobel');
imshow(max(Gmag(:)) - Gmag,[]);
上面的代码使用imgradient
来查找图像渐变,然后我们通过反转强度显示图像,以便黑色值变为白色,白色变为黑色,如示例所示。
......我们得到了这个:
正如你所看到的,即使存在噪音,我们仍然能够敲击很多边缘。
答案 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');
如果您使用mu
参数,您可以获得非常去噪(但图像数据丢失)的图像或非常少的去噪(但图像质量数据更加保留);
mu=40
mu=1;
*这是该方法的非数学解释。对于纯粹主义者,请检查L1正则化技术。 子>