use*_*460 3 matlab image image-processing edge-detection
我有一个噪音图像,如波纹图.假设它是高斯噪声.目前,我正在使用两个步骤来查找边缘
根据等式找到边缘
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,[]);
Run Code Online (Sandbox Code Playgroud)
典型的边缘保持平滑滤波器应该足以满足您的特定应用.这些同时消除噪声(高斯分布式I应添加......),同时尽可能保持边缘.经典的例子包括双边滤波器,Kaiming He 的Guided图像滤波器,Gastal和Oliveira的域变换滤波(我过去已成功使用)甚至各向异性扩散.
为了快速尝试,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, []);
Run Code Online (Sandbox Code Playgroud)
我们显示原始图像,然后是右侧的引导过滤结果:
一旦我们有了这个,尝试使用任何规范的边缘检测器来检测边缘.您使用的那个在找到边缘之前预先模糊图像,但是使用标准平滑并且它会错过某些边缘.因为使用Guided图像滤镜可以使我们保持边缘并且整个图像基本上没有噪声,所以我们可以在边缘平滑结果上尝试像Sobel滤镜一样简单的东西:
[Gmag,~] = imgradient(q, 'sobel');
imshow(max(Gmag(:)) - Gmag,[]);
Run Code Online (Sandbox Code Playgroud)
上面的代码用于imgradient查找图像渐变,然后我们通过反转强度显示图像,以便黑色值变为白色,白色变为黑色,如您的示例所示.
......我们得到这个:
正如你所看到的,即使存在噪音,我们仍然可以敲出许多边缘.