二维函数f(x,y)的拉普拉斯算子是如下定义的二阶导数:

在离散的数字中,常常用差分来表示连续函数中的求导。所以我们对拉普拉斯算子的数字近似方法如下:
对一个3*3大小的区域,在实践中经常遇到的两种形式之一是:

又包括对角邻域的数字近似方法由下式给出:

其中,z值在下图中给出定义:

即上述两种算子模板可以分别表示为:


现在,我们想用拉普拉斯算子来判定图像的边缘。首先,我们先用拉普拉斯算子对图像滤波把图像锐化。然后,对锐化后的图像,我们有两种思路。其一,直接用拉普拉斯算子判定边缘;其二,利用类似LP算法,求出残差。
我们把图像锐化的原因是,这可以加强图像灰度突变的区域,并且减弱图像灰度区域中缓慢变化的部分。
思路其二的原因是,拉普拉斯算子滤波有低通效应,而且在数字图像中高频区域含有更多的边缘部分的信息(这是因为高频区域中图像的灰度级往往变化的很快),我们取出这个含有高频部分的残差,这就是我们想要得到的边缘。
效果如下:
原图像:

锐化图像:

思路一效果:

思路二效果:

代码如下:
pymain.m
%清屏 clear all; close all; clc; %读取图像及尺寸 img=double(imread('lena.jpg')); figure;imshow(uint8(img)); imwrite(uint8(img),'img.jpg'); %图像锐化 a=[-1,-1,-1;-1,8,-1;-1,-1,-1]; img1=imfilter(img,a,'replicate'); img2=img+img1; figure;imshow(uint8(img2)); imwrite(uint8(img2),'img2.jpg'); %直接laplacian算子判定边缘 img3=imfilter(img2,a,'replicate'); figure;imshow(uint8(img3)); imwrite(uint8(img3),'img3.jpg'); %利用LP算法判定边缘 %滤波,向下采样 [m,n]=size(img2); w=1/8*[0,1,0;1,4,1;0,1,0]; midimg=imfilter(img2,w,'replicate'); [a,b]=size(midimg); midimg=midimg(1:2:a-1,1:2:b-1); %向上采样,获取残差即锐化后图像的边缘 img4=img2-pyexpand(midimg,w); figure;imshow(uint8(img4)); imwrite(uint8(img4),'img4.jpg');
pyexpand.m
function imgexpand=pyexpand(img,w) w=w*4; [m, n]=size(img); [M, N]=size(w); w_up_left=w(1:2:M,1:2:N); w_up_right=w(1:2:M,2:2:N); w_down_left=w(2:2:M,1:2:N); w_down_right=w(2:2:M,2:2:N); img_up_left=imfilter(img,w_up_left,'replicate','same'); img_up_right=imfilter(img,w_up_right,'replicate','same'); img_down_left=imfilter(img,w_down_left,'replicate','same'); img_down_right=imfilter(img,w_down_right,'replicate','same'); imgexpand=zeros(m*2,n*2); imgexpand(1:2:m*2,1:2:n*2)=img_up_left; imgexpand(2:2:m*2,1:2:n*2)=img_up_right; imgexpand(1:2:m*2,2:2:n*2)=img_down_left; imgexpand(2:2:m*2,2:2:n*2)=img_down_right; end
浙公网安备 33010602011771号