如何找到从暗线到灰色涂抹区域的边缘

How to find edge from dark line to grey smeared region

我正在尝试检测从黑色水平线到灰色涂抹前景的边缘。 所需的 edge/result 略微标记为红色。


到目前为止我尝试了什么:

我的方法是使用标准的 Chan-Vese 分割结合多种预处理方法,如高斯模糊、最大滤波器或形态学运算符(如侵蚀)。但是,当我在图像的下部初始化水平集函数时,轮廓卡在了所需边缘之前。

由于噪音我无法在不破坏图像重要信息的情况下去除,简单的方法如 sobel 或 prewitt 过滤可能会失败。

我的另一个方法是搜索图像的 maximum/minimum 列强度,并标记每列最暗的像素。 正如您所假设的那样,这也会失败,因为我正在寻找的边缘并不是唯一具有暗像素的部分,这就是为什么这种方法非常容易出错的原因。

编辑

蛇也无济于事。

标记为蓝色的活动轮廓只是越过边缘,轮廓在左侧和右侧卡住。我尝试的代码是取自 here.

的函数 Snake2D(I,P,Options)

如果你想帮助我,这是原图。

我认为您使用行并找到最大值的方法可能是最简单的。 您遇到的一个问题是区分两个主要最大值。为此,您可以应用粗略平滑,找到两个最大值之间的中间点(下图中的蓝线)。然后你可以只取较低的位,也就是你感兴趣的位,并找到这个位的最大值。 最后一步,只需将两个指数相加即可。

结果:

可以这样:

ib = imread('LHkm2.png');   %Read image
sz = size(ib);              %get dimensions
for i = 1:sz(2)
    [~, ind_mid(i)] = max(smooth(-double(ib(:, i)), 130));%First round
    line_to_smooth = ib(ind_mid(i):end, i);%Get line with one maximum
    [~, ind(i)] = min(smooth(double(line_to_smooth), 10));%Second round
    ind(i) = ind(i) + ind_mid(i);%Add indices to get final position
end
imshow(ib,[]);
hold on;
plot(ind_mid, 'LineWidth', 3);
plot(ind, 'LineWidth', 3);

注意:您当然可以像任何其他图形一样平滑最后一行以消除这样的颠簸:

ind = smooth(ind, 10) 

其中 10 是您的平滑度 window(越高越宽,参见 here