实验二_信息熵与图像熵计算
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
未信的我
五、代码附录 求解信息熵: #include<stdio.h> #include<math.h> int main() { double a[100],count=0,H=0; int i; printf("输入概率和为1的4个概率值:\n"); for (i=0;i<4;i++) { scanf("%lf",&a[i]); } for (i=0;i<4;i++) { printf("%lf\n",a[i]); count=count+a[i]; if (a[i]!=0) H=H+(-a[i]*log(a[i])/log(2));
未信的我
实验名称:信息熵与图像熵计算 一、实验目的:复习信息熵基本定义, 能够自学图像熵定义和基本概念。 二、实验内容与原理: 内容: 1.能够写出MATLAB 源代码,求信源的信息熵。 2.根据图像熵基本知识,综合设计出 MATLAB 程序,求出给定图像的图像 熵。 原理: 1.MATLAB 中数据类型、矩阵运算、图像文件输入与输出知识复习。 2.利用信息论中信息熵概念,求出任意一个离散信源的熵(平均自信息量)。 自信息是一个随机变量,它是指某一信源发出某一消息所含有的信息量。所发出 的消息不同, 它们所含有的信息量也就不同。任何一个消息的自信息量都代表不 了信源所包含的平均自信息量。 不能作为整个信源的信息测度,因此定义自信息 量的数学期望为信源的平均自信息量: 信息熵的意义:信源的信息熵H是从整个信源的统计特性来考虑的。它是从 平均意义上来表征信源的总体特性的。对于某特定的信源,其信息熵只有一个。 不同的信源因统计特性不同,其熵也不同. 三、实验步骤 1.求解信息熵过程: 1) 输入一个离散信源,并检查该信源是否是完备集。 2) 去除信源中符号分布概率为零的元素。 3) 根据平均信息量公式,求出离散信源的熵。
未信的我
else continue; } printf("离散信源的熵:%lf\n",H); } 图像熵计算: I = imread('peppers.png'); imshow(I); img = rgb2gray(I); [x,y] = size(img); P1 = imhist(img)/(x*y); H1=0; for i=1:256 if P1(i) ~= 0 H1 = H1+(-P1(i)*log2(P1(i))); end end H1 六、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。 1.C 语言无法直接实现 LOG 以 2 为底的对数计算,更改为 log(a[i])/log(2) 即可 2.C 语言中 Log 对数计算为 double 类型,在定义概率数组时应也设置为 double 类型
未信的我Fra Baidu bibliotek
for (i=0;i<4;i++) { printf("%lf\n",a[i]); count=count+a[i]; if (a[i]!=0) %判断语句 H=H+(-a[i]*log(a[i])/log(2)); % 把 C 语言中以 10 为底的 LOG 函数 转变为以2为底的函数 else continue; } printf("离散信源的熵:%lf\n",H); } 2.图像熵计算过程: 1) 输入一幅图像,并将其转换成灰度图像。 2) 统计出图像中每个灰度阶象素概率。 3) 根据图像熵和公式,计算出一幅图像的熵。 I = imread('peppers.png'); %读入彩色图像 imshow(I); img = rgb2gray(I); %将图像转换为灰度图像 [x,y] = size(img); P1 = imhist(img)/(x*y); H1=0; for i=1:256 if P1(i) ~= 0 H1 = H1+(-P1(i)*log2(P1(i))); end end H1 四、实验数据及结果分析(可附程序运行截图)
H Pi log Pi
i
具体实现的C语言代码: #include<stdio.h> #include<math.h> int main() { double a[100],count=0,H=0;%定义了一个双精度的数组,用以输入概率值 %count用以统计概率和 % H为 离散信源的熵 int i; printf("输入概率和为1的4个概率值:\n"); for (i=0;i<4;i++) { scanf("%lf",&a[i]); }