【问题标题】:how to calculate shannon entropy of byte bigrams如何计算字节二元组的香农熵
【发布时间】:2012-10-31 22:31:24
【问题描述】:

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

A = imread(fileName);

现在我想计算香农熵。在maltab中发现的香农熵实现是字节级熵分析,它认为一个文件由256个字节级组成。

wentropy(x,'shannon')

但我需要执行二元熵分析,这需要将文件视为由 65536 个级别组成。任何人都可以建议我完成此任务的好方法。

【问题讨论】:

  • 我很感兴趣。你能更好地定义数学吗?

标签: matlab statistics


【解决方案1】:

将“65536”级别的彩色图像转换为“256”级别的灰度图像,并考虑熵评估。

【讨论】:

    【解决方案2】:

    随机变量的熵可以使用以下公式计算:

    其中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) 到 P(X=x) 的映射,如下所示:

    data = imageData(:,:,1);
    data = data + (imgData(:,:,2) * 256);
    data = data + (imgData(:,:,3) * 256 * 256);
    

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

    【讨论】:

    • 不错!因此,您正在从色彩的角度计算图像的冗余,对吗?关键是为什么是65536? @Crowso,你在使用一个 16 位宽的“联合”颜色通道吗?
    • @Acorbe,是的,熵是对随机变量中包含的不确定性或信息的度量。如果一个随机变量产生的结果具有高度的不确定性,那么它就有很多熵。同样,如果不确定性低,熵也低。
    • 不过现在你有 16M 位。用户可以拥有 6 位/彩色图像吗?
    • @Acorbe 是的,X 可以取[0, 2^24) 之间的值是正确的。它并不完全清楚 OP 到底想要做什么
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多