2015-11-06 123 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

感謝您提供簡單但很好的解決方案。我在其他圖片上嘗試過,這條線看起來非常合適,但是能否向我解釋如何平滑最後一行? –