Применение масок для переноса значений пикселей в новые изображения с помощью Python PIL - PullRequest
1 голос
/ 07 марта 2019

плохо знакомы с PIL и обработкой изображений в Python, возможно, просто отсутствует базовая функция.

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

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

Из моего исходного изображения UHD (взятый слой дорог из NaturalEarth) Я хочу создать новые (для последовательности)показывая прозрачность и точное значение пикселя для областей, покрываемых маской.Области, не покрытые маской (белого цвета), должны быть полностью прозрачными.

Я получил правильную работу, однако это занимает вечность, и я хочу сделать это для набора из более чем 1000 масок, что приводит кто же количество конечных изображений последовательности.

Вот что я сделал до сих пор:

from PIL import Image

imgDim = (4096, 2048)
sourceImg = Image.open('4K_roads0p05.png')
imgSeqMasks = ["gcMask_Stockholm_7400.png"]

for img in imgSeqMasks:
    blank_image = Image.new("RGBA", imgDim)
    i = Image.open(str(img))
    rgbai = i.convert('RGBA')

    if i.size == imgDim:        
        for x in range(imgDim[0]):
            for y in range(imgDim[1]):
                r, g, b, a = rgbai.getpixel((x, y))

                if (r, g, b, a) == (0, 0, 0, 255):
                    rsrc, gsrc, bsrc, asrc = sourceImg.getpixel((x, y))
                    blank_image.putpixel((x, y), (rsrc, gsrc, bsrc, asrc))
                blank_image.save('stockholmRoadsAnim_'+str(img)+'.png')

Я явно заменил папку последовательности маски одним изображением, чтобы сначала проверить его.Вот результат, если я установлю его на x в диапазоне (2100, 2120) и y в диапазоне (450, 470)

хороший результат для области ок.Бельгия / Люксембург

оригинальное изображение (слой исходного изображения)

и одно из многих изображений маски, которые я использовал для этого

это всего лишь 20 на 20 пикселей, и это занимает 109,763999939 с

Есть идеи, как это ускорить?

...