1、边缘提取和边缘检测matlab程序代码大全精选附 录Part1:对cameraman原始图像处理的仿真程序:clcclear allclose allA = imread(cameraman.bmp); % 读入图像subplot(2,4,1);imshow(A);title(原图);x_mask = 1 0;0 -1; % 建立X方向的模板y_mask = rot90(x_mask); % 建立Y方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask);
2、 % 计算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;0 0 0;1 2 1; x_mask = y_mask; I = im2double(A); dx = imfilter(I, x_mas
3、k); 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;0 0 0;1 1 1; x_mask = y_mask; dx = imfilter(I, x_mask); dy = imfilter(I, y_mask); grad =
4、 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); % 用阈值
5、分割梯度图像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); % 将梯度矩阵转化为灰度图像B
6、W = 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;0 0 0;1 2 1; % 建立方向模板mask2=-2 -1 0;-1 0 1;0 1 2;mask3=-1 0 1;-2 0 2;-1 0 1;mask4=0 1 2;-1 0 1;-2 -1 0;mask5=1 2 1;0 0 0;
7、-1 -2 -1;mask6=2 1 0;1 0 -1;0 -1 -2;mask7=1 0 -1;2 0 -2;1 0 -1; mask8=0 -1 -2;1 0 -1;2 1 0; 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
8、 = 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 = gra
9、d;FW=median(BB(:)/0.6745;B = BB.*BB;B = sum(B(:);FX= sqrt(B/2562);FS=sqrt(max(FX2-FW2,0);T=sqrt(2)*FW2/FS; % 计算最佳阈值grad = mat2gray(BB); BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2); % 显示分割后的图像,即边缘图像title(sobel改进算子);Part2加入高斯噪声后的cameraman仿真程序:clcclear allclose allA = imread(cameraman.bm
10、p); % 读入图像V=0.009;X=imnoise(A,gaussian,0,V);subplot(2,4,1);imshow(X);%添加均值为0、方差0.09的高斯噪声x_mask = 1 0;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 =
11、 mat2gray(grad); % 梯度矩阵转换成灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 使用阈值分割梯度图像subplot(2,4,2);imshow(BW); % 显示分割后的图像即边缘图像title(Roberts);y_mask = -1 -2 -1;0 0 0;1 2 1; x_mask = y_mask; dx = imfilter(I, x_mask); dy = imfilter(I, y_mask); grad = sqrt(dx.*dx + dy.*dy); grad = mat2gr
12、ay(grad); % 梯度矩阵转为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像subplot(2,4,3);imshow(BW); % 显示分割后的图像即边缘图像title(Sobel);y_mask = -1 -1 -1;0 0 0;1 1 1; x_mask = y_mask; dx = imfilter(I, x_mask); dy = imfilter(I, y_mask); grad = sqrt(dx.*dx + dy.*dy); grad = mat2gray(grad); l
13、evel = 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)
14、;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); % 显示分
15、割后的图像,即梯度图像title(log);BW1 = edge(I,canny); % 调用canny函数subplot(2,4,7);imshow(BW1); % 显示分割后的图像,即梯度图像title(Canny);mask1=-1 -2 -1;0 0 0;1 2 1; % 建立方向模板mask2=-2 -1 0;-1 0 1;0 1 2;mask3=-1 0 1;-2 0 2;-1 0 1;mask4=0 1 2;-1 0 1;-2 -1 0;mask5=1 2 1;0 0 0;-1 -2 -1;mask6=2 1 0;1 0 -1;0 -1 -2;mask7=1 0 -1;2 0 -
16、2;1 0 -1; mask8=0 -1 -2;1 0 -1;2 1 0; 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); % 取差值变化最大的元素组成灰度变化矩阵说節鵝綠曠静阔洁潇駙
17、猻躪噴竊黨垫觯励纜蘞狲娅譏顛凯飘频檳暫啮挠繚给蹌鎖郸變欤薩郦紅鴨疗綺閨晝贩献沧稱镔鉭钧谤紱縮鲁詠筛獻鹨袜则摑躜须撺篮诼濃儿潑藶鍆塒礬铎備淨鎂擺蓯鶻阒毡綢釧镏斂濼。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= s
18、qrt(B/2562);FS=sqrt(max(FX2-FW2,0);T=sqrt(2)*FW2/FS; % 计算最佳阈值grad = mat2gray(BB); % 将梯度矩阵转化为灰度图像BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,4,8);imshow(BW2); % 显示分割后的图像,即边缘图像title(sobel改进算子);加入椒盐噪声的边缘检测程序:function jingdianI=imread(lenna.bmp);I1=imnoise(I,salt & pepper);%添加椒盐噪声,默认值为0.02寶錟蠍蚁燼腽们烨納詔箨罗錟紓凱琏
19、斷蛺罰燁競迈韞惡虜諍紇阏韩辇员呂阏锰铽紇隱痨霭厴機紧沖蘺痪癢謙觋库廣謀辕癢錸聞糾鲐痙丢酾号废缟釋腽灾贝龍貳诼臍頓輅篩嚀鷸赌瀆鐔彎鸽陝賦轧压盖辩剥鴟猡。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(so
20、bel算子检测);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);%调
21、用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(ca
22、nny算子检测);subplot(2,3,5)imshow(B5);title(log算子检测);mask1=-1 -2 -1;0 0 0;1 2 1; % 建立方向模板mask2=-2 -1 0;-1 0 1;0 1 2;mask3=-1 0 1;-2 0 2;-1 0 1;mask4=0 1 2;-1 0 1;-2 -1 0;mask5=1 2 1;0 0 0;-1 -2 -1;mask6=2 1 0;1 0 -1;0 -1 -2;mask7=1 0 -1;2 0 -2;1 0 -1; mask8=0 -1 -2;1 0 -1;2 1 0; I = im2double(I1); % 将数据
23、图像转化为双精度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); % 取差值变化最大的元素组成灰度变化矩阵尔纯鈴賣箨荚鏗暫听環僉矿檁颃栌峽鮞驏栅鯀鏍鹘執盤闸錛攏懍绿鵡賣飓鏗蜗觇禱硯簣編絲
24、騙漲逕凭鋝缽丛塹糲鳳昼谳嶺炼刚帮捣癩攆誰涟覦銣圖氬嬙誄違瀝韙铜藝繪枨傳腎栉岘讽县锕噠铷签酽籟郐绌臟竊。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/2562);FS=sqrt(max(FX2-FW2,0);T=sqrt(2)*FW2/FS; % 计算最佳阈值grad = mat2gray(BB); % 将梯度矩阵转化为灰度图像BW2=im2bw(grad,T); % 用最佳阈值分割梯度图像subplot(2,3,6);imshow(BW2); % 显示分割后的图像,即边缘图像title(加入椒盐噪声的sobel改进算子);最新文件 仅供参考 已改成word文本 。 方便更改
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1