我已经将图像文件读入这样的数组中
A = imread(fileName);
现在我想计算香农熵。 maltab 中的香农熵实现是字节级熵分析,它认为文件由 256 个字节级组成。
wentropy(x,'shannon')
但我需要执行二元熵分析,这需要将文件视为由 65536 个级别组成。谁能建议我一个完成此任务的好方法。
最佳答案
随机变量的熵可以使用以下公式计算:
其中p(x)
是Prob(X=x)
。
给定一组 n
个观测值 (x1, x2, .... xn)
然后计算 P(X=x)
对于所有 x 值的范围(在您的情况下,它将介于 (0 和 65535)
之间,然后对所有值求和。最简单的方法是使用 hist
byteLevel = 65536
% count the observations
observationHist = hist(observations, byteLevel);
% convert to a probability
probXVal = observationHist ./ sum(observationHist);
% compute the entropy
entropy = - sum( probXVal .* log2(probXVal) );
文件交换上有几种值得检查的实现。
注意:您从哪里得知 wentropy
使用 256 字节级别?我在码头的任何地方都没有看到这个?请记住,在 Matlab 中,彩色图像的像素有 3 个 channel (R、G、B),每个 channel 需要 8 位(或 256 字节级别?)。
此外,由于每个 channel 都绑定(bind)在 [0 256)
之间,因此您可以创建从 P(R=r,G=g,B=b)
到 P(X=x)
如下:
data = imageData(:,:,1);
data = data + (imgData(:,:,2) * 256);
data = data + (imgData(:,:,3) * 256 * 256);
我相信您可以使用data
来计算每个 channel 独立的图像的总熵。
关于matlab - 如何计算字节二元组的香农熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344760/