Пакетное наложение / объединение изображений с похожими именами файлов - PullRequest
2 голосов
/ 07 марта 2020

У меня есть 1000+ изображений в каталоге с пометкой:
x_1.bmp
x_2.bmp
x_3.bmp
y_1.bmp
y_3.bmp
... et c

В идеале я хотел бы наложить все файлы с одинаковыми именами и экспортировать их как x_P.png, y_P.png и др. c. как ниже. Все изображения имеют одинаковый размер, и ни один из цветных пикселей не перекрывается.

x_1 example + x_2 example + x_3 example = enter image description here

Я пытался выполнить пакетное наложение изображений с помощью функции сценария слияния-разделения в GIMP / BIMP, но безуспешно. Сможет ли PIL.Image.Image.paste() сделать это или что-то подобное? Я использую Windows и Python 3.7.3

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Отработка пример из другого ответа Мне удалось отсортировать это и сохранить значения RGB.

import os
from PIL import Image
import PIL
import itertools as it


path = path/to/files
alpha = 1
list_of_imgs = sorted(os.listdir('path'))
for k,g in it.groupby(list_of_imgs, key=lambda x: x.split('_')[0]): 
    img = Image.open('path/{}'.format(next(g)),'r').convert('RGBA') 
    x,y = img.size 
    g_list = list(g) 
    for i,item in enumerate(g_list): 
        next_img = Image.open('path/{}'.format(item)).convert('RGBA')
        if i == 0: 
            new_img = Image.alpha_composite(next_img,img) 
        else: 
            new_img = Image.alpha_composite(next_img,new_img) 
        next_img.paste(new_img, (0,0,x,y), mask=new_img) 
        new_img.save(f'path/{k}_P.png',format='png') 


Image.open(path + r"/output_P.png").getcolors()

Результат

Result

0 голосов
/ 07 марта 2020

Я смог сделать это для небольшого количества изображений. Я не уверен, что это могло бы сделать 1008 * с большим количеством изображений, так как все перемешалось бы. В любом случае, дайте мне знать, если это поможет. Я использую версию подушки 7.0.0 здесь.

import os
import itertools as it
from PIL import Image

alpha = 0.5
list_of_imgs = sorted(os.listdir('images'))
for k,g in it.groupby(l,key=lambda x: x.split('_')[0]): 
    img = Image.open('images/{}'.format(next(g)),'r').convert('RGBA') 
    x,y = img.size 
    g_list = list(g) 
    for i,item in enumerate(g_list): 
        next_img = Image.open('images/{}'.format(item)).convert('RGBA')
        if i == 0: 
            new_img = Image.blend(next_img,img,alpha) 
        else: 
            new_img = Image.blend(next_img,new_img,alpha) 
        next_img.paste(new_img, (0,0,x,y), mask=new_img) 
        new_img.save(f'images/{k}.png',format='png') 

Результат для трех изображений (собака / щенок, горная вершина, маяк): enter image description here

...