1

Python で 16 ビット グレースケール イメージからヒストグラムを生成したいと思います。次のコードを実行すると、バッファ オーバーフローが発生します。

#!/usr/bin/python

from PIL import Image
import numpy as np

i = Image.open('t.tif')
a = i.histogram()

print a

エラーメッセージ(短縮)

tdettmer@thinkpad:~/code/histogram$ ./h.py 
*** buffer overflow detected ***: /usr/bin/python terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f3f33ed6007]
/lib/x86_64-linux-gnu/libc.so.6(+0x107f00)[0x7f3f33ed4f00]
/usr/lib/python2.7/dist-packages/PIL/_imaging.so(ImagingHistogramNew+0x33)

これで、16 ビット イメージからヒストグラムを生成すると多くのリソースが使用されることがわかりますが、どうにかしてこの問題を回避できますか?

4

2 に答える 2

0

PILのヒストグラム法は16ビット画像ではすべて奇妙に見えるので、ヒストグラムを生成する独自の関数を作成しました。16ビットのtiffファイルに保存されている12ビットの顕微鏡画像があります。したがって、このtiff内の最大グレー値は4096です。

画像を開いてピクセルを読み取る関数:

def getPixels(file):
    img = Image.open(file)

    pixels = img.load()
    width, height = img.size

    all_pixels =  []

    for x in range(width):
        for y in range(height):
            cpixel = pixels[x, y]
            all_pixels.append(cpixel)

    return all_pixels

...ヒストグラムを生成します:

def generateHistogram(file, z):
    px = getPixels(file)
    a = np.histogram(px, bins=np.arange(z))
于 2012-08-15T08:52:14.187 に答える
0

すでにnumpyを使用しているように見えるので、独自のヒストグラム関数があることを指摘する価値があります。PILイメージをnumpy配列に変換した後に使用できます。おそらく、それらのヒストグラムの実装は、よりリソース効率が高いでしょう。

于 2012-08-14T08:01:10.117 に答える