MATLAB中的拉普拉斯图像滤波与锐化图像

时间:2016-04-18 07:45:28

标签: image matlab image-processing filter

我试图“翻译”Gonzalez和Woods(第2版)中关于拉普拉斯滤波器的内容。

我已经阅读了图片并创建了过滤器。但是,当我尝试显示结果时(通过减法,因为-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

1 个答案:

答案 0 :(得分:5)

我有一些提示:

  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,过滤图像,通过使用过滤结果(通过拉普拉斯算子)减去图像来锐化结​​果,然后然后转换回uint8 im2uint8
  4. 您还提供了一个指向您尝试模仿的管道的链接:http://www.idlcoyote.com/ip_tips/sharpen.html

    您的代码和链接之间的差异是:

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

      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