gpt4 book ai didi

python - Numpy 直方图 - Python

转载 作者:行者123 更新时间:2023-11-30 23:29:48 25 4
gpt4 key购买 nike

我遇到一个问题,其中有一堆图像,我必须为其生成直方图。但我必须为每个像素生成一个直方图。即,对于 n 个图像的集合,我必须计算像素 0,0 假定的值并生成直方图,对于 0,1、0,2 等也是如此。我编写了以下方法来执行此操作:

class ImageData:
def generate_pixel_histogram(self, images, bins):
"""
Generate a histogram of the image for each pixel, counting
the values assumed for each pixel in a specified bins
"""
max_value = 0.0
min_value = 0.0
for i in range(len(images)):
image = images[i]
max_entry = max(max(p[1:]) for p in image.data)
min_entry = min(min(p[1:]) for p in image.data)
if max_entry > max_value:
max_value = max_entry
if min_entry < min_value:
min_value = min_entry

interval_size = (math.fabs(min_value) + math.fabs(max_value))/bins

for x in range(self.width):
for y in range(self.height):
pixel_histogram = {}
for i in range(bins+1):
key = round(min_value+(i*interval_size), 2)
pixel_histogram[key] = 0.0
for i in range(len(images)):
image = images[i]
value = round(Utils.get_bin(image.data[x][y], interval_size), 2)
pixel_histogram[value] += 1.0/len(images)
self.data[x][y] = pixel_histogram

矩阵的每个位置存储一个表示直方图的字典。但是,我如何对每个像素执行此操作,并且此计算需要相当长的时间,在我看来,这似乎是一个需要并行化的好问题。但我没有这方面的经验,也不知道该怎么做。

编辑:

我尝试了 @Eelco Hoogendoorn 告诉我的方法,效果非常好。但是将其应用到我的代码中,其中数据是使用此构造函数生成的大量图像(在计算值之后,不再只是 0),我只是得到了 h 一个零数组 [0 0 0]。我传递给直方图方法的是一个 ImageData 数组。

class ImageData(object):

def __init__(self, width=5, height=5, range_min=-1, range_max=1):
"""
The ImageData constructor
"""
self.width = width
self.height = height
#The values range each pixel can assume
self.range_min = range_min
self.range_max = range_max
self.data = np.arange(width*height).reshape(height, width)

#Another class, just the method here
def generate_pixel_histogram(realizations, bins):
"""
Generate a histogram of the image for each pixel, counting
the values assumed for each pixel in a specified bins
"""
data = np.array([image.data for image in realizations])
min_max_range = data.min(), data.max()+1

bin_boundaries = np.empty(bins+1)

# Function to wrap np.histogram, passing on only the first return value
def hist(pixel):
h, b = np.histogram(pixel, bins=bins, range=min_max_range)
bin_boundaries[:] = b
return h

# Apply this for each pixel
hist_data = np.apply_along_axis(hist, 0, data)
print hist_data
print bin_boundaries

现在我得到:

  hist_data = np.apply_along_axis(hist, 0, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 104, in apply_along_axis
outshape[axis] = len(res)
TypeError: object of type 'NoneType' has no len()

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

正如约翰所指出的,最明显的解决方案是寻找可以为您完成此操作的库功能。它存在,并且比您在这里所做的效率高几个数量级。

标准 numpy 有一个直方图函数可以用于此目的。如果每个像素只有很少的值,效率会相对较低;它会创建一个密集的直方图向量,而不是您在此处生成的稀疏直方图向量。不过,下面的代码很有可能有效地解决您的问题。

import numpy as np
#some example data; 128 images of 4x4 pixels
voxeldata = np.random.randint(0,100, (128, 4,4))
#we need to apply the same binning range to each pixel to get sensibble output
globalminmax = voxeldata.min(), voxeldata.max()+1
#number of output bins
bins = 20
bin_boundaries = np.empty(bins+1)
#function to wrap np.histogram, passing on only the first return value
def hist(pixel):
h, b = np.histogram(pixel, bins=bins, range=globalminmax)
bin_boundaries[:] = b #simply overwrite; result should be identical each time
return h
#apply this for each pixel
histdata = np.apply_along_axis(hist, 0, voxeldata)
print bin_boundaries
print histdata[:,0,0] #print the histogram of an arbitrary pixel

但是更一般的消息 ID 喜欢传达,查看您的代码示例和您正在处理的问题类型:帮自己一个忙,学习 numpy。

关于python - Numpy 直方图 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20970697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com