我已将图像文件读入这样的数组
A = imread(fileName);
现在我想计算香农熵。在 maltab 中发现的香农熵实现是一种字节级熵分析,它认为一个文件由 256 个字节级组成。
wentropy(x,'shannon')
但是我需要执行一个二元熵分析,这需要将一个文件视为由 65536 个级别组成。任何人都可以建议我实现这一目标的好方法。
我已将图像文件读入这样的数组
A = imread(fileName);
现在我想计算香农熵。在 maltab 中发现的香农熵实现是一种字节级熵分析,它认为一个文件由 256 个字节级组成。
wentropy(x,'shannon')
但是我需要执行一个二元熵分析,这需要将一个文件视为由 65536 个级别组成。任何人都可以建议我实现这一目标的好方法。
随机变量的熵可以使用以下公式计算:
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) );
在文件交换上有几个值得一试的实现。
注意:你从哪里得到wentropy
使用 256 字节级别的?我在码头的任何地方都没有看到?请记住,在 Matlab 中,彩色图像的像素有 3 个通道(R、G、B),每个通道需要 8 位(或 256 字节级别?)。
此外,由于每个通道都绑定在您之间,[0 256)
您可以创建一个从P(R=r,G=g,B=b)
to的映射,P(X=x)
如下所示:
data = imageData(:,:,1);
data = data + (imgData(:,:,2) * 256);
data = data + (imgData(:,:,3) * 256 * 256);
我相信您可以使用它data
来计算每个通道独立的图像的总熵。
将具有“65536”级别的彩色图像转换为具有“256”级别的灰度图像并考虑熵评估。