簡體   English   中英

python和opencv中的快速組件標簽

[英]Fast component labelling in python and opencv

我作為實施的標記算法本文使用python和OpenCV。 它要求逐像素檢查輸入圖像,並執行所謂的輪廓跟蹤子例程,以將標簽分配給二進制圖像的斑點。

我設法使其運行,但它看起來非常慢。 對代碼進行性能分析表明,訪問像素的for循環似乎是瓶頸。 256px * 256px的圖像大約需要200毫秒。 這大致是我的工作:

for i in image.height:
    for j in image.width:
        p = image[i, j]
            pa = image[i - 1, j]
            pb = image[i + 1, j] 
            # etc...

其中“ image”是二進制opencv映像。

我想知道是否有更快的方法可以將其用於視頻應用程序。 對於相同的問題大小,我將目標運行時間定為40-50ms,以獲得20-25fps。 10-15fps也可能是可以接受的(運行時間66-100ms)。

任何提示,想法我能做的都非常感謝。

我見過很多帖子,對缺少OpenCV標簽感到遺憾。

正如@ malloc47所說, scipy.ndimage.label將起作用。 我使用過它,但是當我尋找圖像中最大的斑點時,我對它的性能並不滿意。 我並不是特別需要標簽,因此最終使用了cv2.findContourscv2.contourArea來隔離最大的標簽:

# The [0] is because I didn't care about the hierarchy, which is the second
# return value of cv2.findContours.
contours = cv2.findContours(numpy_array,
                            mode=cv2.RETR_EXTERNAL,
                            method=cv2.CHAIN_APPROX_SIMPLE
                            )[0]

areas = [cv2.contourArea(ctr) for ctr in contours]
max_contour = [contours[areas.index(max(areas))]]

對於我來說,這比scipy.ndimage.label快得多,結果非常相似。 就像我說的那樣,這並非完全是一種標簽,但是可能可以使用輪廓查找器給出一個相當好的標簽。

適用於Python的最新OpenCV綁定返回numpy數據類型,這意味着您可以使用完整的numpy武庫。 通常使用ndenumerate循環遍歷numpy中的2D數組(帶有索引),這應該至少提供一點加速(因為它是為ND數組優化的單循環)。 您可以考慮使用numpy vectorize來提高速度,但是如果需要數組的索引,則需要ndenumerate

除此之外,您最好的選擇可能是使用C編寫瓶頸操作。

更新資料

如果有幫助的話,我相信scipy.ndimage.label確實可以完成您要嘗試的操作,甚至可以使用相同的算法。

暫無
暫無

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

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