Как разделить данные изображения на координаты x, y? (Python)

1

У меня есть данные изображения. Как я могу разделить его на 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 метода цикла работает?

Спасибо за любую помощь

Теги:
numpy

2 ответа

3
Лучший ответ

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])
  • 0
    как насчет фильтра 0 по значению? это означает, что если значение = 0, x, y не запишет его
  • 0
    Смотрите мой eidt, вы можете сделать это с np.where и np.nonzero
Показать ещё 1 комментарий
0

если ваше изображение окрашено, оно часто используется в формате RGB (3 канала), если оно в оттенках серого, оно будет иметь 1 канал. Таким образом, форма массива будет (img_height, img_width, number_of_channels)

Поняв форму, вы можете правильно использовать imread из PIL или imread из matplotlib для загрузки изображения, а затем перевернуть их в массив с помощью myarray = numpy.array(your_loaded_img). Поскольку это массив numpy, вы можете вызывать значения ячейки myarray[x,y]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню