2016-12-15 14 views
1

PythonでUnsafe Image Processingを実行することはできますか?C#のLockBitsのようなPythonでの安全でない画像処理

C#と同様に、ImageからgetPixelメソッドをPythonで処理するハードウォールが発生しましたが、単に遅すぎます。

C#のLockBitsのようなメモリ内の画像に直接アクセスすることはできますか?私のプログラムはずっと速く走ります。

おかげで、

マーク

答えて

2

このことについて、 "安全でない" ものは何もありません。

Pythonの仕組みを理解すれば、各ピクセルの情報を取得するメソッドの呼び出しが遅くなるという特許が取得されます。

まず最初に、あなたは情報を知らないが、Pythonを使った画像操作のための最もよく知られたライブラリであるPython Image Library(PIL)を使用していると仮定します。サードパーティのパッケージであるため、あなたはそれを使用する必要はありません。 (PILは画像にgetpixel方法を持っている、ではなくgetPixel 1)操作可能な方法ですべてのデータを持っている

一つの簡単な方法は、画像データのByteArrayのオブジェクトを作成することです - img変数あなたの中にイメージを与えられました次のようにすることができます:

data = bytearray(img.tobytes()) 

これで、画像のすべてのデータに線形アクセスできます。その中の特定のピクセルに到達するには、イメージの幅、高さ、およびピクセルあたりのバイト数を取得する必要があります。後の方はPILの直接のImage属性ではないので、Imageのmodeを指定して計算する必要があります。

def rectangle(img, x,y, width, height): 
    data = bytearray(img.tobytes()) 
    blank_data = (255,) * witdh * bpp 
    bpp = 3 if data.mode == 'RGB' else 4 if data.mode == 'RGBA' else 1 
    stride = img.width * bpp 
    for i in range(y, y + height): 
     data[i * stride + x * bpp: i * stride + (x + width) * bpp)] = blank_data 
    return Image.frombytes(img.mode, (img.width, img.height), bytes(data)) 
:最も一般的なイメージタイプを使用すると、画像の「X、Y、幅、サイズ」で四角形を書きたい場合は、あなたがこれを行うことができ、そこで、RGB、RGBAとL.

です

これはあまり使われていませんが、簡単な操作のためです。 Pythonで画像にフィルタやその他のより複雑なアルゴリズムを適用する必要がある人は通常、numpy-pythonの高性能データ操作パッケージを使用して画像にアクセスします。画像処理に特有のものがたくさんあります。通常はscipy

ので、すでに上記の全ての座標を行いndarray、などのイメージを持っている - >あなたのための変換をバイトは、使用することができます:

import scipy.misc 
data = scipy.misc.imread(<filename>) 

+0

https://docs.scipy.org/doc/scipy/reference/でドキュメントを確認してください)これは基本についての質問かもしれませんが、私はこの種の表現をデータ{i * stride + x * bpp:i * stride +(x + width)* bpp}の前に見たことがありません。これは辞書ですか?私はそれの周りに私の頭を包み込むことはできません –

+0

それは数値スライスインデックスを使用して数値を持つ単純なシーケンスです - 式はちょうど画像ライン(1つの矩形の最初のピクセルのアドレスを(バイト) line(x、i)と最後のピクセル((x + width、i)にあるもの)を使用しています。 /tutorial/introduction.html#lists – jsbueno

+0

ああ、私はPythonのスライス演算子に慣れていませんでした。今はすべて意味があります。ありがとう! –

関連する問題