I=imread('D:\zxc.png'); %读入原始图像
I=rgb2gray(I); %将真彩色图像转化为灰度图像
[m,n]=size(I); %确定图片的的长和宽
r=m+2; %把图片的长和宽各加2
c=n+2; b=zeros(r,c); %定义二维数组b,长、宽比I各多2,成为镜框的尺寸
g=zeros(m,n); %定义滤波后的数组
d=zeros(3); %定义三阶方阵d,为临时矩阵
t=[-1 -1 -1;-1 8 -1;-1 -1 -1]; %定义拉普拉斯算子
Result=zeros(3); %定义三阶方阵Result,为运算结果矩阵
%原图像矩阵处理,做一个"像框"
b(2:m+1,2:n+1)=I; %把原图的矩阵放到新的矩阵b中心,它的第一行、最后一行、第 一列、最后一列都是0,即原图矩阵周围有一圈0的边缘,好像给图像加一个像框
b(1,:)=b(2,:); %把第二行的值赋给第一行
b(r,:)=b(r-1,:); %把倒数第二行的值赋给最后一行
b(:,1)=b(:,2); %把第二列的值赋给第一列
b(:,c)=b(:,c-1); %把倒数第二列的值赋给最后一列
%用拉普拉斯算子进行滤波
for i=1:m
for j=1:n
d=b(i:i+2,j:j+2); %从b矩阵中依次取出三阶方阵,赋值给临时矩阵d
Result=d.*t; %临时矩阵与拉普拉斯算子点乘,赋值给结果矩阵d
g(i,j)=sum(sum(Result)); %结果矩阵中"十"字线上元素相加,赋值给输出矩阵中相 应的位置,即临时矩阵中心元素所对应的位
end
end
thresh=2.6*mean2(abs(g)); %设定阈值将图像二值化使边缘清晰
J=repmat(logical(uint8(0)),m,n); %创建数组
J(find(g>thresh))=1; %阈值判断二值化
figure,subplot(2,2,1),imshow(I);title('原始图像'); %显示原图像
subplot(2,2,2),imshow(J); title('拉普拉斯边缘检测后的图像 '); %显示拉普拉斯边缘检测后的图像
subplot(2,2,3),imshow(g); title ('将拉普拉斯边缘检测二值化后的图像')