-3

次のバイナリ イメージがあるとします。

0010
0101
0101
0010
0100
1010
0100
0000

0 は背景のピクセルを表し、1 は画像のピクセルを表します。ご覧のとおり、この画像には 2 つの穴があります。アルゴリズムを使用してこの画像の穴の数を取得する方法はありますか?(Java または Python で、Matlab ではありません)

4

3 に答える 3

2

コードとして提示されたいくつかのアイデアを次に示します (必要なものではない可能性があります)。

問題は、私があなたの例を理解していないことです。近傍定義に応じて、異なる結果が生じる可能性があります。

  • 8 個の近傍がある場合、すべてのゼロが何らかの形で接続されます (周囲の 1 についてはどういう意味ですか?)。
  • 4 つの近隣がある場合、4 つの 1 で囲まれたそれぞれが新しいホールを表します。
    • もちろん、これを後処理することはできますが、質問はまだ不明です

コード

import numpy as np
from skimage.measure import label

img = np.array([[0,0,1,0],
                [0,1,0,1],
                [0,1,0,1],
                [0,0,1,0],
                [0,1,0,0],
                [1,0,1,0],
                [0,1,0,0],
                [0,0,0,0]])

labels = label(img, connectivity=1, background=-1)  # conn=1 -> 4 neighbors
label_vals = np.unique(labels)                      # conn=2 -> 8 neighbors

counter = 0
for i in label_vals:
    indices = np.where(labels == i)
    if indices:
        if img[indices][0] == 0:
            print('hole: ', indices)
            counter += 1


print(img)
print(labels)
print(counter)

出力

('hole: ', (array([0, 0, 1, 2, 3, 3, 4]), array([0, 1, 0, 0, 0, 1, 0])))
('hole: ', (array([0]), array([3])))
('hole: ', (array([1, 2]), array([2, 2])))
('hole: ', (array([3, 4, 4, 5, 6, 6, 6, 7, 7, 7, 7]), array([3, 2, 3, 3, 0, 2, 3, 0, 1, 2, 3])))
('hole: ', (array([5]), array([1])))
[[0 0 1 0]
 [0 1 0 1]
 [0 1 0 1]
 [0 0 1 0]
 [0 1 0 0]
 [1 0 1 0]
 [0 1 0 0]
 [0 0 0 0]]
[[ 1  1  2  3]
 [ 1  4  5  6]
 [ 1  4  5  6]
 [ 1  1  7  8]
 [ 1  9  8  8]
 [10 11 12  8]
 [ 8 13  8  8]
 [ 8  8  8  8]]
5
于 2016-10-19T11:36:36.600 に答える