【问题标题】:How to speed-up Python PIL image filtering function如何加速 Python PIL 图像过滤功能
【发布时间】:2017-12-07 17:00:10
【问题描述】:

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

例如:

我需要按以下方式过滤这些图像:当来自 image1 的像素具有不同于 255 的值并且同一位置的像素具有不同于 255 的值时,我想将这两个像素存储在两个单独的图像中(imageFiltered1和 imageFiltered2)。然后,由于 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 循环,这会大大降低我的代码速度。每次我运行我的程序时,这个函数都必须使用数百次。

谢谢

输出:

【问题讨论】:

  • 这是我的函数的输出:i.stack.imgur.com/NN7Bq.png>
  • 你可能想检查Code Review

标签: python image-processing python-imaging-library pillow


【解决方案1】:

来自docs

获取像素
...
请注意,此方法相当慢;如果您需要从 Python 处理图像的较大部分,您可以使用像素访问对象(请参阅加载)或 getdata 方法。

或者,要加快代码中纯 Python 部分的速度,请尝试使用 PyPy

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2021-06-12
    • 2013-02-21
    • 2011-07-17
    • 2010-12-07
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多