2015-11-06 124 views
2

我想要检测从黑色水平线到灰色涂抹前景的边缘。 所需的边缘/结果略带红色。如何找到从黑线到灰色涂抹区域的边缘

Desired Result


什么有我试过至今:

我的方法是使用标准的赞Vese分割与像高斯模糊,最大的过滤器或morpholigocal操作几个preprocseeing相结合的方法像侵蚀。但是,当我初始化图像下部的水平集功能时,轮廓会在边缘被卡住之前卡住。

Chan-Vese result

由于噪音我无法摆脱掉而不会破坏图像的重要信息,如索贝尔和普鲁伊特过滤简单的方法可能会失败。

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

编辑

蛇也没有帮助。

Active Contour with Snakes

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


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

Original Image

+0

嗨!许多OCR程序使用[Gabor过滤](https://en.wikipedia.org/wiki/Gabor_filter)进行边缘检测。也许你应该寻找那种方法。 – jkalden

+0

你尝试过活动的轮廓(又名蛇)吗? –

+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

+0

感谢您提供简单但很好的解决方案。我在其他图片上尝试过,这条线看起来非常合适,但是能否向我解释如何平滑最后一行? –