0

以下に示す偽色の画像があります。この画像を、偽色の領域ごとにラベルを割り当てることができる配列に変換したいと思います。したがって、そのラベル値を使用するだけで画像にアクセスできます。使ってみました

 r_channel = image[:, :, 0]
    g_channel = image[:, :, 1]
    b_channel = image[:, :, 2]
    label_map = (0.2989) * (r_channel) + (0.5870) * g_channel + (0.1140) * b_channel
    label_map = label_map * 500 / 255
    label_map = np.round(label_map).astype(int)

しかし、問題は、この場合、ラベルが繰り返されることです。各地域に一意のラベルを付けたいと思います。できれば1から昇順でラベルを付けてください。

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

4

2 に答える 2

1

ゼロ以外の値が「オブジェクト」と見なされ、ゼロが「背景」と見なされる値の配列が与えられた場合、scipy.ndimage.label関数を使用してオブジェクトにラベルを付けることができます。

import scipy
from scipy import ndimage
import numpy as np

fname='/tmp/splotches.png'
arr = scipy.misc.imread(fname) 
print(arr.shape)
# (160, 240, 3)

r, g, b = np.rollaxis(arr, axis = -1)
label_map = 0.2989 * r + 0.5870 * g + 0.1140 * b
label_map = label_map * 500 / 255
label_map = np.round(label_map).astype(int)
print(label_map.shape)
# (160, 240)

seen = set()
region = {}
i = 1
for val in label_map.flat:
    if val not in seen:
        seen.add(val)
        mask = (label_map == val)
        labeled, nr_objects = ndimage.label(mask) 
        for label in range(1, nr_objects+1):
            assert np.any(labeled==label)
            region[i] = labeled==label
            i += 1

print(len(region))
# 382

を使用してscipy.ndimage.label、382の領域が見つかりました。

于 2013-03-26T12:42:03.067 に答える
0

ラベルを取得するユニークな方法を見つけました。これは私がしたことです:

    r_channel = image[:, :, 0]
    g_channel = image[:, :, 1]
    b_channel = image[:, :, 2]
    label_map = 1000000 * (r_channel) + 1000 * g_channel + b_channel
    label_map = np.round(label_map).astype(int)

したがって、スーパーピクセル領域ごとに一意のラベルを取得できるようになりました。

于 2013-03-27T10:31:49.950 に答える