zoukankan      html  css  js  c++  java
  • paper 38 :entropy

    图像熵计算

           真是为了一个简单的基础概念弄的心力交瘁,请教了一下师姐,但是并没有真的理解,师弟我太笨呀~~所以,我又查熵的中文含义和相关的出处!共勉吧~~

    1.信息熵:

        利用信息论中信息熵概念,求出任意一个离散信源的熵(平均自信息量)。自信息是一个随机变量,它是指某一信源发出某一消息所含有的信息量。一条信息的信息量和它的不确定性有着直接的关系。所发出的消息不同,它们所含有的信息量也就不同。任何一个消息的自信息量都代表不了信源所包含的平均自信息量。不能作为整个信源的信息测度,因此定义自信息量的数学期望为信源的平均自信息量:

                       

     

        信息熵的意义:信源的信息熵H是从整个信源的统计特性来考虑的。它是从平均意义上来表征信源的总体特性的。对于某特定的信源,其信息熵只有一个。不同的信源因统计特性不同,其熵也不同。信息熵一般用符号H表示,单位是比特。变量的不确定性越大,熵也就越大。

     

    2.图像熵:

    2.1.一元灰度熵

       图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。图像的一维熵表示图像中灰度分布的聚集特征所包含的信息量,令Pi 表示图像中灰度值为i的像素所占的比例,则定义灰度图像的一元灰度熵为:

                                         

    其中Pi是某个灰度在该图像中出现的概率,可由灰度直方图获得。

    2.2.二维熵

        图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。选择图像的邻域灰度均值作为灰度分布的空间特征量,与图像的像素灰度组成特征二元组,记为( i, j ),其中i 表示像素的灰度值(0 <= i <= 255),j 表示邻域灰度均值(0 <= j <= 255):

                                         

    上式能反应某像素位置上的灰度值与其周围像素灰度分布的综合特征,其中f(i, j)为特征二元组(i, j)出现的频数,N 为图像的尺度,定义离散的图像二维熵为:

                                        

    构造的图像二维熵可以在图像所包含信息量的前提下,突出反映图像中像素位置的灰度信息和像素邻域内灰度分布的综合特征。

    3.源码

    1. 1.求一元灰度熵  
    2. %方法一  
    3. [M,N]=size(im);  
    4. temp=zeros(1,256);  
    5.    
    6. %对图像的灰度值在[0,255]上做统计  
    7. for m=1:M;  
    8.     for  n=1:N;  
    9.         if im(m,n)==0;  
    10.             i=1;  
    11.         else  
    12.             i=im(m,n);  
    13.         end  
    14.         temp(i)=temp(i)+1;  
    15.     end  
    16. end  
    17. temp=temp./(M*N);  
    18.    
    19. %由熵的定义做计算  
    20. result=0;  
    21.    
    22. for  i=1:length(temp)  
    23.     if temp(i)==0;  
    24.         result=result;  
    25.     else  
    26.         result=result-temp(i)*log2(temp(i));  
    27.     end  
    28. end  
    29.   
    30. %方法二  
    31. %求熵值entropy  
    32. im=rgb2gray(imread('mubiao.bmp'));  
    33. [count,x]=imhist(im);  
    34. total=sum(count);  
    35. entropy=0;  
    36. for i=1:256  
    37.     p(i)=count(i)/total;  
    38.     if p(i)~=0  
    39.         logp(i)=log2(p(i));  
    40.         entropele=-p(i)*logp(i);  
    41.         entropy=entropy+entropele;  
    42.     end  
    43. end  
    44.   
    45. 2.求二维熵  
    46.   
    47. %随机生成图像  
    48. A=floor(rand(8,8).*255);  
    49.    
    50. [M,N]=size(A);  
    51. temp=zeros(1,256);  
    52.    
    53. %对图像的灰度值在[0,255]上做统计  
    54. for m=1:M;  
    55.     for  n=1:N;  
    56.         if A(m,n)==0;  
    57.             i=1;  
    58.         else  
    59.             i=A(m,n);  
    60.         end  
    61.         temp(i)=temp(i)+1;  
    62.     end  
    63. end  
    64. temp=temp./(M*N);  
    65.    
    66. %由熵的定义做计算  
    67. result=0;  
    68.    
    69. for  i=1:length(temp)  
    70.     if temp(i)==0;  
    71.         result=result;  
    72.     else  
    73.         result=result-temp(i)*log2(temp(i));  
    74.     end  
    75. end  
    76.   
    77.    
    78. 3.计算联合熵  
    79.    
    80. %随机生成图像  
    81. A=floor(rand(8,8).*255);  
    82. B=floor(rand(8,8).*255);  
    83.    
    84. [M,N]=size(A);  
    85. temp=zeros(256,256);  
    86.    
    87. %对图像的灰度值成对地做统计  
    88. for m=1:M;  
    89.     for n=1:N;  
    90.    
    91.         if  A(m,n)==0;  
    92.             i=1;  
    93.         else  
    94.             i=A(m,n);  
    95.         end  
    96.    
    97.         if B(m,n)==0;  
    98.             j=1;  
    99.         else  
    100.             j=B(m,n);  
    101.         end  
    102.    
    103.         temp(i,j)=temp(i,j)+1;  
    104.     end  
    105. end  
    106. temp=temp./(M*N);  
    107.    
    108. %由熵的定义做计算  
    109. result=0;  
    110.    
    111. for  i=1:size(temp,1)  
    112.     for j=1:size(temp,2)  
    113.         if temp(i,j)==0;  
    114.         result=result;  
    115.         else  
    116.         result=result-temp(i,j)*log2(temp(i,j));  
    117.         end  
    118.     end  
    119. end  

    4.Matlab的计算熵的函数

    Matlab中的这2个函数分别是计算熵的,entropy计算全局熵,entropyfilt计算局部熵

    给定一个灰度图I, entropy(I)的计算方法是,将I直方图化到0-255的bin中,L1规范化,再用 –sum(p*log2(p))来计算整理熵,即

    Curhist = Hist(I, 0:255);

    Curhist = curhist / sum(curhist);

    E = -sum(curhist .* log2(curhist));

    entropyfilt选取以各像素点为中心的的n*n(默认n=9)的区域进行熵计算,计算方法同上。该方法可以表示纹理

    调用方法如下:

    E = entropy(I)

    J = entropyfilt(I)
    J = entropyfilt(I,NHOOD)

    参考来源:

     http://www.zhizhihu.com/html/y2010/1367.html

  • 相关阅读:
    WOJ 1055
    做人做事
    实现Runnable接口和扩展Thread使用场景
    利用Perf4j 对java项目进行性能监控
    android画笔错位问题的解决
    IE常见的CSS的BUG(二)
    激动啊,终于诞生了,编译了属于俺自己的 JDK
    图像处理特征不变算子系列之Moravec算子(一)
    对象的动态建立和释放
    用TinyXml2读取XML文件的一个简单Demo
  • 原文地址:https://www.cnblogs.com/molakejin/p/5255481.html
Copyright © 2011-2022 走看看