图像锐化可以实现边缘增强,凸显细节。
常用的方法有拉普拉斯算子和反锐化掩膜法,两者都可以通过滤波模板实现,非常方便简单。说到滤波模板,也就是空域滤波了,这个PPT对空域滤波的原理阐述得比较清晰:http://pan.baidu.com/s/1qWJmGoO
拉普拉斯算子的介绍:http://www.cnblogs.com/xfzhang/archive/2011/01/19/1939020.html、http://blog.csdn.net/iaccepted/article/details/41869685
反锐化掩膜法的介绍:http://blog.csdn.net/laviewpbt/article/details/8945663
拉普拉斯算子的matlab实现
思路很简单,就是获得滤波模板、高斯模糊、锐化。通过fspecial函数可以轻易获得滤波模板。fspecial函数的用法:http://blog.csdn.net/wyl_steven/article/details/6314959
fspecial只能生成3*3的模板,锐化性能有限,还需要从原理上理解怎么生产拉普拉斯模板。其实拉普拉斯算子就是一个二阶微分的公式,其滤波模板只是对公式的一种近似,为了简化运算过程,所以,拉普拉斯算子的锐化能力是非常有限的,当然你可以加大模板中心的权重,但这会导致锐化过度,违反了图像增强的原则——图像失真了。
利用filter2函数对图像进行空域滤波。
img = imread('test1.jpg');
% img = imread('test.jpg');
% Hg = fspecial('gaussian',[3 3],1);
% for channel=1:3
% img0 = img(:,:,channel);
% img0 = double(img0);
% img0 = filter2(Hg,img0); %smooth
% img(:,:,channel) = uint8(img0);
% end
figure(1)
imshow(img);title('org')
H1 = fspecial('laplacian',0.2);
% H1=[1,1,1;1,-8,1;1,1,1];
Hg = fspecial('gaussian',[3 3],0.5);
for channel=1:3
img0 = img(:,:,channel);
img0 = double(img0);
img0 = filter2(Hg,img0); %smooth
img1 = filter2(H1,img0);
img2 = img0-img1;
img(:,:,channel) = uint8(img2);
end
figure(2)
imshow(img);title('sharpen')
H1 = fspecial('laplacian',0.2);
% H1=[1,1,1;1,-8,1;1,1,1];
Hg = fspecial('gaussian',[3 3],0.5);
for channel=1:3
img0 = img(:,:,channel);
img0 = double(img0);
img0 = filter2(Hg,img0); %smooth
img1 = filter2(H1,img0);
img2 = img0-img1;
img(:,:,channel) = uint8(img2);
end
figure(3)
imshow(img);title('sharpen2')
test1.jpg:http://pan.baidu.com/s/1eQgXv14
反锐化掩膜法的matlab实现
反锐化掩膜法(USM)是一种常用的锐化算法,photoshop中就采用了这种算法。它可以说是拉普拉斯算子的加强版,算法具有相当的锐化能力与可控性。
其思路很简单:高通滤波、高频提升、合成。
高通滤波,从原始图像中提取高频成分,从而提取细节(这里可以使用拉普拉斯算子),然后对细节进行一定的增强(增益可调),最后把增强的细节叠加到原始图像中。
这样做的效果不是很好,后来又有改进的方法:
先做高斯模糊(半径可调),提取低频成分;然后把原始图像减去低频成分获得高频成分(间接提取高频);再对高频成分与阈值(阈值可调)比较,比阈值大的才进行增强(提高抗噪声性能);最后叠加。
发现,这样做的效果比较理想。
%USM算法仿真
img = imread('test.jpg');
% img = imread('test1.jpg');
channel = size(img,3);
figure(1);imshow(img);title('origin');
%USM算法
radius = 3; %模糊半径
amount = 50; %增益
threshold = max(img(:))/2; %阈值
Hg = fspecial('gaussian',[3 3],radius); %高斯核
for i=1:channel
imgcyp = img(:,:,i); %多通道分离
imgcyp = double(imgcyp);
imgl = filter2(Hg,imgcyp); %高斯模糊
imgh = imgcyp - imgl; %提取高频成分
imgh(abs(imgh)>threshold) = ... %增益
imgh(abs(imgh)>threshold) * amount;
imgcyp = imgcyp + imgh; %叠加
img(:,:,i) = uint8(imgcyp);
end
figure(2);imshow(img);title('enhanced');