Преобразование одномерного кадра данных в трехмерное для изображения RGB - PullRequest
0 голосов
/ 13 января 2019

У меня есть фрейм данных из 2304 столбцов, так как это 48 * 48 пикселей изображения, когда я конвертирую его в один канал с помощью этого кода

x = (df.iloc[:,1:].values).astype('float32')

x = x.reshape(-1,48,48,1)

его идеальный результат формы

(48*48*1)

с генерацией точного изображения по этому коду:

plt.imshow(x[0][:,:,0])

Я хочу превратить его в трехмерный, как в трех каналах. Я пытаюсь объединить df 3 раза и сделать это (48*48*3), оно успешно меняет форму df, но я не могу сгенерировать изображение снова,

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Если вы, по сути, хотите преобразовать одноканальное изображение (которое по сути должно быть изображением в оттенках серого) в трехканальное изображение в оттенках серого, то же самое, что объединить один и тот же массив изображений трижды вдоль последней оси. Вы можете использовать np.concatenate для достижения желаемого результата.

import numpy as np
a = np.zeros((2304), dtype = np.uint8) #Just a dummy array representing a single pic
single_channel = a.reshape(48, 48, 1)

result = np.concatenate([single_channel,single_channel,single_channel], axis = -1)
print(result.shape) #(48, 48, 3)

На данный момент у вас должен быть массив, который может быть принят любой библиотекой изображений. Просто добавьте пример кода, чтобы показать, как вы можете приступить к созданию изображения из массива.

import cv2
cv2.imwrite("hi.jpg", result)

Как указывалось ранее, используйте numpy вместо панд для манипулирования изображениями.

РЕДАКТИРОВАТЬ : Если вы, к сожалению, начинали с фрейма данных, вы всегда можете преобразовать его в массив с дополнительным измерением, представляющим каждое изображение.

import pandas as pd
import cv2
import numpy as np

a = np.zeros((2304), dtype = np.uint8) #dummy row

dummy_df = pd.DataFrame(np.concatenate([a.reshape(1,-1)]*10)) #dummy df with 10 rows.
print(dummy_df.shape) #(10, 2304) 
arr_images = np.array(dummy_df, dtype = np.uint8)
print(arr_images.shape) #(10, 2304)
multiple_single_channel = arr_images.reshape(-1, 48, 48, 1)
print(multiple_single_channel.shape) #(10, 48, 48, 1)
result = np.concatenate([multiple_single_channel] * 3, axis = -1)
print(result.shape) #(10, 48, 48, 3)

for i,img in enumerate(result):
    print(i)
    cv2.imwrite("{}.jpg".format(i), img)
    #do something with image. you PROBABLY don't want to run this for 35k images though.

Суть в том, что вам не нужно использовать фрейм данных даже для нескольких изображений.

0 голосов
/ 13 января 2019

1) Не используйте панд

2) вы не можете преобразовать 1-канальное изображение в 3 канала,

3) Не используйте float32, изображения обычно 8bit (np.uint8)

4) использовать NumPy в сочетании с OpenCV или с подушкой.

5) Не используйте matplotlib для генерации изображений. используйте библиотеки, упомянутые в 4.

6) если у вас есть массив с формой (x, y, 3), нет ничего проще, чем сгенерировать изображение с помощью opencv cv2.imshow ('image', array)

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