Saya memiliki gambar (bernama gray_image) berbentuk (1830, 1830). Setelah beberapa pemrosesan gambar (saya telah membuat superpiksel) saya mendapatkan larik 2D bernama segmen (berbentuk (1830, 1830)), yang berisi nilai dari 0 ...

1
Arghira Andrei 5 April 2021, 16:44

1 menjawab

Jawaban Terbaik

Pertama, mari kita asumsikan bahwa array label Anda kondusif untuk membuat array numpy untuk memulai, yaitu, jumlah elemen per label N adalah konstan dan jumlah label M x N adalah sama dengan ukuran gambar. Jika bukan itu masalahnya, Anda tidak dapat membuat array numpy 2D sebagai hasilnya.

Caranya adalah dengan mengidentifikasi daerah. Untuk ini, kami akan menggunakan np.argsort:

idxa = np.argsort(segments, axis=None).reshape(m, n)
arr = gray_image.ravel()[idxa]

Jika label Anda tidak kondusif untuk output array, hasil di atas masih berguna. Alih-alih membentuk kembali idx ke bentuk output yang benar, biarkan apa adanya dan cari tahu indeks terpisah untuk membuat daftar array:

idxl = np.argsort(segments, axis=None)
splits = np.flatnonzero(np.diff(segments.ravel()[idxl])) + 1
lst = np.split(gray_image.ravel()[idxl], splits)

Label yang sesuai dengan setiap segmen tidak harus berbasis nol atau dengan cara apa pun khusus, jadi Anda mungkin ingin mendapatkan nilai sebagai larik dengan panjang yang sama dengan arr/lst:

labels = segments.ravel()[idxa[:, 0]]  # For arr-based solution
labels = segments.ravel()[idxl[np.r_[0, splits]]] # For lst-based solution

Anda dapat dengan mudah mengubah hasilnya menjadi kamus dengan zip labels dan arr atau lst:

dct = dict(zip(labels, lst))  # Works with arr too
1
Mad Physicist 5 April 2021, 14:57