0

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

 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 

在此处输入图像描述

4

1 回答 1

0

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

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

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

于 2015-08-15T22:28:32.870 回答