2016-04-18 251 views
3

我想翻译Gonzalez和Woods(第2版)中提到的关于拉普拉斯滤波器的内容。拉普拉斯图像滤波和锐化MATLAB中的图像

我已阅读图像并创建了过滤器。但是,当我尝试显示结果(通过减法,因为-ve中的中心元素),我没有像教科书中那样获得图像。

我认为主要原因是“缩放”。但是,我不确定究竟该如何做到这一点。据我所知,一些在线资源表示,缩放只是为了使值在0-255之间。从我的代码中,我看到这些值已经在该范围内。

我真的很感激任何指针。

下面是我使用的原始图像:

enter image description here

下面是我的代码,将得到的锐化图像。

谢谢!

clc; 
close all; 
a = rgb2gray(imread('e:\moon.png')); 
lap = [1 1 1; 1 -8 1; 1 1 1]; 
resp = uint8(filter2(lap, a, 'same')); 
sharpened = imsubtract(a, resp); 
figure; 
subplot(1,3,1);imshow(a); title('Original image'); 
subplot(1,3,2);imshow(resp); title('Laplacian filtered image'); 
subplot(1,3,3);imshow(sharpened); title('Sharpened image'); 

enter image description here

+0

确保您标记您的问题下次使用'matlab'。你的问题会得到更多的曝光。 – rayryeng

+0

对不起,rayryeng。其实我以为我已经做到了,但看到你的消息后,我一定忘了。再次感谢! – Alfian

+0

完全没问题。希望我的回答可以帮助你(下文)。 – rayryeng

回答

4

我对你的一些技巧:

  1. 这只是一件小事,但filter2执行相关。您实际上需要执行卷积,在执行像素邻域和内核之间的加权求和之前,将内核旋转180度。但是因为内核是对称的,所以convolution and correlation perform the same thing in this case
  2. 我建议您使用imfilter来方便过滤,因为您已经使用图像处理工具箱中的方法。它比filter2conv2快,并且利用了Intel Integrated Performance Primitives
  3. 我强烈建议您先做好double的所有工作,然后完成后再转换为uint8。使用im2double将您的图片(最有可能uint8)转换为double精度。在进行锐化时,这会保持精确度并过早铸造到uint8,然后执行减法会给您带来意想不到的副作用。 uint8将限制负值或超过255的结果,这也可能是您无法获得正确结果的原因。因此,将图像转换为double,过滤图像,通过减去带有滤波结果的图像(通过拉普拉斯算子)来锐化结果,并且然后通过im2uint8转换回uint8

你还提供了一个链接到你想模仿管道:http://www.idlcoyote.com/ip_tips/sharpen.html

你的代码和链接之间的区别是:

  1. 内核有一个正面中心。因此,1是负数,而中心是+8,你必须的过滤结果添加到原始图像。
  2. 在链接,它们的归一化响应过滤使得最小为0,最大为1。
  3. 一旦添加了过滤响应到原始图像,也使得最小为0,此归一化结果最大值为1.
  4. 您执行线性对比度增强,使强度60成为新的最小值,强度200成为新的最大值。您可以使用imadjust来执行此操作。该函数需要一个图像以及两个数组 - 第一个数组是输入的最小和最大强度,第二个数组是最小和最大值应该映射到的位置。因此,我想将输入强度60映射到输出强度0,输入强度200映射到输出强度255.确保指定的强度介于0和1之间,但是您必须将每个数量除以255如文件中所述。

这样:

clc; 
close all; 
a = im2double(imread('moon.png')); %// Read in your image 
lap = [-1 -1 -1; -1 8 -1; -1 -1 -1]; %// Change - Centre is now positive 
resp = imfilter(a, lap, 'conv'); %// Change 

%// Change - Normalize the response image 
minR = min(resp(:)); 
maxR = max(resp(:)); 
resp = (resp - minR)/(maxR - minR); 

%// Change - Adding to original image now 
sharpened = a + resp; 

%// Change - Normalize the sharpened result 
minA = min(sharpened(:)); 
maxA = max(sharpened(:)); 
sharpened = (sharpened - minA)/(maxA - minA); 

%// Change - Perform linear contrast enhancement 
sharpened = imadjust(sharpened, [60/255 200/255], [0 1]); 

figure; 
subplot(1,3,1);imshow(a); title('Original image'); 
subplot(1,3,2);imshow(resp); title('Laplacian filtered image'); 
subplot(1,3,3);imshow(sharpened); title('Sharpened image'); 

我得到现在这个数字......这似乎与中的链接看到的数字同意:

enter image description here

+0

非常感谢@rayryeng !!!也感谢关于不过早转换到uint8的提示,这是非常有用的东西。对不起,我没有包括图片,我的坏...我会尝试我的形象,看看它是怎么回事。非常感激! – Alfian

+0

@Alfian没问题:)很多新锐化的人往往会错过实现细节中的某些细节......冈萨雷斯和伍兹釉过。我上面的提示来自多年的经验。祝你好运! – rayryeng

+0

嗨@rayryeng ...我尝试了代码,但看起来结果令人满意。它可能还是由于缩放? (试图阅读冈萨雷斯和伍兹的结尾,3.4.1结束......但似乎无法弄清楚他的意思......) 我提供了结果的URL,以及原始图片供您参考。代码我会尝试粘贴在以下评论中: http://fsktm.upm.edu.my/~alfian/moon.png - 图片 http://fsktm.upm.edu.my/~alfian /results.png – Alfian