Экспортированное изображение RGB с помощью Pillow, Numpy в Python имеет только оттенки серого

#python #numpy #python-imaging-library #rgb

#python #numpy #python-imaging-library #rgb

Вопрос:

Предисловие: Здравствуйте, у меня есть проект, над которым я работаю, где я беру доминирующий цвет каждого кадра видео, сохраняя этот цвет (в примере формата RGB: (44, 32, 14) ), затем экспортируйте эти цвета в изображение размером x пикселей на x пикселей.

Это процесс из двух частей (две отдельные программы), в котором я сначала выбираю наиболее доминирующий цвет каждого кадра этого видео, сохраняю его в обычный текстовый файл, где символом окончания строки является символ новой строки. Это уже сделано, и теперь у меня есть текстовый файл, который содержит все доминирующие цвета каждого кадра (всего 5169 кадров), я проверил, чтобы убедиться, что эти данные RGB, которые находятся в текстовом документе, не имеют оттенков серого, а это не так, вот несколько строк в качестве примера:

 (18, 9, 17)
(19, 9, 17)
(22, 11, 18)
(23, 11, 18)
(24, 11, 18)
(209, 129, 28)
(212, 135, 31)
(214, 140, 33)
(215, 141, 31)
  

Вот полный список цветов RGB

Моя проблема:

Итак, вот мой код для экспорта изображения:

 from PIL import Image
from ast import literal_eval as make_tuple
import numpy as np

# Create an array for lines of text file
lines = []
# Open file
with open("myOutFile.txt") as file_in:
    for line in file_in:
        # Strip out new line, turn into Tuple data-type, append to list
        lines.append(make_tuple(line.strip("n")))

# Convert the pixels into an array using numpy
array = np.array(lines, dtype=np.uint8)

# Create new Image object with non-dynamic 6k,6k image, this doesn't seem to work
new_image = Image.new("RGB", (6000,6000))
# Create image using array
new_image = Image.fromarray(array)
# Save
new_image.save('new.png')
  

Как я уже говорил ранее, визуализируемое изображение имеет только оттенки серого, где я точно знаю, что в наборе данных есть несколько цветов. Вот выходное изображение. Это довольно сложно увидеть, поэтому вы можете сохранить и открыть его в paint или какой-либо программе, где вы можете увеличить масштаб, чтобы увидеть отдельные пиксели.

При создании объекта Image я установил его в режим «RGB», получается оттенки серого. Я даже установил режим в «Image.fromarray (array)» на RGB, но все равно получаю тот же результат. Выходное разрешение изображения составляет 3 x 5169. 5169 пикселей точно соответствуют количеству кадров, которые я получаю, и, если вы посмотрите, даже совпадают с изменением угла наклона камеры в видео, что означает, что оно, по крайней мере, работает. Но меня беспокоит другое: почему оно имеет ширину 3 пикселя? Если вы посмотрите здесь, вы увидите, что 3 пикселя даже не одного цвета… Имеет ли это какое-то отношение к RGB? Я хочу, чтобы оно составляло всего 1 пиксель на X на кадр, чтобы потом я мог перенести его в Photoshop и создать увеличенную фотографию.

Кроме того, кто-нибудь знает, могу ли я экспортировать его по оси X (слева направо, а не вверх и вниз)?

Комментарии:

1. Строка new_image = Image.new("RGB", (6000,6000)) фактически бесполезна, потому что вы переназначаете переменную в строке после.

Ответ №1:

Вы создаете 2D-массив, lines это ось y, а кортежи составляют ось x.

То есть с заданными данными у вас есть 9 строк и 3 столбца. Каждый столбец имеет только 1 значение, поэтому это не может быть цвет RGB, просто значение в оттенках серого.

Если вам нужно изображение из 9 строк только с 1 пикселем, убедитесь, что вы поместили кортеж в массив. Массив создаст ось x, а кортеж затем задаст цвет RGB.

Непроверенный:

 with open("myOutFile.txt") as file_in:
    for line in file_in:
        # Strip out new line, turn into Tuple data-type, append to list
        lines.append([make_tuple(line.strip("n"))])
#                    ^                            ^  note these array brackets
  

Если Image.fromArray() он не распознает его как RGB, вы также можете определить режим с помощью new_image = Image.fromarray(array, "RGB")

Комментарии:

1. БОЛЬШОЕ ВАМ СПАСИБО! Это сработало с потрясающим результатом !!! i.paste.pics/56ea8a53003cde3e7c91f2b8ca45307c.png

2. @nmendez: это выглядит красиво