如何计算字节双字母的shannon熵

cro*_*wso 2 statistics matlab

我已经将图像文件读入这样的数组中

A = imread(fileName);
Run Code Online (Sandbox Code Playgroud)

现在我想计算shannon熵.在maltab中找到的shannon熵实现是字节级熵分析,其认为文件由256字节级别组成.

wentropy(x,'shannon')
Run Code Online (Sandbox Code Playgroud)

但我需要执行一个二元组熵分析,需要查看一个由65536级别组成的文件.谁能建议我一个很好的方法来完成这个.

sla*_*ton 5

可以使用以下公式计算随机变量的熵: 在此输入图像描述

哪里p(x)Prob(X=x).

给定一组n观察结果(x1, x2, .... xn)然后计算P(X=x)所有x值的范围(在您的情况下,它将介于(0 and 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) );
Run Code Online (Sandbox Code Playgroud)

在文件交换上有几个这样的实现值得一试.

注意:你在哪里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);
Run Code Online (Sandbox Code Playgroud)

我相信你可以data用来计算每个通道独立的图像的总熵.