请帮帮我!我有一个类似于附件的图像(从暗到光的渐变,从南到北移动,有一条水平的白线,这是感兴趣的)我试图沿着y轴上的每个矢量,从图像的底部开始,并定位白线的底部。我可以使用一个类似sobel的边缘检测器,但是在白色line..so的南部有一些暗点,进入一个点会给我的检测器一个很大的负值,我可以忽略它,但是当它离开黑点并返回到梯度时,我从我的检测器得到一个很大的正值,我无法从白线底部的边缘区分出来。我尝试放在一起的代码同时获取每个点的sobel值和强度,并添加到两个不同的向量(带有sobel值的向量,我稍后用来定位每个y轴向量的最大值/白线的下边缘)..if有一个很大的负sobel值(即进入一个黑斑),我保持在该点开始之前的最后一个强度点,并使用'while‘用零填充sobel向量,向上移动,直到内核安全地离开黑斑(强度值比进入黑斑之前更大),在这一点上,我开始再次收集实际的sobel值。我正在加载一个高度为715的图像,但是我的sobel向量最终比that...not大得多,确定我做错了什么:
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

发布于 2015-08-16 06:28:33
我知道你有一条白色的线条,或多或少是水平的,但在它的附近有嘈杂的灰度值像素。你的目标是精确定位这个白色区域的边缘。在这种情况下,sobel滤波器可能不是最好的方法,因为它并不健壮。相反,我会尝试顺序过滤器,它是Mathlab Image Processing Toolbox的一部分(当然,您也可以自己实现它)。
http://ch.mathworks.com/help/images/ref/ordfilt2.html
通过实验不同的邻域(例如,中心在顶部的垂直线)和过滤器的顺序,再加上对结果应用阈值,你应该能够找到解决方案。
https://stackoverflow.com/questions/31977019
复制相似问题