在图像增强中,平滑是为了消除图像中噪声的干扰,或者降低对比度,与之相反,有时为了强调图像的边缘和细节,需要对图像进行锐化,提高对比度。
图的边缘是指在局部不连续的特征。
简要介绍一下原理:
拉普拉斯锐化图像是根据图像某个像素的周围像素到此像素的突变程度有关,也就是说它的依据是图像像素的变化程度。我们知道,一个函数的一阶微分描述了函数图像是朝哪里变化的,即增长或者降低;而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。那么据此我们可以猜测出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。
或者用官方点的话说:当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,此中心像素的灰度应被进一步降低,当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,此中心像素的灰度应被进一步提高,以此实现图像的锐化处理。
应用:
运用拉普拉斯可以增强图像的细节,找到图像的边缘。但是有时候会把噪音也给增强了,那么可以在锐化前对图像进行平滑处理。
下面我们来推导二阶微分与像素的关系:
先看一阶偏微分和推出的二元函数微分:
一阶微分法能够用来检测边缘是否存在。
那么二阶微分法,也就是拉普拉斯算子就可以确定边缘的位置。(有的文章中称下式为拉普拉斯掩膜中心系数)
这样可以找到一个模板矩阵:
这个被称为四邻域也就是上面的二阶微分法
这个是八邻域。
【注】从上面的两种模板中就可以看出,如果一个黑色平面中有一个白点,那么模板矩阵可以使这个白点更亮。由于图像边缘就是灰度发生跳变的区域,所以拉普拉斯模板对边缘检测很有用。
八邻域的表示法为:
将算得的值替换原(x,y)处的像素值,可以得到类似边界的地方,然后根据下式得到锐化图像:
话不多说,上代码(matlab编译):
自己实现:
%拉普拉斯算子锐化图像,用二阶微分
%四邻接g(x,y)=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)
clear
clc
I1=imread('D:\BingZhouWork\Image\');
I=im2double(I1);
[m,n,c]=size(I);
A=zeros(m,n,c);
%分别处理R、G、B
%先对R进行处理
for i=2:m-1
for j=2:n-1
A(i,j,1)=I(i+1,j,1)+I(i-1,j,1)+I(i,j+1,1)+I(i,j-1,1)-4*I(i,j,1);
end
end
%再对G进行处理
for i=2:m-1
for j=2:n-1
A(i,j,2)=I(i+1,j,2)+I(i-1,j,2)+I(i,j+1,2)+I(i,j-1,2)-4*I(i,j,2);
end
end
%最后对B进行处理
for i=2:m-1
for j=2:n-1
A(i,j,3)=I(i+1,j,3)+I(i-1,j,3)+I(i,j+1,3)+I(i,j-1,3)-4*I(i,j,3);
end
end
B=I-A;
imwrite(B,'','tif');
imshow('D:\BingZhouWork\Image\');title('不清晰图像');figure
imshow('');title('得到的清晰图像')
用matlab自带的fspecial函数实现:
%matlab直接调用拉普拉斯方法
clear
clc
f=imread('D:\BingZhouWork\Image\');
f2=im2double(f); %将f转换归一化的double类图像,然后进行滤波
w=fspecial('laplacian',0);
g1=imfilter(f,w,'replicate');
g=f2-g1;
imshow(f);figure
imshow(g);
图像锐化:
本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注