【发布时间】:2014-01-07 11:40:14
【问题描述】:
我有一个问题,其中有一堆图像,我必须为其生成直方图。但我必须为每个像素生成一个直方图。即,对于 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),我只是得到了一个零数组 [0 0 0]。我传递给 histogram 方法的是一个 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()
任何帮助将不胜感激。 提前致谢。
【问题讨论】:
标签: python class numpy histogram