Обработка изображений: объединение изображений с PIL.paste - PullRequest
0 голосов
/ 20 октября 2018

У меня есть 2 списка изображений PNG, список _c и список _v.Я хочу вставить _v в _c, используя код, подобный следующему:

from PIL import Image

background = [Image.open(path, 'r') for path in glob.glob(list_c_path)]
foreground = [Image.open(path, 'r') for path in glob.glob(list_v_path)]

for im in range(len(background)):
    pasted = background[im].paste(foreground[im], (0, 0), foreground[im])

Этот код не будет работать, но он даст вам представление о том, чего я хочу.Мне также нужно, чтобы изображения были прочитаны в оттенках серого до их вставки.

Вот пример фонового изображения:

enter image description here

Вот пример изображения на переднем плане:

enter image description here

И это желаемый результат:

enter image description here

Я вставил эти изображения, используя этот код:

background = Image.open('1000_c.png')
foreground = Image.open('1000_v.png')


background.paste(foreground, (0, 0), foreground)
background.save('example.png')

Как мне этого добиться?

Заранее спасибо

1 Ответ

0 голосов
/ 21 октября 2018

Мммм ... ваши результирующие изображения идентичны вашим изображениям на переднем плане, потому что, хотя изображения на переднем плане имеют слой альфа / прозрачности, они полностью непрозрачны и полностью скрывают фон.Вам нужно переосмыслить!

Вы можете использовать ImageMagick в Терминале для проверки ваших изображений.Итак, давайте посмотрим на ваше изображение переднего плана:

identify -verbose fg.png

Пример вывода

Image: fg.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 118x128+0+0
  Units: Undefined
  Colorspace: sRGB
  Type: PaletteAlpha             <--- Image does have alpha/transparency layer
  Base type: Undefined
  Endianess: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
    Alpha: 1-bit
  Channel statistics:
    Pixels: 15104
    Red:
      min: 30  (0.117647)
      ...
      ...
    Alpha:
      min: 255  (1)              <--- ... but alpha layer is fully opaque
      max: 255 (1)
      mean: 255 (1)
      standard deviation: 0 (0)
      kurtosis: 8.192e+51
      skewness: 1e+36
      entropy: 0

Так что нет смысла вставлять полностью непрозрачное изображение поверх фона, так как онобудет полностью скрывать его.

Если мы пробьем прозрачное отверстие на вашем переднем изображении с помощью ImageMagick :

convert fg.png -region 100x100+9+14 -alpha transparent fg.png

Теперь это выглядит так:

enter image description here

И если мы затем запустим ваш код:

#!/usr/local/bin/python3

from PIL import Image
background = Image.open('bg.png')
foreground = Image.open('fg.png')

background.paste(foreground, (0, 0), foreground)
background.save('result.png')

Это работает:

enter image description here

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


Если вы хотите усреднить два изображения, или на самом деле, сделать любое другое смешиваниережиме, вы могли бы рассмотреть использование модуля ImageChops Подушки - документация здесь .Таким образом, среднее значение будет выглядеть так:

#!/usr/local/bin/python3

from PIL import Image, ImageChops
bg = Image.open('bg.png')
fg = Image.open('fg.png')

# Average the two images, i.e. add and divide by 2
result = ImageChops.add(bg, fg, scale=2.0)
result.save('result.png')

enter image description here

...