%边缘检测程序 作者朱柱,提取最大连通区域的边缘
close all;
clear all;
I=imread('shuiguo.bmp'); %minjiangpark.jpg
f=I;
figure
imshow(I),title('原图')
I=rgb2gray(I);
level = graythresh(I);
bw = im2bw(I,level);
%se = strel('disk',3);
%bw2 = imclose(bw,se);
fo=strel('diamond',5);
bw2=imopen(bw,fo);
%se1=strel('disk',1);
%bw2=imdilate(bw,se1); %对图像f进行膨胀操作%
%se2=strel('disk',8);
%bw2=imopen(bw2,se2); %对图像se2进行开运算%
figure
imshow(bw),title('二值化图像')
figure
imshow(bw2),title('形态学处理图像')
[L,NUM] = bwlabel(~bw2,4);
[wid,hig]=size(L);
num=1;
mm1=0;mm2=0;
for m=1:NUM
for i=1:wid
for j=1:hig
if L(i,j)==m
mm2=mm2+1;
end
end
end
if mm2>mm1,num=m;
end
mm1=max(mm1,mm2);
mm2=0;
end
%寻找最大连通成分
for i=1:wid
for j=1:hig
if L(i,j)==num,bw2(i,j)=1;
else bw2(i,j)=0;
end
end
end
figure
imshow(bw2),title('最大连通成分提取');
%提取最大连通成分的边缘
im=zeros(wid,hig);
afa=zeros(wid,hig);
for i=2:wid-1
for j=2:hig-1
Gx=sum(sum([bw2(i-1,j-1) bw2(i-1,j) bw2(i-1,j+1);bw2(i,j-1) bw2(i,j) bw2(i,j+1);bw2(i+1,j-1) bw2(i+1,j) bw2(i+1,j+1)].*[1 2 1;0 0 0;-1 -2 -1]));
Gy=sum(sum([bw2(i-1,j-1) bw2(i-1,j) bw2(i-1,j+1);bw2(i,j-1) bw2(i,j) bw2(i,j+1);bw2(i+1,j-1) bw2(i+1,j) bw2(i+1,j+1)].*[1 0 -1;2 0 -2;1 0 -1]));
Gxy=sum(sum([bw2(i-1,j-1) bw2(i-1,j) bw2(i-1,j+1);bw2(i,j-1) bw2(i,j) bw2(i,j+1);bw2(i+1,j-1) bw2(i+1,j) bw2(i+1,j+1)].*[0 1 2;-1 0 1;-2 -1 0]));
Gyx=sum(sum([bw2(i-1,j-1) bw2(i-1,j) bw2(i-1,j+1);bw2(i,j-1) bw2(i,j) bw2(i,j+1);bw2(i+1,j-1) bw2(i+1,j) bw2(i+1,j+1)].*[2 1 0;1 0 -1;0 -1 -2]));
im(i,j)=abs((Gx+Gy+Gxy+Gyx)/2);
afa(i,j)=atan((Gx+Gxy)/(Gy+Gyx))*180/pi;
if afa(i,j)>=0&&afa(i,j)<22.5||afa(i,j)>157.5&&afa(i,j)<180
afa(i,j)=0;
elseif afa(i,j)>=22.5&&afa(i,j)<67.5
afa(i,j)=45;
elseif afa(i,j)>=67.5&&afa(i,j)<112.5
afa(i,j)=90;
else
afa(i,j)=135;
end
end
end
level=graythresh(im); %边缘图像二值化
ima0=im2bw(im,level);
figure,imshow(ima0);
title('最大连通成分边缘');
se1=strel('disk',1);
ima0=imdilate(ima0,se1); %对边缘图像进行膨胀操作%
ima0=uint8(ima0);
f=uint8(f);
[m n]=size(ima0);
fR=255*ima0;
fG=0*ima0;
fB=0*ima0;
rgb_g=cat(3,fR,fG,fB);
%figure,imshow(rgb_g);
%pause
image=rgb_g+f;
mri = uint8(zeros(wid,hig,3,20));
for i=1:2:19
mri(:,:,:,i)=f;
end
for j=2:2:20
mri(:,:,:,j)=image;
end
mov = immovie(mri);
movie(mov,2);
C=0;
for i=1:wid
for j=1:hig
if im(i,j)==1&&afa(i,j)==45
C=C+2^(1/2);
elseif im(i,j)==1&&afa(i,j)==135
C=C+2^(1/2);
elseif im(i,j)==1&&afa(i,j)==0
C=C+1;
elseif im(i,j)==1&&afa(i,j)==90
C=C+1;
else C=C+0;
end
end
end
title(['最大连通区域的周长=',int2str(C)])
%fprintf('边缘距离 = %d', C);
- 1
- 2
- 3
前往页