Преобразовать массив numpy с данными изображения в длинный формат - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу преобразовать изображение в «длинный формат» и обратно. Мой код сейчас

import numpy as np
import pandas as pd

img = mpimg.imread('/path/image.png')

image = []
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        image.append([i, j] + img[i, j].tolist())
image = np.array(image)

, но я уверен, что есть более эффективный, но, как ни странно, ничего не мог найти на Inte rnet. Что является более быстрым решением?

Приведенный выше код дает правильный результат. Мое изображение цветное, поэтому img.shape - это три кортежа.

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Вот способ использования np.indices, транспонирование в соответствии с вашим l oop и изменение формы для получения двумерного массива.

ix = np.transpose(np.indices(img.shape[:2]), (1,2,0))
image = np.concatenate((ix, img), axis=2).reshape(-1, image.shape[2] + 2)
1 голос
/ 05 февраля 2020

Вот один из способов -

m,n = img.shape[:2]
r,c = np.mgrid[:m,:n]
out = np.column_stack((r.ravel(), c.ravel(), img.reshape(-1,img.shape[2])))

Альтернатива для получения r,c:

r,c = np.indices(img.shape[:2])

Другой с присвоением массива -

m,n,r = img.shape
out = np.empty((m,n,2+r), dtype=img.dtype)
out[:,:,0] = np.arange(m)[:,None]
out[:,:,1] = np.arange(n)
out[:,:,2:] = img
out = out.reshape(m*n,-1)
0 голосов
/ 06 февраля 2020

Просто чтобы получить время:

import matplotlib.image as mpimg
import numpy as np
import pandas as pd
import time

t0 = time.time()
image_orig = []
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        image_orig.append([i, j] + img[i, j].tolist())
image_orig = np.array(image_orig)
print(time.time() - t0)

t0 = time.time()
ix = np.transpose(np.indices(img.shape[:2]), (1,2,0))
image = np.concatenate((ix, img), axis=2).reshape(-1, img.shape[2] + 2)
print(time.time() - t0)

t0 = time.time()
m,n = img.shape[:2]
r,c = np.indices(img.shape[:2])
out = np.column_stack((r.ravel(), c.ravel(), img.reshape(-1,img.shape[2])))
print(time.time() - t0)

t0 = time.time()
m,n,r = img.shape
out = np.empty((m,n,2+r), dtype=img.dtype)
out[:,:,0] = np.arange(m)[:,None]
out[:,:,1] = np.arange(n)
out[:,:,2:] = img
out = out.reshape(m*n,-1)
print(time.time() - t0)

0.17211008071899414

0.001434326171875

0.0013523101806640625

0.0008423328399658203

1012 *1011* 1012 1013 * Последний вариант кажется самым быстрым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...