使用Python-PIL应用掩码将像素值转换为新图像

2024-07-02 12:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

对Python的PIL和图像处理不熟悉,可能只是缺少一个基本函数。在

我应用多个遮罩来创建多个图像遮罩。在

所有的图像都有完全相同的尺寸,遮罩有一个黑色区域。在

从我的UHD源图像(取自NaturalEarth的roads图层),我想创建一个新的(为一个序列)显示透明度和蒙版覆盖区域的精确像素值。面罩未覆盖的区域(白色)应完全透明。在

我让它正常工作,然而,它需要永远,我想做的是一组超过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')

显然,我先用一个图像替换了mask sequence文件夹来测试它。这是如果我把它设置为范围内的x(21002120)和范围内的y(450470)的结果

good result for area appr. Belgium/Luxembourg

original Image (source image layer)

and one of the many mask images I used for this

这只是20×20像素,需要109.763999939秒

有什么办法加快速度吗?在


Tags: in图像image区域imgforpilpng