我已经将图像文件读入这样的数组
A = imread(fileName);
现在我想计算shannon熵。 maltab中的shannon熵实现是字节级熵分析,它将文件视为由256字节级别组成。
wentropy(x,'shannon')
但我需要执行一个二元组熵分析,需要查看一个由65536个级别组成的文件。谁能建议我一个很好的方法来实现这个目标。
答案 0 :(得分:5)
随机变量的熵可以使用以下公式计算:
其中p(x)
是Prob(X=x)
。
给出一组n
观察(x1, x2, .... xn)
然后,您计算所有x值的范围P(X=x)
(在您的情况下,它将在(0 and 65535)
之间,然后在所有x值之间求和最简单的方法是使用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个通道(R,G,B),每个通道需要8位(或256字节级别?)。
另外,因为每个频道都绑定在[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
来计算每个频道独立的图像的总熵。
答案 1 :(得分:0)
将“65536”级别的彩色图像转换为“256”级别的灰色图像,并考虑熵评估。