2017-07-04 21 views
0

2つのグレースケールPNGがあります。これらの画像の幅と高さは同じです。Python PIL画像フィルタリング機能を高速化する方法

例えば

:私は次のようにこれらの画像をフィルタリングする必要

image1 image2

:画像1からの画素255とは異なる値を有し、同じ位置の画素値を有する場合255とは異なる2つの別々のイメージ(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ループを避けたいと思います。この関数は、プログラムを実行するたびに何百回も使用されなければなりません。

おかげ

ouputを:から

enter image description here

+0

使用するようにしてください。

+0

[コードレビュー](https://codereview.stackexchange.com/)をチェックして、 – Tbaki

答えて

0

docs

getPixelと
...この方法はかなり遅いという
注意。 Pythonから画像の大部分を処理する必要がある場合は、ピクセルアクセスオブジェクト(loadを参照)またはgetdataメソッドを使用できます。

それとも、あなたのコードの純粋なPythonの一部をスピードアップするために、これは私の関数の出力であるPyPy

関連する問題