Если вы, по сути, хотите преобразовать одноканальное изображение (которое по сути должно быть изображением в оттенках серого) в трехканальное изображение в оттенках серого, то же самое, что объединить один и тот же массив изображений трижды вдоль последней оси. Вы можете использовать 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.
Суть в том, что вам не нужно использовать фрейм данных даже для нескольких изображений.