首页 文章

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

提问于
浏览
2

我试图检测从黑色水平线到灰色污点前景的边缘 . 所需的边缘/结果略微标记为红色 .

Desired Result


What have I tried so far :

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

Chan-Vese result

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

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

Edit

蛇也没有帮助 .

Active Contour with Snakes

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


如果您想帮助我,这是原始图片 .

Original Image

1 回答

  • 2

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

    Result:
    enter image description here

    Could go like this:

    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);
    

    Note: 你当然可以像任何其他图形一样平滑最后一行,以摆脱这样的颠簸:

    ind = smooth(ind, 10)
    

    其中10是你的平滑窗口(越宽越宽,见here .

相关问题