我正在尝试检测从黑色水平线到灰色模糊前景的边缘。 所需的边缘/结果略微标记为红色。
到目前为止我尝试了什么:
我的方法是使用标准的Chan-Vese分割结合几种预处理方法,如高斯模糊,最大过滤器或morpholigocal操作员如侵蚀。但是,当我在图像的下半部分初始化水平集功能时,轮廓会在假定的边缘之前被卡住。
由于在不破坏图像重要信息的情况下无法消除噪音,sobel或prewitt过滤等简单方法可能会失败。
我的另一个用途是搜索图像的最大/最小强度,并标记每列的最暗像素。 你可以假设,这也会失败,因为我正在寻找的边缘不是唯一具有暗像素的部分,这就是为什么这种方法非常容易出错的原因。
修改
Snakes也没有帮助。
标记为蓝色的活动轮廓简单地越过边缘,左右两侧的轮廓卡住。我试过的代码是从取得的函数Snake2D(I,P,Options)。
如果你想帮助我,这是原始图片。
https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/
答案 0 :(得分:2)
我认为使用行并找到最大值的方法可能最简单。 你遇到的一个问题是区分两个主要的最大值。为此,您可以应用粗略平滑,以找到两个最大值之间的中间位置(下图中的蓝线)。然后,您只能获取您感兴趣的低位,并找到该位的最大值。 在最后一步中,只需将两个指数相加即可。
可以这样:
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。