Canonical edge-preserving smoothing 过滤器应该足以满足您的特定应用程序。这些同时消除噪声(我应该添加高斯分布......),同时尽可能保持边缘。经典的例子包括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,请下载引导式图像过滤器代码,让我们使用它来过滤您的示例。鉴于您指向已被噪声损坏的示例图像的链接,我下载了它并在下面的代码中使用它:
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,[]);
上面的代码使用imgradient 来查找图像渐变,然后我们通过反转强度来显示图像,以便黑色值变为白色,白色变为黑色,如您的示例所示。
...我们得到这个:
如您所见,即使存在噪音,我们仍然能够敲出很多边缘。