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

时间:2015-11-06 12:43:57

标签: matlab image-processing edge-detection

我正在尝试检测从黑色水平线到灰色模糊前景的边缘。 所需的边缘/结果略微标记为红色。

Chan-Vese result

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

我的方法是使用标准的Chan-Vese分割结合几种预处理方法,如高斯模糊,最大过滤器或morpholigocal操作员如侵蚀。但是,当我在图像的下半部分初始化水平集功能时,轮廓会在假定的边缘之前被卡住。

Active Contour with Snakes

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

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

修改

Snakes也没有帮助。

here

标记为蓝色的活动轮廓简单地越过边缘,左右两侧的轮廓卡住。我试过的代码是从Original Image取得的函数Snake2D(I,P,Options)。

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

https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/

1 个答案:

答案 0 :(得分:2)

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

<强>结果: enter image description here

可以这样:

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是您的平滑窗口(越宽越宽,请参阅here