【问题标题】:Finding sign changes using filter and 2-D convolution使用滤波器和二维卷积查找符号变化
【发布时间】:2016-12-14 13:11:32
【问题描述】:

S 是包含数据矩阵D 的符号的矩阵,即S=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;
  • 使用过滤器是否可行\正确?
  • 如果是这样,我做错了什么?

【问题讨论】:

    标签: matlab image-processing filter


    【解决方案1】:

    如果我正确理解您的问题,这对我有用(在矩阵中的两个相邻位置查找符号的变化)。我假设 S 包含值 0 或 1:

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

    解释:您的过滤器形状是正确的,但我不确定您在寻找什么。完全匹配(两个相邻位置的边)会给你一个大约 0.5 或 -0.5 的值,但只是“数字”(因为 fft 在过滤器的应用中使用),所以你需要寻找的东西是接近 0.5(高达 epsilon)。

    replicate 将导致图像旁边的边缘被复制,但您可能希望尝试使用该功能的其他选项。

    【讨论】:

    • 我正在寻找与 for 循环相同的结果。 S1-1(请参阅我的编辑)。我得到的输出是01 问题是我得到了两倍的优势。
    • 所以你只想要一个有连续边的'1'?运行另一个过滤器 [1 1] 或 [1 1]' 并对结果设置阈值...
    • 是的,我想要一个1。您能否详细说明为什么此过滤器会有所帮助?
    • 过滤器的工作方式。对于看起来像过滤器本身的东西,过滤器将始终具有最强的输出。如果您想查找更深层次的数学,请查找 Cauchy-Schwarz 不等式link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多