Получить изображение RGB из 1-мерного массива, содержащего данные изображения RGB - PullRequest
1 голос
/ 20 февраля 2020

Я передаю массив C, содержащий данные изображения RGB, функции в Python для дальнейшей обработки изображения. Как я могу получить это изображение и отобразить его в Python?

массив C с именем c_data , который содержит данные изображения RGB, был создан

for(k = 0; k < c; ++k){
    for(j = 0; j < h; ++j){
        for(i = 0; i < w; ++i){
            int dst_index = i + w*j + w*h*k;
            int src_index = k + c*i + c*w*j;
            c_data[dst_index] = (float)stb_im[src_index]/255.;
        }
    }
}

массив C преобразуется в массив numpy и передается в функцию Python со следующим заголовком через параметр с именем im_data

def read_img_from_c(im_data, im_h, im_w):

print(im_h) // 480
print(im_w) // 640
print(im_data.shape) // (921600,) --> (480*640*3)

Я пытался просто изменить форму массива numpy с помощью

data = im_data.reshape((im_h, im_w, 3)) 

и создать объект изображения PIL с помощью

img = PIL.Image.fromarray(data, 'RGB')

, но при запуске следующей команды

img.show()

Я получил следующее, а не исходное изображение.

enter image description here

Обновление: я следую предложению, умножив эти нормализованные значения пикселей на 255,0, приведу numpy массив для ввода типа int и plot:

im_data = (im_data*255.0).astype(np.uint8)
im_data = im_data.reshape((im_h, im_w, 3))
img = Image.fromarray(im_data, 'RGB')
img.show()

и я получил изображение с повторяющимися узорами вместо одного большого изображения RGB:

The original image was from the MOT16-02 sequence of the MOTChallenge Benchmark dataset

Ответы [ 2 ]

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

Попробуйте умножить data на 255 снова и округлить до целого. Я думаю, что значения в кортеже RGB должны быть в диапазоне 0-255, а не 0-1.

0 голосов
/ 21 февраля 2020

Потратив день на восстановление этого изображения, я нашел решение.

Я считаю, что сглаженная версия пикселей моего нормализованного изображения была сохранена в одномерном массиве с именем im_data, который выглядит следующим образом: это

[r1 g1 b1 r2 g2 b2 ... rN gN bN]

, где индекс N - это количество пикселей.

Итак, первым шагом я умножаю каждый пиксель на 255.0, чтобы получить значения пикселей между 0-255:

import numpy as np
im_data = (im_data*255.0).astype(np.uint8)

и вместо того, чтобы изменять форму массива, используя форму (im_h, im_w, 3) Я изменяю его, используя форму (3, im_h, im_w) так:

im_data = im.reshape((3, im_h, im_w))

Наконец, я транспонирую массив результата numpy, чтобы получить правильную форму изображения, которая равна (im_h, im_w, 3), поэтому:

im_data = np.transpose(im, (1, 2, 0))

Наконец,

img = Image.fromarray(im_data, 'RGB')
img.show() 

и boom: enter image description here (изображение является одним из набора данных MOTChallenge https://motchallenge.net/)

Если честно, я не совсем уверен, как все это работает. Я просто возиться с операциями с массивами.

...