一. 本文主要是在给出拉普拉斯锐化算子公式的情况下,在matlab上实现代码设计。拉普拉斯算子是最简单的各向同性微分算子,有几种常用的滤波模板,本文使用的是八邻域模板,如下所示
image.png
其对应的计算公式为:
image.png
因此最后得到的锐化后的图像表示为:
image.png
其中,g(x,y)是输出图像,f(x,y)是原图像,c是常数,取为1.
二. 代码实现如下
%拉普拉斯算子锐化滤波
%M,N是滤波器的模板,为方便,应为同型奇数,如3x3,5x5
function dstImg=laShapeFilter(oriImg,M,N)
[m,n,~] = size(oriImg);
dstImg = zeros(m,n);
%扩展
extendOriImg = zeros(m+M-1,n+N-1);
start = fix(M/2);
for i = 1:m
for j = 1:n
extendOriImg(i+start,j+start) = oriImg(i,j);
end
end
sum = 0;
%算法的执行,逐行扫描
for i = start+1:m+start
for j = start+1:n+start
for ii = -start:start
for jj = -start:start
if (ii==0) && (jj==0)
sum = sum + 8 * extendOriImg(i+ii,j+jj);
else
sum = sum - extendOriImg(i+ii,j+jj);
end
end
end
dstImg(i-start,j-start) = sum;
sum = 0;
end
end
测试编写好的之后的函数
close all;
clear all;
oriImg = imread('your own image path');
oriImg = im2double(oriImg);
fImg = laShapeFilter(oriImg,3,3);
% 标定图像到0-255
fm = fImg - min(min(fImg));
gImg = uint8(255 * (fm/max(max(fm))));
%原图像和拉普拉斯处理后的图像相加得到锐化后的图像
fImg = im2double(fImg);
dstImg = oriImg + fImg;
subplot(2,2,1);imshow(oriImg);title('原图像');
subplot(2,2,2);imshow(fImg);title('未标定后的图像');
subplot(2,2,3);imshow(gImg);title('标定后的图像');
subplot(2,2,4);imshow(dstImg);title('锐化后的图像');
结果如下:
image.jpg
观测结果可知,图像表面的细节明显被锐化增强了,同时背景色调也很好的保留了。
网友评论