图像的熵是什么,如何计算?

17

我了解到它是由像素的随机性所构成的。但请帮忙解释这种随机性如何通过数学方法计算。同时也请说明不同图像将拥有不同的熵值。


这与随机性并不完全相关,而是与其他值给定的每个值有多意外相关。因此,它与图像中存在的信息量有关。 - Cris Luengo
2个回答

22

你可以直接从你的 img 计算 Shannon 熵。只需执行:

import skimage.measure    
entropy = skimage.measure.shannon_entropy(img)

如果你想看到数学背后的原理:

import numpy as np
marg = np.histogramdd(np.ravel(img), bins = 256)[0]/img.size
marg = list(filter(lambda p: p > 0, np.ravel(marg)))
entropy = -np.sum(np.multiply(marg, np.log2(marg)))

首先,marg 是二维灰度图像 img 的边缘分布。对于 8 位图像,bins 设置为 256。然后您需要过滤掉概率值等于零的元素,并最终将剩余元素 np.multiply(marg, np.log2(marg)) 求和,如香农熵所定义。


AttributeError: module 'skimage' has no attribute 'measure' - mLstudent33
6
@mLstudent33 import skimage.measure - Franz Knülle
感谢您展示了shannon_entropy()函数背后的数学原理。如果灰度图像的像素类型为32位浮点型,skimage.measure.shannon_entropy()函数会使用多少个bin? - shparekh

5
图像的熵被定义如下:

entropy

其中n是灰度级数(8位图像为256),pi是像素具有灰度级i的概率,b是对数函数的底数。

请注意,图像的熵与从图像的灰度共生矩阵(GLCM)提取的熵特征有所不同。请查看this post以了解更多信息。

根据您的要求,我附上了如何计算GLCM熵的示例:

首先,我们导入必要的模块:

import numpy as np
from skimage.feature import greycomatrix

然后我们读取图像:
img = io.imread('https://istack.dev59.com/07DZW.webp')

lion

上面图片中的 GLCM(对应于右侧的像素)计算如下:
glcm = np.squeeze(greycomatrix(img, distances=[1], 
                               angles=[0], symmetric=True, 
                               normed=True))

最后,我们使用这个公式来计算熵:

entropy

p(i, j) 代表 GLCM 的条目。

如果我们将 b 设置为 2,则结果以比特表示。

entropy = -np.sum(glcm*np.log2(glcm + (glcm==0)))
# yields 10.704625483788325

“对应于右侧像素”是什么意思?指的是图像之外吗? - mLstudent33
GLCM 模型对给定偏移量处的共存像素值分布进行建模。在上面的示例中,用于计算 GLCM 的“偏移量”为“向右一个像素”。 - Tonechas
@Tonechas 如果我想计算彩色图片的熵,我该怎么做?..这段代码只适用于灰度图像。 - Zewo
1
将灰度级别 i 的概率 pᵢ 替换为颜色 (r, g, b) 的联合概率 pʳᵍᵇ,就能解决问题。您需要将此更改引入第一个公式中。 - Tonechas
请注意您的编辑请求。这些方程式看起来非常糟糕,以至于无法阅读。 - havakok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接