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

由于您似乎已经在使用 numpy,因此值得指出的是它有自己的histogram 函数。您可以在将 PIL 图像转换为 numpy 数组后使用它。也许他们的直方图实现会更有资源效率。

于 2012-08-14T08:01:10.117 回答
0

由于 PIL 的直方图方法在 16 位图像上似乎都很奇怪,所以我编写了自己的函数来生成直方图。我有 12 位的显微图像,这些图像存储在 16 位 tiff 文件中。所以这个 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 回答