簡體   English   中英

查找圖像中所有像素對之間的距離

[英]Find distance between all pairs of pixels in an image

我有一個形狀為(H, W)numpy.array ,用於存儲圖像的像素強度。 我想生成一個新的形狀數組(H, W, H, W) ,它存儲圖像中每對像素之間的歐幾里德距離(像素之間的“空間”距離;而不是它們的強度差異)。

解決方案嘗試

以下方法完全符合我的要求,但速度非常慢。 我正在尋找一種快速的方法來做到這一點。

d = numpy.zeros((H, W, H, W)) # array to store distances.
for x1 in range(H):
    for y1 in range(W):
        for x2 in range(H):
            for y2 in range(W):
                d[x1, y1, x2, y2] = numpy.sqrt( (x2-x1)**2 + (y2-y1)**2 )

額外的細節

這是我的問題的更多詳細信息。 上面更簡單問題的解決方案可能足以讓我弄清楚其余的問題。

  • 在我的例子中,圖像實際上是一個 3D 醫學圖像(即形狀為(H, W, D)numpy.array )。
  • 3D 像素可能不是立方體(例如,每個像素可能代表 1mm x 2mm x 3mm 的體積)。

我們可以使用np.ogrid設置具有1D范圍數組的開放網格,它可以在矢量化解決方案的相同迭代器符號中進行操作,這將利用broadcasting進行性能。 促進 :

X1,Y1,X2,Y2 = np.ogrid[:H,:W,:H,:W]
d_out = numpy.sqrt( (X2-X1)**2 + (Y2-Y1)**2 )

要保存在兩個開放網格上:

X,Y = np.ogrid[:H,:W]
d_out = numpy.sqrt( (X[:,:,None,None]-X)**2 + (Y[:,:,None,None]-Y)**2 )

如果我們正在處理大型數組,請考慮使用numexpr進一步提升:

import numexpr as ne

d_out = ne.evaluate('sqrt( (X2-X1)**2 + (Y2-Y1)**2 )')

暫無
暫無

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

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