回答

3

MikeE的回答非常好:在這種情況下使用擴張和侵蝕形態操作可以提供很多幫助。
我想建議一點改進,利用手頭圖片的特定結構。我建議使用一個水平內核來連接水平線的端點,但不會將相鄰線彼此連接起來,而不是使用一般內核的擴展/侵蝕。

下面的代碼的草圖(假設輸入圖像被存儲在bw numpy的2D陣列):

import cv2, numpy as np 

kernel = np.ones((1,20), np.uint8) # note this is a HORIZONTAL kernel 
d_im = cv2.dilate(bw, kernel, iterations=1) 
e_im = cv2.erode(d_im, kernel, iteraions=1) 

去除由dialte創建的工件/侵蝕,我建議以提取骨架再次

你得到的是擴張的圖像:
enter image description here

注意的差距是如何關閉,同時保持明顯的水平線

而且侵蝕圖像:
enter image description here

如果進一步應用骨架形態操作的侵蝕圖像,你可以得到這樣的結果:
enter image description here

一旦連接曲線你不需要使用分水嶺分割,而是使用連接的組件來標記每條曲線。

+1

謝謝你,謝謝! –

3

由於圖像已經是單色的,因此可以使用形態轉換來關閉折線。

如果你需要一個例子,你可以在這裏找到它的文檔中: http://docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html#closing

它的工作原理是首先擴張圖像中的白色區域,然後以相同的量侵蝕回來。有效關閉白色區域的任何孔。 更多細節和實施例可以在這裏找到: http://docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

這種戰略要求的是,在虛線的間隙比相鄰線之間的距離小。

如果線條交叉或者線條彼此過於靠近,它將不起作用。不過,我認爲在你的例子中它會很好地工作。

您還可以使用侵蝕功能刪除第三行下面的工件。

+0

你有多少時間進行計算? –

+0

謝謝,邁克! –

相關問題