我了解到它是由像素的随机性所构成的。但请帮忙解释这种随机性如何通过数学方法计算。同时也请说明不同图像将拥有不同的熵值。
我了解到它是由像素的随机性所构成的。但请帮忙解释这种随机性如何通过数学方法计算。同时也请说明不同图像将拥有不同的熵值。
你可以直接从你的 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'
- mLstudent33import skimage.measure
- Franz Knülle其中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')
上面图片中的 GLCM(对应于右侧的像素)计算如下:glcm = np.squeeze(greycomatrix(img, distances=[1],
angles=[0], symmetric=True,
normed=True))
p(i, j) 代表 GLCM 的条目。
如果我们将 b 设置为 2,则结果以比特表示。
entropy = -np.sum(glcm*np.log2(glcm + (glcm==0)))
# yields 10.704625483788325
i
的概率 pᵢ 替换为颜色 (r, g, b)
的联合概率 pʳᵍᵇ,就能解决问题。您需要将此更改引入第一个公式中。 - Tonechas