6

与えられたnumpy配列構造の周囲を計算したいと思います。周囲とは、numpy配列内の構造体の正確な周囲を意味します。構造には穴が含まれる可能性があります。numpy配列の周囲を計算する

私の現在のaproachはこのようなものです:あなたはそれがすべての隣接するセルを表示見ることができるように

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

、しかし、それらの合計は、パッチの周囲を等しくありません。サンプル配列の穴は、正しく4つの辺を持っていますが、1として計算されます。異なる形状の大きな穴にも同様の問題があります。

私は過去に同様の質問をしましたが、最終的に正しい出力値で何らかの形で解決されなかったソリューションをすべて提供しました。 誰かがこれを達成するためのアイデアを持っていますか? 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ゼロ詰め。

関連する問題