Как я могу преобразовать список numpy.ndarray (каждый numpy.ndarray является вектором 1 * 3) в 2-D матрицу, которая будет представлена ​​как изображение? - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над основной задачей обработки изображений - выполнять матричные операции на основе пикселей с учетом формулы преобразования матрицы. Я читаю значения пикселей (дает мне 1 * 3 кортеж) из положения пикселя (x, y) на изображении и выполняю матричные операции, используя numpy, который возвращает значение numpy.ndarray, и, наконец, мне необходимо сохранить преобразованные значения пикселей в 2d матрице каждая (x, y) координата хранит вектор (1 * 3) преобразованного значения пикселя.

def colortrans(im):
    #(X,Y,Z) = T + [M](*(RGB)(1*3 Vector) 
    # (X,Y,X) = (1*3 tuple) 
    # T = [0,128,128], (a 1*3 vector)
    # M = (3*3 Matrix) 
    # RGB = (1*3 Vector)

    pix = im.load()
    x,y = im.size 
    ycc = []
    #print(ycc.shape)
    m1 = np.array([[0],[128],[128]])
    print(type(m1))
    m2 = np.array([[0.299,0.587,0.114],[-0.168736,-0.331264,0.5],[0.5,-0.418688,-0.081312]])
    print(m2)
    for i in range(x):
        for j in range(y): 
            m = m1.T+np.dot(m2,np.array(pix[i,j]))
            #print(m.shape)
            #print(type(m))
            ycc.append(m)
    #ycc=np.array(ycc)
    print(ycc[1:5])
    mat_ycc = np.reshape(ycc,(x,y))   
    print(len(ycc))
    print (x, y)
    mat_ycc = np.reshape(ycc,(x,y))       
    return  mat_ycc

Я хочу что-то вроде этого, формат, который можно преобразовать в изображение

[(180,128,128),(167,128,128) ... ]

Я понял (этот формат не позволяет мне изменить форму, так как dims не согласен)

[array([[180., 128., 128.]]), array([[167., 128., 128.]]), array([[157., 128., 128.]]), array([[178.772   , 127.      , 128.162624]])]

Ошибка, которую я получаю

len(ycc) = 409600
Image size  = 640*640

Я получаю ошибку:

ValueError: невозможно преобразовать массив размера 1228800 в форму (640 640)

Ответы [ 3 ]

1 голос
/ 05 мая 2019

Вы используете количество пикселей, но каждый пиксель состоит из 3 значений, поэтому вы должны использовать mat_ycc = np.reshape(ycc,(x,y,3)) # note the ,3 part

0 голосов
/ 05 мая 2019

Ваш способ может работать, но слишком сложный. Почему бы вам не использовать blockproc в качестве маленького помощника (я знаю это, потому что я в той же лекции)? Вы можете написать простую функцию, которая преобразует один пиксель из RGB в YCbCr и затем выполняет итерацию с указанным помощником по матрице.

your_matrix = blockproc(your_matrix, (1,3), your_color_transformation)

Вы также можете создать отдельную Матрицу через numpy.zeros(size) и затем записать свои решения в нужное место. Здесь вы можете работать с (Y,Cb,Cr) тройками. Возьмите каждый элемент с изображения и обработайте его отдельно, создайте тройку и запишите ее в нужное место.

0 голосов
/ 05 мая 2019

Я думаю, что вы следуете немного сложным путем.У меня мало предложений:

  • Создать U = np.zeroes (x, y, 3)

  • применить для цикла на 2-мерном изображении

    • rgb = выбрать значение пикселя из всех каналов
    • ycc = применить матрицу op
    • U [i, j,:] = ycc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...