我正在尝试使用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)
我不明白为什么它会给出广播错误,因为我没有采取任何产品,只需要取矩阵的总和。有人可以帮助我。
提前谢谢
答案 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()