首页 文章

MATLAB:自适应索贝尔边缘检测

提问于
浏览
0

请帮忙!我有一个类似于附加的图像(从深到浅的渐变从南向北移动,有一条感兴趣的水平白线)我试图从图像的底部开始沿y轴查看每个向量,找到白线的底部 . 我可以使用类似索贝尔的边缘探测器,但是在白线以南有黑点 . 所以进入一个点会给我的探测器一个很大的负值,我可以忽略但是当它离开黑点并返回到梯度我从探测器得到一个很大的正值,我无法区分白线底部的边缘 . 我试图拼凑的代码同时在每个点抓取sobel值和强度,并添加到两个不同的向量(带有sobel值的向量,我后来用它来定位每个y轴向量的最大值/白线的下边缘) . 如果有一个很大的负sobel值(即进入暗点),我会在点开始之前保持最后一个强度点并使用'while'用零填充sobel矢量,向上移动直到内核安全输出暗点(强度值大于进入暗点之前),此时我开始再次收集实际的索贝尔值 . 我正在加载一个高度为715的图像,但是我的索贝尔矢量结果比这大得多......不确定我做错了什么:

for n=1:1:width
     sobVec=[];
     intVec=[];
     for k=height-5:-1:5 
         if (-4*double(J((k+4),n))-3*double(J((k+3),n))-2*double(J((k+2),n))-1*double(J((k+1),n))+0*double(J((k),n))+1*double(J((k-1),n))+2*double(J((k-2),n))+3*double(J((k-3),n))+4*double(J((k-4),n)))>-150
            sobVec(end+1)=-4*double(J((k+4),n))-3*double(J((k+3),n))-2*double(J((k+2),n))-1*double(J((k+1),n))+0*double(J((k),n))+1*double(J((k-1),n))+2*double(J((k-2),n))+3*double(J((k-3),n))+4*double(J((k-4),n));
            intVec(end+1)=J(k,n);
         else
            if isempty(intVec)
                intVec=[1];
            end
            while J((k-1),n)<intVec(end)
                k=k-1;
                sobVec(end+1)=0;          
            end
            if J((k-1),n)>intVec(end)*1.1
                for i=1:1:5
                    k=k-1;
                    sobVec(end+1)=0;
                end
            end 
        end
     end

 end

enter image description here

1 回答

  • 0

    我知道你有一条白线,或多或少是水平的,但附近有一个嘈杂的灰色值像素 . 您的目标是精确定位这个白色区域的边缘 . 在这种情况下,sobel滤波器可能不是最好的方法,因为它不健壮 . 相反,我会尝试一个订单过滤器,它是Mathlab图像处理工具箱的一部分(当然,你也可以自己实现) .

    http://ch.mathworks.com/help/images/ref/ordfilt2.html

    通过尝试不同的邻域(例如,顶部中心的垂直线)和过滤器的顺序以及对结果应用阈值,您应该能够找到解决方案 .

相关问题