【发布时间】:2018-05-13 05:41:48
【问题描述】:
我知道这是像素的随机性。但是请帮助您了解如何以数学方式计算这种随机性。以及不同的图像会有不同的熵。
【问题讨论】:
-
这并不是真正的随机性,而是每个值被赋予其他值的意外程度。因此,它与图像中存在的信息量有关。
标签: image-processing statistics entropy
我知道这是像素的随机性。但是请帮助您了解如何以数学方式计算这种随机性。以及不同的图像会有不同的熵。
【问题讨论】:
标签: image-processing statistics entropy
您也可以直接从您的img 计算香农熵。做吧:
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。然后,您需要过滤掉等于 0 的概率,最后将剩余元素 np.multiply(marg, np.log2(marg)) 相加,如 Shannon's entropy 所定义。
【讨论】:
AttributeError: module 'skimage' has no attribute 'measure'
import skimage.measure
图像的熵定义如下:
其中 是灰度级数(8 位图像为 256), 是像素具有灰度级 的概率, 是对数函数的底。
请注意,图像的熵与从图像的 GLCM(灰度共生矩阵)中提取的熵特征有很大不同。查看this post 了解更多信息。
根据您的要求,我附上了一个如何计算 GLCM 熵的示例:
首先我们导入必要的模块:
import numpy as np
from skimage.feature import greycomatrix
然后我们读取图片:
img = io.imread('https://i.stack.imgur.com/07DZW.png')
上图的GLCM(对应右边的像素)计算如下:
glcm = np.squeeze(greycomatrix(img, distances=[1],
angles=[0], symmetric=True,
normed=True))
最后我们应用这个公式来计算熵:
entropy = -np.sum(glcm*np.log2(glcm + (glcm==0)))
# yields 10.704625483788325
【讨论】:
(r, g, b)pʳᵍᵇ替换pᵢ,灰度概率i,就可以了。哟需要将此更改引入第一个公式。