2014-11-19 2 views
10

Я хочу преобразовать изображение в 2D-массив с 5 столбцами, где каждая строка имеет форму [r, g, b, x, y]. x, y - позиция пикселя, а r, g, b - значения пикселей. (Я буду использовать этот массив в качестве входных данных для модели машинного обучения). Существует ли более эффективная реализация, чем в python?Преобразование изображения в 2D-массив в python

import Image 
import numpy as np 

im = Image.open("farm.jpg") 
col,row = im.size 
data = np.zeros((row*col, 5)) 
pixels = im.load() 
for i in range(row): 
    for j in range(col): 
     r,g,b = pixels[i,j] 
     data[i*col + j,:] = r,g,b,i,j 

ответ

5

Я не уверен, что это очень эффективно. Но здесь вы идете, скажем arr = np.array(im); то вы можете сделать что-то подобное.

>>> arr = np.arange(150).reshape(5, 10, 3) 
>>> x, y, z = arr.shape 
>>> indices = np.vstack(np.unravel_index(np.arange(x*y), (y, x))).T 
#or indices = np.hstack((np.repeat(np.arange(y), x)[:,np.newaxis], np.tile(np.arange(x), y)[:,np.newaxis])) 
>>> np.hstack((arr.reshape(x*y, z), indices)) 
array([[ 0, 1, 2, 0, 0], 
     [ 3, 4, 5, 0, 1], 
     [ 6, 7, 8, 0, 2], 
     [ 9, 10, 11, 0, 3], 
     [ 12, 13, 14, 0, 4], 
     [ 15, 16, 17, 1, 0], 
     [ 18, 19, 20, 1, 1], 
     [ 21, 22, 23, 1, 2], 
     [ 24, 25, 26, 1, 3], 
     [ 27, 28, 29, 1, 4], 
     [ 30, 31, 32, 2, 0], 
     [ 33, 34, 35, 2, 1], 
     [ 36, 37, 38, 2, 2], 
     ... 
     [129, 130, 131, 8, 3], 
     [132, 133, 134, 8, 4], 
     [135, 136, 137, 9, 0], 
     [138, 139, 140, 9, 1], 
     [141, 142, 143, 9, 2], 
     [144, 145, 146, 9, 3], 
     [147, 148, 149, 9, 4]]) 
+0

Можно использовать numpay.asarray (im) или numpy.array (im) для преобразования изображения в массив numpy. – Sanket

12

Я должен был написать это в последнее время и в конечном итоге с

indices = np.dstack(np.indices(im.shape[:2])) 
data = np.concatenate((im, indices), axis=-1) 

Где im является Numpy массив. Вы, вероятно, лучше читать изображения прямо в Numpy массивы с

from scipy.misc import imread 
im = imread("farm.jpg") 

Или, еще лучше, если у вас есть Scikit Изображение установлен

from skimage.io import imread 
im = imread("farm.jpg") 
1

Я использовал «+», чтобы объединить два кортежа, и использовать .append() сделать список данных. Нет необходимости здесь использовать Numpy.

row,col = im.size 
data=[] #r,g,b,i,j 
pixels=im.load() 
for i in range(row): 
    for j in range(col): 
    data.append(pixels[i,j]+(i,j)) 
Смежные вопросы