У меня есть данные изображения. Как я могу разделить его на x, y и значение?
данные изображения
[[38 0 0 ... 0 0 0]
[46 3 0 ... 0 0 0]
[46 3 0 ... 0 0 0]
...
[74 0 0 ... 0 0 0]
[74 0 0 ... 0 0 0]
[74 0 0 ... 0 0 0]]
и их должно быть?
x = 0, y = 0, value = 38
x = 0, y = 1, value = 46
...
Как я могу разделить его на:
x = []
y = []
value = []
только for
метода цикла работает?
Спасибо за любую помощь
IIUC, я думаю, вы можете использовать np.indices
. Возьмем ваш пример:
>>> img
array([[38, 0, 0, 0, 0, 0],
[46, 3, 0, 0, 0, 0],
[46, 3, 0, 0, 0, 0],
[74, 0, 0, 0, 0, 0],
[74, 0, 0, 0, 0, 0],
[74, 0, 0, 0, 0, 0]])
value = img.flatten()
y,x = np.indices(img.shape).reshape(-1,len(value))
>>> x
array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5])
>>> y
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5])
>>> value
array([38, 0, 0, 0, 0, 0, 46, 3, 0, 0, 0, 0, 46, 3, 0, 0, 0,
0, 74, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 74, 0, 0, 0,
0, 0])
Итак, где x
равно 0, а y
равно 0, вы получаете value
38, где x
равно 0, а y
равно 1, вы получаете value
46 и т.д.
Изменить: в своем комментарии вы сказали, что хотите отфильтровать нули. Вы можете сделать это с помощью np.where
и np.nonzero
:
y,x = np.where(img)
value = img[np.nonzero(img)]
>>> y
array([0, 1, 1, 2, 2, 3, 4, 5])
>>> x
array([0, 0, 1, 0, 1, 0, 0, 0])
>>> value
array([38, 46, 3, 46, 3, 74, 74, 74])
если ваше изображение окрашено, оно часто используется в формате RGB (3 канала), если оно в оттенках серого, оно будет иметь 1 канал. Таким образом, форма массива будет (img_height, img_width, number_of_channels)
Поняв форму, вы можете правильно использовать imread
из PIL
или imread
из matplotlib
для загрузки изображения, а затем перевернуть их в массив с помощью myarray = numpy.array(your_loaded_img)
. Поскольку это массив numpy, вы можете вызывать значения ячейки myarray[x,y]
np.where
иnp.nonzero