边缘提取和边缘检测matlab程序代码大全精选.docx
《边缘提取和边缘检测matlab程序代码大全精选.docx》由会员分享,可在线阅读,更多相关《边缘提取和边缘检测matlab程序代码大全精选.docx(12页珍藏版)》请在冰豆网上搜索。
边缘提取和边缘检测matlab程序代码大全精选
附录
Part1:
对cameraman原始图像处理的仿真程序:
clc
clearall
closeall
A=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仿真程序:
clc
clearall
closeall
A=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改进算子');
加入椒盐噪声的边缘检测程序:
functionjingdian
I=imread('lenna.bmp');
I1=imnoise(I,'salt&pepper');%添加椒盐噪声,默认值为0.02寶錟蠍蚁燼腽们烨納詔箨罗錟紓凱琏斷蛺罰燁競迈韞惡虜諍紇阏韩辇员呂阏锰铽紇隱痨霭厴機紧沖蘺痪癢謙觋库廣謀辕癢錸聞糾鲐痙丢酾号废缟釋腽灾贝龍貳诼臍頓輅篩嚀鷸赌瀆鐔彎鸽陝賦轧压盖辩剥鴟猡。
figure,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');%调用soble算子进行边缘检测
B3=edge(I1,'prewitt');%调用prewitt算子进行边缘检测
B4=edge(I1,'canny');%调用canny算子对图像进行边缘检测
B5=edge(I1,'log');%调用log算子对图像进行边缘检测
subplot(2,3,1);%设置图像布局
imshow(B1);title('roberts算子检测');%现实图像并命名为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算子检测');
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];
I=im2double(I1);%将数据图像转化为双精度
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);%将灰度变化矩阵转化为灰度图像
level=graythresh(grad);%计算灰度阈值
BW=im2bw(grad,level);%用阈值分割梯度图像
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,3,6);
imshow(BW2);%显示分割后的图像,即边缘图像
title('加入椒盐噪声的sobel改进算子');
最新文件仅供参考已改成word文本。
方便更改