簡體   English   中英

如何使用 Python/Opencv 連接二進制圖像中的斷線

[英]How to connect broken lines in a binary image using Python/Opencv

如何使這些線在目標點連接? 該圖像是骨架化過程的結果。

骨架化的結果圖像

我需要連接的點

我正在嘗試使用分水嶺變換將每條線分割為一個區域。

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, iterations=1) 

你得到的是膨脹的圖像:
在此處輸入圖片說明

注意間隙是如何閉合的,同時保持不同的水平線

以及被侵蝕的圖像:
在此處輸入圖片說明

要移除由擴張/侵蝕產生的偽影,我建議再次提取骨架。
如果您進一步對侵蝕圖像應用骨架形態學操作,您可以獲得以下結果:
在此處輸入圖片說明

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

由於圖像已經是單色的,您可以使用形態變換來閉合虛線。

如果您需要一個示例,您可以在此處的文檔中找到它: http : //docs.opencv.org/2.4/doc/tutorials/imgproc/opening_closure_hats/opening_closure_hats.html#closure

它的工作原理是首先擴大圖像中的白色區域,然后以相同的量將其侵蝕回去。 有效地關閉白色區域中的任何孔。 更多細節和例子可以在這里找到: http : //docs.opencv.org/2.4/doc/tutorials/imgproc/erosion_dilation/erosion_dilation.html

該策略要求折線中的間隙小於相鄰線之間的距離。

如果線條交叉或線條彼此靠得太近,它將不起作用。 但是我認為它在你的例子中會很好地工作。

您還可以使用 erode 函數刪除第三行下方的工件。

我正在研究類似的問題,但它更復雜,並且在某些地方,線條非常接近,因此形態變換最終將它們合並。 如果有人知道任何其他方式,請提出建議。 提前致謝!

來到你的問題。 我認為你甚至不需要形態學操作。 由於您已經對圖像進行了骨架化,您可以簡單地設計一個內核來檢測線條中斷的點並使用距離和斜率(導數)作為標准連接這些點。 我不知道它是否會 100% 有效,但您可以嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM