#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: это выглядит красиво