【问题标题】:How to find edge from dark line to grey smeared region如何找到从暗线到灰色涂抹区域的边缘
【发布时间】:2016-02-07 14:48:31
【问题描述】:

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


到目前为止我做了什么:

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

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

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

编辑

蛇也无济于事。

标记为蓝色的活动轮廓只是越过边缘,在左右轮廓卡住了。我尝试的代码是取自here的函数Snake2D(I,P,Options)。


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

【问题讨论】:

  • 嗨!许多 OCR 程序使用Gabor filtering 进行边缘检测。也许你应该寻找这种方法。
  • 你试过主动轮廓(又名蛇)吗?
  • 我还没试过蛇。其中包含的梯度信息可能有助于获得所需的边缘。如果有帮助,我会编辑或回答我的问题。
  • 不幸的蛇也无济于事。正如人们担心的那样,snakes 算法很容易陷入局部极值。

标签: matlab image-processing edge-detection


【解决方案1】:

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

结果:

可以这样:

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

【讨论】:

  • 感谢您提供简单但很好的解决方案。我在其他图像上尝试过,线条似乎很合适,但请你解释一下如何平滑最后的线条?
猜你喜欢
  • 2016-11-30
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多