6

与えられた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

ここに画像の説明を入力してください

ご覧のとおり、隣接するすべてのセルが表示されますが、それらの合計はパッチの周囲と等しくありません。例の配列の穴は、正しく4つのエッジがありますが、1として計算されます。さまざまな形状の大きな穴にも同様の問題があります。

私は過去に同様の質問をしましたが、すべてが解決策を提供しましたが、最終的には正しい出力値で解決されませんでした。誰かがこれを達成する方法を知っていますか?numpy、scipy、および基本パッケージ以外のパッケージはご遠慮ください。

4

3 に答える 3

6

内部とエッジのエッジの数を数えます(バイナリイメージを想定):

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を省略できます。

于 2012-11-18T20:53:36.203 に答える
4

画像では、青色のタイルと赤色のタイルを分離する長さ1のエッジの総数を意味しますか?上の図では、この数は28になります。コードで指定する例では(わずかに異なり、4つのコーナーが他の境界タイルと異なるわけではありません)、20になります。

それがあなたが計算したいものであるならば、あなたは次のようなことをすることができます:

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

于 2012-11-18T20:53:20.730 に答える
0

既存のピクセルにも同じ問題があるため、答えを追加します。ピクセルが上のピクセルと左のピクセルの両方と異なる場合、次のようにすると2回カウントされます。

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

これは、要素ごとに、または合計を実行する前に使用することで修正されます。

np.logical_or(
    (a[:,1:] != a[:,:-1])[1:,:], 
    (a[1:,:] != a[:-1,:])[:,1:]).sum()
于 2020-04-06T21:16:37.127 に答える