image - MATLAB 中的拉普拉斯图像滤波和锐化图像

标签 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. 这只是一件小事,但 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 .

您还提供了一个指向您试图模仿的管道的链接: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

关于image - MATLAB 中的拉普拉斯图像滤波和锐化图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36688103/

相关文章:

MATLAB - 使用 fprintf 将输出写入 CSV 文件时出错

arrays - 如何在 Matlab 中生成乘法空间向量?

python - 将 HoughCircles 与 3 channel 输入一起使用时出错

php - 如何有效地对 600 MP 图像进行采样

html - 如何在 HTML 中将 3 个对象并排放置

image - Octave imread() 问题。我不知道为什么他们不同

jquery - 上传后隐藏div背景图片

css - 在固定宽度的 DIV 容器内调整 IMG 的边框

matlab - 是否可以防止弹出合适的弹出菜单?或者 : How to get a callback by clicking a cell, 返回行和列索引?

python - 如何使图像亮度均匀(使用 Python/PIL)