2016-12-14 76 views
0

让为保持数据矩阵DS=sign(D)的符号的矩阵。我想在S的两个跟随单元之间找到垂直变化。 (我试图检测高斯差分后的边缘)。为了避免噪声,只有当我在两个结果像素中找到边缘时,才想要执行此操作。使用滤波器和二维卷积发现符号变化

我已经实现了这个数学上很好的代码(回答了我的要求)。 (适用于边缘的一些重量)

 [D,S]=DogCalc(FileName);%the function is in the end of this file 

     edges=zeros(size(D)); 
     for i=1:rowSize*columnSize-columnSize 
      if(S(i)~=S(i+1)&&S(i+columnSize)~=S(i+1+columnSize))%apply weighted edge for horizontal edge 
       edges(i)=abs((D(i)*S(i+1)-D(i+1)*S(i))/(S(i+1)-S(i))); 
      elseif(S(i)~=S(i+columnSize)&&S(i+1)~=S(i+1+columnSize))%apply weighted edge for vertical edge 
       edges(i)=abs((D(i)*S(i+columnSize)-D(i+columnSize)*S(i))/(S(i+columnSize)-S(i))); 
      end 
     end 
     imshow(edges); 

我试图使用文件管理器来避免for循环无济于事。假设滤波器在回答条件的有趣像素中提取了一个包含1的矩阵(替换if语句)。一切都错了:

 Tester=[1 -1; 1 -1]; 
     %V for vertical and H for horizontal 
     VEdges=abs(imfilter(S,0.25*Tester,'same')); 
     HEdges=abs(imfilter(S,0.25*Tester.','same')); 
     VEdges(VEdges<1)=0; 
     HEdges(HEdges<1)=0; 
  • 它使用的过滤器是可行的\正确的是?
  • 如果是这样,我做错了什么?

回答

1

如果我正确理解你的问题,这对我来说很有效(找到矩阵中两个相邻位置上的符号变化)。我假定S包含值0或1:

abs(imfilter(S, [1 -1; 1 -1]/4, 'replicate'))>0.5-eps 

解释:你的过滤器形状是正确的,但我不知道你在找什么。精确匹配(两个相邻位置的边缘)会给出大约0.5或-0.5的值,但只是“数值上”(因为在应用过滤器时使用了fft),所以您需要查找接近0.5(达到epsilon)。

复制将会导致复制图像旁边的边缘,但您可能想要使用该功能的其他选项进行测试。

+0

我正在寻找与for循环相同的结果。 'S'可以是'1'或'-1'(见我的编辑)。我得到的输出是'0'或'1',问题是我得到了一倍的边缘。 – havakok

+0

所以你想只有一个'1'有一个连续的边缘?运行另一个过滤器[1 1]或[1 1]'并将结果阈值... –

+0

是的,我想要一个'1'。你可以好好扩展为什么这个过滤器有帮助吗? – havakok