您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 边缘提取和边缘检测matlab程序代码大全
附录Part1:对cameraman原始图像处理的仿真程序:clcclearallcloseallA=imread('cameraman.bmp');%读入图像subplot(2,4,1);imshow(A);title('原图');x_mask=[10;0-1];%建立X方向的模板y_mask=rot90(x_mask);%建立Y方向的模板I=im2double(A);%将图像数据转化为双精度dx=imfilter(I,x_mask);%计算X方向的梯度分量dy=imfilter(I,y_mask);%计算Y方向的梯度分量grad=sqrt(dx.*dx+dy.*dy);%计算梯度grad=mat2gray(grad);%将梯度矩阵转换为灰度图像level=graythresh(grad);%计算灰度阈值BW=im2bw(grad,level);%用阈值分割梯度图像subplot(2,4,2);imshow(BW);%显示分割后的图像即边缘图像title('Roberts');y_mask=[-1-2-1;000;121];x_mask=y_mask';I=im2double(A);dx=imfilter(I,x_mask);dy=imfilter(I,y_mask);grad=sqrt(dx.*dx+dy.*dy);%计算梯度grad=mat2gray(grad);level=graythresh(grad);BW=im2bw(grad,level);subplot(2,4,3);imshow(BW);%显示分割后的图像即边缘图像title('Sobel');y_mask=[-1-1-1;000;111];x_mask=y_mask';dx=imfilter(I,x_mask);dy=imfilter(I,y_mask);grad=sqrt(dx.*dx+dy.*dy);%计算梯度grad=mat2gray(grad);level=graythresh(grad);BW=im2bw(grad,level);%用阈值分割梯度图像subplot(2,4,4);imshow(BW);%显示分割后的图像即边缘图像title('Prewitt');mask=[0,-1,0;-1,4,-1;0,-1,0];%建立模板dx=imfilter(I,mask);%计算梯度矩阵grad=mat2gray(dx);%将梯度矩阵转化为灰度图像BW=im2bw(grad,0.58);%用阈值分割梯度图像subplot(2,4,5);imshow(BW);%显示分割后的图像,即梯度图像title('Laplacian');mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0];%建立模板dx=imfilter(I,mask);%计算梯度矩阵grad=mat2gray(dx);%将梯度矩阵转化为灰度图像BW=im2bw(grad,0.58);subplot(2,4,6);imshow(BW);%显示分割后的图像,即梯度图像title('log');BW1=edge(I,'canny');%调用canny函数subplot(2,4,7);imshow(BW1);%显示分割后的图像,即梯度图像title('Canny');mask1=[-1-2-1;000;121];%建立方向模板mask2=[-2-10;-101;012];mask3=[-101;-202;-101];mask4=[012;-101;-2-10];mask5=[121;000;-1-2-1];mask6=[210;10-1;0-1-2];mask7=[10-1;20-2;10-1];mask8=[0-1-2;10-1;210];d1=imfilter(I,mask1);%计算8个领域的灰度变化d2=imfilter(I,mask2);d3=imfilter(I,mask3);d4=imfilter(I,mask4);d5=imfilter(I,mask5);d6=imfilter(I,mask6);d7=imfilter(I,mask7);d8=imfilter(I,mask8);dd=max(abs(d1),abs(d2));%取差值变化最大的元素组成灰度变化矩阵dd=max(dd,abs(d3));dd=max(dd,abs(d4));dd=max(dd,abs(d5));dd=max(dd,abs(d6));dd=max(dd,abs(d7));dd=max(dd,abs(d8));grad=mat2gray(dd);%将灰度变化矩阵转化为灰度图像BB=grad;FW=median(BB(:))/0.6745;B=BB.*BB;B=sum(B(:));FX=sqrt(B/256^2);FS=sqrt(max(FX^2-FW^2,0));T=sqrt(2)*FW^2/FS;%计算最佳阈值grad=mat2gray(BB);BW2=im2bw(grad,T);%用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2);%显示分割后的图像,即边缘图像title('sobel改进算子');Part2加入高斯噪声后的cameraman仿真程序:clcclearallcloseallA=imread('cameraman.bmp');%读入图像V=0.009;X=imnoise(A,'gaussian',0,V);subplot(2,4,1);imshow(X);%添加均值为0、方差0.09的高斯噪声x_mask=[10;0-1];%创建X方向的模板y_mask=rot90(x_mask);%创建Y方向的模板I=im2double(X);%图像数据双精度转化dx=imfilter(I,x_mask);%X方向的梯度分量的计算dy=imfilter(I,y_mask);%Y方向的梯度分量的计算grad=sqrt(dx.*dx+dy.*dy);%梯度计算grad=mat2gray(grad);%梯度矩阵转换成灰度图像level=graythresh(grad);%计算灰度阈值BW=im2bw(grad,level);%使用阈值分割梯度图像subplot(2,4,2);imshow(BW);%显示分割后的图像即边缘图像title('Roberts');y_mask=[-1-2-1;000;121];x_mask=y_mask';dx=imfilter(I,x_mask);dy=imfilter(I,y_mask);grad=sqrt(dx.*dx+dy.*dy);grad=mat2gray(grad);%梯度矩阵转为灰度图像level=graythresh(grad);%计算灰度阈值BW=im2bw(grad,level);%用阈值分割梯度图像subplot(2,4,3);imshow(BW);%显示分割后的图像即边缘图像title('Sobel');y_mask=[-1-1-1;000;111];x_mask=y_mask';dx=imfilter(I,x_mask);dy=imfilter(I,y_mask);grad=sqrt(dx.*dx+dy.*dy);grad=mat2gray(grad);level=graythresh(grad);BW=im2bw(grad,level);subplot(2,4,4);imshow(BW);%显示分割后的图像即边缘图像title('Prewitt');mask=[0,-1,0;-1,4,-1;0,-1,0];%建立模板dx=imfilter(I,mask);%计算梯度矩阵grad=mat2gray(dx);%将梯度矩阵转化为灰度图像BW=im2bw(grad,0.58);%用阈值分割梯度图像subplot(2,4,5);imshow(BW);%显示分割后的图像,即梯度图像title('Laplacian');mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0];%建立模板dx=imfilter(I,mask);%计算梯度矩阵grad=mat2gray(dx);%将梯度矩阵转化为灰度图像BW=im2bw(grad,0.58);%用阈值分割梯度图像subplot(2,4,6);imshow(BW);%显示分割后的图像,即梯度图像title('log');BW1=edge(I,'canny');%调用canny函数subplot(2,4,7);imshow(BW1);%显示分割后的图像,即梯度图像title('Canny');mask1=[-1-2-1;000;121];%建立方向模板mask2=[-2-10;-101;012];mask3=[-101;-202;-101];mask4=[012;-101;-2-10];mask5=[121;000;-1-2-1];mask6=[210;10-1;0-1-2];mask7=[10-1;20-2;10-1];mask8=[0-1-2;10-1;210];d1=imfilter(I,mask1);%计算8个领域的灰度变化d2=imfilter(I,mask2);d3=imfilter(I,mask3);d4=imfilter(I,mask4);d5=imfilter(I,mask5);d6=imfilter(I,mask6);d7=imfilter(I,mask7);d8=imfilter(I,mask8);dd=max(abs(d1),abs(d2));%取差值变化最大的元素组成灰度变化矩阵dd=max(dd,abs(d3));dd=max(dd,abs(d4));dd=max(dd,abs(d5));dd=max(dd,abs(d6));dd=max(dd,abs(d7));dd=max(dd,abs(d8));grad=mat2gray(dd);%将灰度变化矩阵转化为灰度图像BB=grad;FW=median(BB(:))/0.6745;B=BB.*BB;B=sum(B(:));FX=sqrt(B/256^2);FS=sqrt(max(FX^2-FW^2,0));T=sqrt(2)*FW^2/FS;%计算最佳阈值grad=mat2gray(BB);%将梯度矩阵转化为灰度图像BW2=im2bw(grad,T);%用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2);%显示分割后的图像,即边缘图像title('sobel改进算子');加入椒盐噪声的边缘检测程序:functionjingdianI=imread('lenna.bmp');I1=imnoise(I,'salt&pepper');%添加椒盐噪声,默认值为0.02figure,imshow(I1);%添加均值为0、方差0.002的高斯噪声title('添加椒盐噪声后原图')B1=edge(I1,'roberts');B2=edge(I1,'sobel');B3=edge(I1,'prewitt');B4=edge(I1,'canny');B5=edge(I1,'log');subplot(2,3,1);imshow(B1);title('roberts算子检测');subplot(2,3,2);imshow(B2);title('sobel算子检测');subplot(2,3,3);imshow(B3);title('prewitt算子检测');subplot(2,3,4);imshow(B4);title('canny算子检测');subplot(2,3,5)imshow(B5);title('log算子检测');B1=edge(I1,'roberts');%调用roberts算子检测图像B2=edge(I1,'sobel'
本文标题:边缘提取和边缘检测matlab程序代码大全
链接地址:https://www.777doc.com/doc-5676846 .html