【问题标题】:Laplacian Image Filtering and Sharpening Images in MATLABMATLAB 中的拉普拉斯图像过滤和锐化图像
【发布时间】:2016-08-09 20:15:33
【问题描述】:

我正在尝试“翻译”冈萨雷斯和伍兹(第 2 版)中提到的关于拉普拉斯滤波器的内容。

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

我认为主要原因是“缩放”。但是,我不确定该怎么做。据我了解,一些在线资源说缩放只是使值在0-255之间。从我的代码中,我看到这些值已经在该范围内。

我真的很感激任何指点。

下面是我使用的原图:

以下是我的代码,以及生成的锐化图像。

谢谢!

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');

【问题讨论】:

  • 下次请务必使用matlab 标记您的问题。这样你的问题就会得到更多的曝光。
  • 对那个 rayryeng 感到抱歉。其实我以为我已经做到了,但是看到你的消息后,我一定忘记了。再次感谢!
  • 完全没问题。希望我的回答对您有所帮助(下)。
  • 非常感谢您编辑我的帖子@rayryeng。以后我问的时候会尽量遵循这个标准!

标签: image matlab image-processing filter


【解决方案1】:

我有一些建议给你:

  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');

我现在得到了这个数字......这似乎与链接中看到的数字一致:

【讨论】:

  • 非常感谢@rayryeng !!!还要感谢有关不要过早转换为 uint8 的提示,这是非常有用的东西。抱歉,我没有包含图像,我的错...我会尝试使用我的图像,看看效果如何。非常感谢!
  • @Alfian 没问题 :) 许多刚接触锐化的人往往会错过实施细节中的某些微妙之处……Gonzalez 和 Woods 对此视而不见。我上面的提示来自多年的经验。祝你好运!
  • 嗨@rayryeng ...我尝试了代码,但结果似乎令人愉悦。难道还是因为缩放? (试图阅读 Gonzalez 和 Woods 的结尾,3.4.1 的结尾......但似乎无法弄清楚他的意思......)我提供了结果的 URL,以及原始图像供你参考。我将尝试将代码粘贴到以下评论中:fsktm.upm.edu.my/~alfian/moon.png - 图片fsktm.upm.edu.my/~alfian/results.png
  • clc;关闭所有; % 以双精度读取图像,并定义拉普拉斯算子 a = im2double(rgb2gray(imread('e:\moon.png')));圈= [1 1 1; 1 -8 1; 1 1 1]; % 执行过滤 resp = imfilter(a, lap); % 没有指定“conv”,因为不需要 % 从原始图像中减去锐化 = a - resp; % 应该与 imsubtract(a, resp) 相同吗?锐化 = im2uint8(锐化);数字;子图(1,3,1);imshow(a); title('原图');子图(1,3,2);imshow(锐化); title('锐化的图像');子图(1,3,3);imshow(resp);标题('拉普拉斯');
  • 主要指的是这里所做的工作 - idlcoyote.com/ip_tips/sharpen.html(尽管作者使用了 IDL)
猜你喜欢
  • 2012-12-03
  • 2017-01-29
  • 2021-09-09
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多