python 轮廓矩阵_二进制二维矩阵的python轮廓
我想計算一個二元NxM矩陣中一個形狀的凸殼。凸殼算法需要一個坐標列表,所以我采用紐比。阿爾格何處(im)具有所有形狀點坐標。但是,這些點中的大多數并沒有對凸包起作用(它們位于形狀的內部)。因為凸包計算時間至少與輸入的點數成正比,所以我設計了一個想法,預先過濾掉過多無用的點,只通過那些跨越輪廓的點。這個想法很簡單,對于二進制NxM矩陣中的每一行,我只取最小和最大的索引。例如:im = np.array([[1,1,1,0],
[1,0,1,1],
[1,1,0,1],
[0,0,0,0],
[0,1,1,1]], dtype=np.bool)
outline = somefunc(im)
然后大綱應該是(在元組中或者作為一個5x2 numpy數組,我不介意):
^{pr2}$
任何緊圍繞這個形狀(im)的凸殼,必須是這些點(輪廓)的子集。換句話說,如果“somefunc()”能夠有效地過濾內部點,那么它將為凸殼計算節省時間。在
我有一些代碼可以實現上面的技巧,但我希望有人有一個更聰明(讀得更快)的方法,因為我需要運行它很多次。我的密碼是:# I have a 2D binary field. random for the purpose of demonstration.
import numpy as np
im = np.random.random((320,360)) > 0.9
# This is my algorithm so far. Notice that coords is sorted.
coords = np.argwhere(im)
left = np.roll(coords[:,0], 1, axis=0) != coords[:,0]
outline = np.vstack([coords[left], coords[left[1:]], coords[-1]])
我的另一個想法是使用Python的reduce(),這樣我只需要運行一次坐標列表。但我很難找到一個好的約化函數。在
任何幫助都將不勝感激!在
編輯
同時,我發現了一種從im直接到outline的更快的方法。至少對于大圖像來說,這要快得多。在顯然沒有外部解決方案的情況下,我把它作為這個問題的解決方案。在
不過,如果有人知道更快的方法,請大聲說出來:)
總結
以上是生活随笔為你收集整理的python 轮廓矩阵_二进制二维矩阵的python轮廓的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python request url 转
- 下一篇: python查询mysql表名字动态日期
