#python #image #image-processing #python-imaging-library #blend
#python #изображение #обработка изображений #python-imaging-library #смешивание
Вопрос:
это задание для моего класса, поэтому мне нужно смешивать изображения с помощью python с использованием интерполяции, но я чего-то не хватает, возможно, вы можете помочь мне понять, что.
Вот мой код до сих пор:
from PIL import Image
import numpy as np
image_one=Image.open('6.jpg')
image_two=Image.open('14.jpg')
out=Image.new(image_one.mode, image_two.size)
(l,h)=image_one.size
for j in range(0, h):
for i in range(0, l):
out.putpixel((i,j), (image_one.getpixel((i,j)) * (1.0 - 0.3) image_two.getpixel((i,j)) * 0.3 ))
out.save("test.jpg","JPEG")
out.show()
0.3 — это альфа, которую я хочу для смешивания. два исходных изображения — sime size и mode
и я получаю ошибку, это скриншот ошибки
Ответ №1:
В этом случае вы не можете умножить float на целое число. Преобразуйте последнее в float
float(0.3)
в out.putpixel((i,j), (image_one.getpixel((i,j)) * (1.0 - 0.3) image_two.getpixel((i,j)) * 0.3 ))
Комментарии:
1. как преобразовать 0.3? можете ли вы показать код успеха и объяснить решение? Спасибо
2. попробуйте это: out.putpixel((i, j), (image_one.getpixel((i,j)) * (1.0 — 0.3) image_two.getpixel((i,j)) * float(0.3) ))
3. ну, я вижу, что первая и вторая переменные не имеют плавающего типа
Ответ №2:
Если изображение имеет несколько цветовых каналов (как это обычно бывает в формате JPEG), Image.getpixel
метод PIL возвращает пиксель в виде кортежа. Проблема в том, что кортежи не могут напрямую умножаться на числа с плавающей запятой.
Исправление заключается в переборе каналов с помощью чего-то вроде
[pixel1[c] * (1.0 - 0.3) pixel2[c] * 0.3 for c in range(3)]
Или используйте библиотеку numpy для векторизации операции, например
np.array(pixel1) * (1.0 - 0.3) np.array(pixel2) * 0.3