| 查看: 384 | 回复: 0 | ||
[求助]
下面的Canny边缘提取代码错在哪里?
|
|
下面的程序错在哪里,为什么提取出的边缘图像全黑,而如果删掉高斯滤波代码,反而能够出来结果? I=imread('F:\rose.jpg');%读入原始图片 figure, imshow(I),title('原图'); Y=rgb2gray(I); %把彩色图片转化成灰度图片,256级 figure, imshow(Y),title('灰度图像'); I1=double(Y); [m,n]=size(I1); %(1)用高斯滤波器平滑图像 sigma=2;N=5;%定义高斯参数 [d,f]=meshgrid([-(N-1)/2 N-1)/2],[-(N-1)/2 N-1)/2]);g=exp(-((d.*d+f.*f)/(2*sigma.*sigma))); S=conv2(Y,g,'same');%二维卷积得到高斯滤波后的图象 I1=mat2gray(S);%归一化,使矩阵中每个元素的值都在0-1之间 % gaussian=[1/79 2/79 3/79 2/79 1/79; 2/79 4/79 6/79 4/79 2/79; 3/79 6/79 7/79 6/79 3/79; 2/79 4/79 6/79 4/79 2/79; 1/79 2/79 3/79 2/79 1/79]; % I1 =conv2(I1,gaussian); imshow(I1);title('高斯滤波结果'); %(2)用一阶偏导的有限差分来计算梯度的幅值和方向; IP=zeros(m,n); IQ=zeros(m,n); f=zeros(m,n); a=zeros(m,n); for x=1:m-1 for y=1:n-1 IP(x,y)=(I1(x,y+1)-I1(x,y)+I1(x+1,y+1)-I1(x+1,y))/2; IQ(x,y)=(I1(x,y)-I1(x+1,y)+I1(x,y+1)-I1(x+1,y+1))/2; f(x,y)=sqrt(IP(x,y)^2+IQ(x,y)^2);%梯度幅值矩阵 a(x,y)=0; if(IP(x,y)<0) a(x,y)=atan(IQ(x,y)/IP(x,y))+pi/2; else a(x,y)=atan(IQ(x,y)/IP(x,y)); end end end % H1 = [-1 -1; 1 1]; % H2 = [1 -1; 1 -1]; % fx = conv2(I1,H1); % fy = conv2(I1,H2); % f = sqrt(fx.^2 + fy.^2); % a = atan(fx./eps(fy)); for i = 1:m for j = 1:n if(a(i,j) > -pi/8 && a(i,j) <= pi/8) a(i,j) = 0; elseif(a(i,j) > pi/8 && a(i,j) <= 3*pi/8) a(i,j) = 1; elseif((a(i,j) > 3*pi/8 || a(i,j) <= -3*pi/8)) a(i,j) = 2; else a(i,j) = 3; end end end %(3)对梯度幅值进行非极大值抑制; F = f; for i =2 m-1) for j=2 n-1) switch(a(i,j)) case 0 if(F(i,j) <= F(i,j-1) || F(i,j) <= F(i,j+1)) f(i,j) = 0; end case 1 if(F(i,j) <= F(i-1,j+1) || F(i,j) <= F(i+1,j-1)) f(i,j) = 0; end case 2 if(F(i,j) <= F(i-1,j) || F(i,j) <= F(i+1,j)) f(i,j) = 0; end case 3 if(F(i,j) <= F(i-1,j-1) || F(i,j) <= F(i+1,j+1)) f(i,j) = 0; end end end end figure,imshow(f),title('非极大值抑制后结果'); %step4:用双阈值算法检测和连接边缘。 t1 =str2double(get(handles.edit1,'string'));%低阈值 t2 =str2double(get(handles.edit2,'string'));%高阈值 Canny_1 = zeros(m,n); Canny_2 = zeros(m,n); for i = 1:m for j =1:n if(f(i,j) >= t1 ) Canny_1(i,j) = 255; else Canny_1(i,j) = 0; end if(f(i,j) >= t2 ) Canny_2(i,j) = 255; else Canny_2(i,j) = 0; end end end for i = 2 m-1) for j = 2 n-1) if((Canny_1(i,j)==255) && (Canny_2(i,j)~=255)) if((Canny_2(i-1,j-1)==255) || (Canny_2(i-1,j)==255) || (Canny_2(i-1,j+1)==255)|| ( Canny_2(i,j-1)==255 ) || (Canny_2(i,j+1)==255) || (Canny_2(i+1,j-1)==255) || (Canny_2(i+1,j)==255) ||(Canny_2(i+1,j+1) ==255)) Canny_2(i,j)=255; end end end end Canny=Canny_2; title('Canny算子提取的边缘'); |
» 猜你喜欢
售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急
已经有4人回复
售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急
已经有5人回复
售一区SCI文章T0P,我:8O.551.O54,科目全,可十急
已经有6人回复
售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急
已经有9人回复
售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急
已经有9人回复
售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急
已经有8人回复
售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急
已经有7人回复
售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急
已经有11人回复
售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急
已经有12人回复
售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急
已经有9人回复
找到一些相关的精华帖子,希望有用哦~
科研从小木虫开始,人人为我,我为人人










N-1)/2],[-(N-1)/2
回复此楼
点击这里搜索更多相关资源