не удается умножить последовательность на не-int типа ‘float’ (смешивание изображений без библиотеки)

#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