ValueError:操作数无法与形状一起广播(10)(11)

时间:2014-01-25 19:22:10

标签: python image python-imaging-library

我正在尝试使用Dejan Noveski的代码使用PIL模块创建一个在python中计算图像熵的函数。

def image_entropy(img):
hgram = np.histogram(img)
histogram_length = sum(hgram)

samples_probability = [float(h) / histogram_length for h in hgram]

return -sum([p * math.log(p, 2) for p in samples_probability if p != 0])

它会抛出以下错误

 File "test.py", line 45, in <module>
I_e=image_entropy(I)
File "test.py", line 11, in image_entropy
histogram_length = sum(hgram)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 1510, in sum
out=out, keepdims=keepdims)
File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 18, in _sum
out=out, keepdims=keepdims)
ValueError: operands could not be broadcast together with shapes (10) (11) 

我不明白为什么它会给出广播错误,因为我没有采取任何产品,只需要取矩阵的总和。有人可以帮助我。

提前谢谢

1 个答案:

答案 0 :(得分:2)

numpy.histogram返回一个2元组:直方图一个bin边缘数组。所以

hgram = np.histogram(img)

应该是

hgram, bin_edges = np.histogram(img)

如果您使用hgram = np.histogram(img),那么hgram会被分配到2元组。 Python非常乐意这样做;那里没有异常。但是当Python评估sum(hist)时,它会尝试对hist中的两个项求和。一个(直方图值)是一个长度为10的数组,另一个(bin边缘)是一个长度为11的数组。这就是ValueError出现的地方。


np.histogram(img)希望img成为一个数组。如果img是PIL图片,请使用im.histogram method

hgram = img.histogram()