6

我想計算給定numpy陣列結構的周長。周長我的意思是numpy數組中結構的確切周長。該結構可以包括孔。計算numpy陣列的周長

我目前的形式給出的是這樣的:

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1:5, 1:5] = 1;a[3,3] = 0 
# Way 1 
s = ndimage.generate_binary_structure(2,1) 
c = ndimage.binary_dilation(a,s).astype(a.dtype) 
b = c - a 
numpy.sum(b) # The result, however the hole is calculated as 1, although there are 4 edges 

# Way 2 
b = ndimage.distance_transform_cdt(a == 0,metric='taxicab') == 1 
b = b.astype(int) 
numpy.sum(b) # same as above 

enter image description here

正如你可以看到它顯示所有相鄰的細胞,但是它們的總和不等於補丁的周長。示例數組中的孔計算爲1,但它正確地具有4條邊。有不同形狀的大孔有類似的問題。

我在過去曾問過類似的問題,但都提供瞭解決方案,但最終無法解決正確的輸出值問題。 有人有一個想法如何做到這一點? 請不要包含比numpy,scipy和基礎包更多的其他軟件包。

+1

在這個例子中你期望什麼值? – Eric

+0

一個整數值。在上述測試數據集中,最終值應該是20,因爲有20個邊。 – Curlew

回答

4

您的意思是,在圖像中,將藍色和紅色瓷磚分開的長度爲1的邊的總數是多少?在上面的圖片中,這個數字是28.在代碼中給出的例子(略有不同,沒有4個角落與其他邊框的區別),它將是20.

如果這就是你要計算,你可以這樣做:

numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])

+0

圖像是生成的數組(b)繪製。 – Curlew

+0

是的,作品!我選擇了你的解決方案,因爲它更小更快 – Curlew

5

計數在內部及邊緣的邊數(假定二值圖像):

n_interior = abs(diff(a, axis=0)).sum() + abs(diff(a, axis=1)).sum() 
n_boundary = a[0,:].sum() + a[:,0].sum() + a[-1,:].sum() + a[:,-1].sum() 
perimeter = n_interior + n_boundary 

,您可以省去n_boundary如果圖像是合適的y零填充。