24小时热门版块排行榜    

CyRhmU.jpeg
查看: 939  |  回复: 0

xiashaoyan

新虫 (正式写手)

[求助] cany算子在局部非极大值抑制的计算过程的问题!!

在cany算子中局部非极大值抑制的计算过程中,要进行对插值,计算的程序如下:
(程序来源于http://blog.csdn.net/xiajun07061225/article/details/6926108

%局部非极大值抑制  
K = d;%记录进行非极大值抑制后的梯度  
%设置图像边缘为不可能的边缘点  
for j = 1:width  
    K(1,j) = 0;  
end  
for j = 1:width  
    K(height,j) = 0;  
end  
for i = 2:width - 1  
    K(i,1) = 0;  
end  
for i = 2:width - 1  
    K(i,width) = 0;  
end  
  
for i = 2:height - 1  
    for j = 2:width - 1  
        %当前像素点的梯度值为0,则一定不是边缘点  
        if d(i,j) == 0  
            K(i,j) = 0;  
        else  
            gradX = dx(i,j);%当前点x方向导数  
            gradY = dy(i,j);%当前点y方向导数  
            gradTemp = d(i,j);%当前点梯度  
            %如果Y方向幅度值较大  
            if abs(gradY) > abs(gradX)  
                weight = abs(gradX) / abs(gradY);%权重  
                grad2 = d(i - 1,j);  
                grad4 = d(i + 1,j);  
                %如果x、y方向导数符号相同  
                %像素点位置关系  
                %g1 g2  
                %   C  
                %   g4 g3  
                if gradX * gradY > 0  
                    grad1 = d(i - 1,j - 1);  
                    grad3 = d(i + 1,j + 1);  
                else  
                    %如果x、y方向导数符号反  
                    %像素点位置关系  
                    %   g2 g1  
                    %   C  
                    %g3 g4  
                    grad1 = d(i - 1,j + 1);  
                    grad3 = d(i + 1,j - 1);  
                end  
            %如果X方向幅度值较大  
            else  
                weight = abs(gradY) / abs(gradX);%权重  
                grad2 = d(i,j - 1);  
                grad4 = d(i,j + 1);  
                %如果x、y方向导数符号相同  
                %像素点位置关系  
                %g3  
                %g4 C g2  
                %     g1  
                if gradX * gradY > 0  
                    grad1 = d(i + 1,j + 1);  
                    grad3 = d(i - 1,j - 1);  
                else  
                    %如果x、y方向导数符号反  
                    %像素点位置关系  
                    %     g1  
                    %g4 C g2  
                    %g3  
                    grad1 = d(i - 1,j + 1);  
                    grad3 = d(i + 1,j - 1);  
                end  
            end  
            %利用grad1-grad4对梯度进行插值  
            gradTemp1 = weight * grad1 + (1 - weight) * grad2;  
            gradTemp2 = weight * grad3 + (1 - weight) * grad4;  
            %当前像素的梯度是局部的最大值,可能是边缘点  
            if gradTemp >= gradTemp1 && gradTemp >= gradTemp2  
                K(i,j) = gradTemp;  
            else  
                %不可能是边缘点  
                K(i,j) = 0;  
            end  
        end  
    end  
end  
我捉摸了一下午,感觉考虑两个条件,abs(dy)与abs(dx)的大小,以及dy与dx乘积的符号,感觉理解的不是很透彻,于是我画了个图,如见下:局部非极大值抑制 .jpg
画完了我就困惑了,因为图中第3个图,g1,g2不在一条直线上,怎么插值呢?所以想是不是我认为的x,y轴相反了呢?还是我画的梯度方向本身就不对呢?我查了一下,x,y轴在图像中的方向的确像我这样画的,但是我看了一个帖子http://bbs.csdn.net/topics/370004267中给了一个图,见图2,帖子里面说gx*gy>0是因为图像坐标系中y轴是朝下的,我就更加困惑了,这个帖子里面定义x,y轴方向与一般图像处理教材的方向恰好颠倒了,后来我也试了x,y轴颠倒过来,画了四种类似于上面第一个图局部非极大值抑制 .jpg,但是还是出现,g1,g2不在同一条直线上,接着我仔细看那程序,发现,考虑,abs(gradY) > abs(gradX) 与abs(gradX) > abs(gradY) 情况下,在考虑相同的gradX * gradY > 0下,grad1 与grad1 恰好颠倒过来,但是如果这样,g1,g2是没法再同一条直线上  ,所以感觉很困惑,求助各位研究算法和图像处理的前辈们!!!

cany算子在局部非极大值抑制的计算过程的问题!!
局部非极大值抑制  .jpg


cany算子在局部非极大值抑制的计算过程的问题!!-1
2.png
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 xiashaoyan 的主题更新
信息提示
请填处理意见