如何加速Python PIL图像滤波函数

zdwk9cvp  于 2023-06-28  发布在  Python
关注(0)|答案(2)|浏览(112)

我有两个灰色的png。这些图像具有相同的宽度和高度。
例如:

我需要以以下方式过滤这些图像:当来自image 1的像素具有不同于255的值并且相同位置中的像素具有不同于255的值时,我想要将这两个像素存储在两个单独的图像(imageFiltered 1和imageFiltered 2)中。然后,两个过滤后的图像将创建一个新的图像,这要归功于ImageChops的乘法。
这是我整理的算法:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PIL import Image, ImageChops

def makeCustomMultiply(image1, image2):
    assert image1.size == image2.size

    imageFiltered1 = Image.new(size=image1.size, mode='L', color=255)
    imageFiltered2 = Image.new(size=image1.size, mode='L', color=255)

    for eachY in xrange(0, imageFiltered1.size[1]):
        for eachX in xrange(0, imageFiltered1.size[0]):
            pixel1 = image1.getpixel((eachX, eachY))
            pixel2 = image2.getpixel((eachX, eachY))

            if pixel1 == 255 or pixel2 == 255:
                imageFiltered1.putpixel((eachX, eachY), 255)
                imageFiltered2.putpixel((eachX, eachY), 255)
            else:
                imageFiltered1.putpixel((eachX, eachY), pixel1)
                imageFiltered2.putpixel((eachX, eachY), pixel2)

    combo = ImageChops.multiply(imageFiltered1, imageFiltered2)
    return combo

if __name__ == '__main__':

    image1 = Image.open('image1.png')
    image2 = Image.open('image2.png')

    myCustomMultiply = makeCustomMultiply(image1, image2)
    myCustomMultiply.save('myCustomMultiply.png')

它基本上是一个乘法函数,其中不显示黑色/灰色对白色。然后仅将灰色到灰色相乘。
我的代码可以以某种方式改进吗?我想避免嵌套的for循环,这会大大降低代码的速度。这个函数在我每次运行程序的时候都要用到几百次。
谢谢
输出:

jgovgodb

jgovgodb1#

从文档:

获取像素

...
请注意,这种方法相当慢;如果你需要从Python中处理图像的较大部分,你可以使用pixel访问对象(参见load),或者getdata方法。
或者,为了加快代码中纯Python部分的速度,可以尝试使用PyPy

zkure5ic

zkure5ic2#

这可以通过使用array-wise而不是for循环来改善很多。用下面的代码替换for循环:

import numpy as np

# convert to numpy arrays
image1_array = np.array(image1)
image2_array = np.array(image2)

# find all pixels where your condition is fulfilled:
condition = (image1_array == 255) | (image2_array == 255)

# If the condition is fulfilled, set 255, else set the original value
imageFiltered1_array = np.where(condition, 255, image1_array)
imageFiltered2_array = np.where(condition, 255, image2_array)

# convert back to PIL images. 
imageFiltered1 = Image.fromarray(imageFiltered1_array)
imageFiltered2 = Image.fromarray(imageFiltered2_array)

如果你想进一步加速,你可以考虑使用torch而不是numpy进行数值运算,在某些情况下甚至更快。

相关问题