西北工业大学 自动化学院 信息工程专业
信息论实验报告
计算图像间的互信息
09030702 2007302171 马志强
2009/10/20
摘要:基于Matlab 程序, 计算出图像的熵和两幅差异不大的图像之间的互信息, 从而加深对互信息和熵值的理解. 关键字:Matlab工程应用, 信息熵与互信息.
一. 实验目的:
利用Matlab 计算两幅差异不大的图片熵值和互信息的值,并通过对图片差异较大区域进行裁剪,增多两个图片相同的区域,从而使得两图片的互信息的值增加,重发以上的操作多次,达到可获得的互信息的最大值,将获得的两个图片进行比较,验证互信息是否会根据图片拥有更多的相似区域而有所增大。
二. 实验步骤:
1. 获取图片:
由于rgb 图像的像素范围过大,所以实验所用的图片采用像素范围只有0—255的gray 图像(灰度图像);可以通过对同一张彩色图片进行灰度处理,也可以直接通过摄像设备获取灰度图像,拍照时应该注意尽量保持两张图片的差异尽可能的小,原因在于人为的摄像中存在不可避免的误差,从而导致最后的结果中的互信息值过于小,即使通过剪裁等手段也无法有效提高互信息的值;将选择好的图片进行剪裁,如果是直接拍摄的两张图片,可以略过此步骤,方法是只减少图片中的极少部分的像素,而且更改的像素希望是条状,然后保存两张图片,供实验中使用。
2. 上机操作:
将事先准备好的程序输入到Matlab 中,利用Matlab 的图片处理及转换功能,计算出图像的熵值和两个图像的互信息值,进行比较,以下附图及部分程序:
3. 记录数据
以上程序运行出的结果分列如下:
本部分程序用于计算出下面的图片的熵值
img=rgb2gray(a);
b=imread('2.jpg' );
[M,N]=size(img);
temp=zeros(M,N);
figure,imshow(img);
%To calculate the statistical character of image¡¯s gray level, which means to calculate the number of each gray
for m=1:M;
for n=1:N;
if img(m,n)==0;
i=1;
else
i=img(m,n);
end
temp(i)=temp(i)+1;
end
end
temp=temp./(M*N);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Calculate the Entropy according to the defination%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
EntropyResult=0;
for i=1:length(temp)
if temp(i)==0;
EntropyResult=EntropyResult;
else
EntropyResult=EntropyResult-temp(i)*log2(temp(i));
end
end
以下程序段用于计算下面两幅图片的互信息:
a=rgb2gray(a);
b=imread('2.jpg' );
b=rgb2gray(b);
%mi = MI(a,b)
%CaculateMI of a and b in the region of the overlap part
%To calculate the overlapping regions
[Ma,Na] = size(a);
[Mb,Nb] = size(b);
M=min(Ma,Mb);
N=min(Na,Nb);
hab= zeros(256,256);
ha = zeros(1,256);
hb= zeros(1,256);
if max(max(a))~=min(min(a))
a = (a-min(min(a)))/(max(max(a))-min(min(a)));
else
a = zeros(M,N);
end
if max(max(b))-min(min(b))
b = (b-min(min(b)))/(max(max(b))-min(min(b)));
else
b = zeros(M,N);
end
a = double(int16(a*255))+1;
b = double(int16(b*255))+1;
for i=1:M
for j=1:N
indexx= a(i,j);
indexy= b(i,j) ;
hab(indexx,indexy) = hab(indexx,indexy)+1;
ha(indexx) = ha(indexx)+1;
hb(indexy) = hb(indexy)+1;
end
end
hsum= sum(sum(hab));
index = find(hab~=0);
p = hab/hsum;
Hab= sum(sum(-p(index).*log(p(index))));
hsum= sum(sum(ha));
index = find(ha~=0);
p = ha/hsum;
Ha = sum(sum(-p(index).*log(p(index))));
hsum= sum(sum(hb));
index = find(hb~=0);
p = hb/hsum;
Hb= sum(sum(-p(index).*log(p(index))));
mi = Ha+Hb-Hab
EntropyResult =
1.9475
其中EntropyResult 为图片的信息熵,mi 表示的是两个图片的互信息;
以下数据为对图片进行10次修改获得的互信息:
mi=0.0512
最后获得的两张图片,基本相同,如下图所示:
三. 实验结论:
利用Matlab 能够实现对两幅图片互信息的计算,扩展到工程中可为求项目的相似度提供有力的参考,同时,利用互信息能够高效地发现共通之处,就相同的部分采取措施,以获得希望达到的目的,如模拟仿真等,另外通过实验加深了对互信息及信息熵的理解,为以后的工作和学习提供了方便。
通过数据的收集:发现如下问题:
1. 对于灰度图片, 信息熵普遍不大于8, 故设想有256个色素组成的图片,1-256像素各一
个, 可通过计算得其信息熵为8, 故又如下猜想:对于灰度图片, 信息熵不大于8;
2. 图片剪裁时互信息不一定随着剪切程度的加深而呈现单调变化, 有可能呈现曲线变
化;
3. 色彩越丰富的图片, 可简单理解为熵值较高; 色彩分布差别不大的两张图片, 互信息会
比较大
四. 实验缺陷:
本次我使用的图片为素描图, 像素分布不广, 一定程度上影响了获得的信息量, 可能导 致获得的结论概括不高
.
西北工业大学 自动化学院 信息工程专业
信息论实验报告
计算图像间的互信息
09030702 2007302171 马志强
2009/10/20
摘要:基于Matlab 程序, 计算出图像的熵和两幅差异不大的图像之间的互信息, 从而加深对互信息和熵值的理解. 关键字:Matlab工程应用, 信息熵与互信息.
一. 实验目的:
利用Matlab 计算两幅差异不大的图片熵值和互信息的值,并通过对图片差异较大区域进行裁剪,增多两个图片相同的区域,从而使得两图片的互信息的值增加,重发以上的操作多次,达到可获得的互信息的最大值,将获得的两个图片进行比较,验证互信息是否会根据图片拥有更多的相似区域而有所增大。
二. 实验步骤:
1. 获取图片:
由于rgb 图像的像素范围过大,所以实验所用的图片采用像素范围只有0—255的gray 图像(灰度图像);可以通过对同一张彩色图片进行灰度处理,也可以直接通过摄像设备获取灰度图像,拍照时应该注意尽量保持两张图片的差异尽可能的小,原因在于人为的摄像中存在不可避免的误差,从而导致最后的结果中的互信息值过于小,即使通过剪裁等手段也无法有效提高互信息的值;将选择好的图片进行剪裁,如果是直接拍摄的两张图片,可以略过此步骤,方法是只减少图片中的极少部分的像素,而且更改的像素希望是条状,然后保存两张图片,供实验中使用。
2. 上机操作:
将事先准备好的程序输入到Matlab 中,利用Matlab 的图片处理及转换功能,计算出图像的熵值和两个图像的互信息值,进行比较,以下附图及部分程序:
3. 记录数据
以上程序运行出的结果分列如下:
本部分程序用于计算出下面的图片的熵值
img=rgb2gray(a);
b=imread('2.jpg' );
[M,N]=size(img);
temp=zeros(M,N);
figure,imshow(img);
%To calculate the statistical character of image¡¯s gray level, which means to calculate the number of each gray
for m=1:M;
for n=1:N;
if img(m,n)==0;
i=1;
else
i=img(m,n);
end
temp(i)=temp(i)+1;
end
end
temp=temp./(M*N);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Calculate the Entropy according to the defination%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
EntropyResult=0;
for i=1:length(temp)
if temp(i)==0;
EntropyResult=EntropyResult;
else
EntropyResult=EntropyResult-temp(i)*log2(temp(i));
end
end
以下程序段用于计算下面两幅图片的互信息:
a=rgb2gray(a);
b=imread('2.jpg' );
b=rgb2gray(b);
%mi = MI(a,b)
%CaculateMI of a and b in the region of the overlap part
%To calculate the overlapping regions
[Ma,Na] = size(a);
[Mb,Nb] = size(b);
M=min(Ma,Mb);
N=min(Na,Nb);
hab= zeros(256,256);
ha = zeros(1,256);
hb= zeros(1,256);
if max(max(a))~=min(min(a))
a = (a-min(min(a)))/(max(max(a))-min(min(a)));
else
a = zeros(M,N);
end
if max(max(b))-min(min(b))
b = (b-min(min(b)))/(max(max(b))-min(min(b)));
else
b = zeros(M,N);
end
a = double(int16(a*255))+1;
b = double(int16(b*255))+1;
for i=1:M
for j=1:N
indexx= a(i,j);
indexy= b(i,j) ;
hab(indexx,indexy) = hab(indexx,indexy)+1;
ha(indexx) = ha(indexx)+1;
hb(indexy) = hb(indexy)+1;
end
end
hsum= sum(sum(hab));
index = find(hab~=0);
p = hab/hsum;
Hab= sum(sum(-p(index).*log(p(index))));
hsum= sum(sum(ha));
index = find(ha~=0);
p = ha/hsum;
Ha = sum(sum(-p(index).*log(p(index))));
hsum= sum(sum(hb));
index = find(hb~=0);
p = hb/hsum;
Hb= sum(sum(-p(index).*log(p(index))));
mi = Ha+Hb-Hab
EntropyResult =
1.9475
其中EntropyResult 为图片的信息熵,mi 表示的是两个图片的互信息;
以下数据为对图片进行10次修改获得的互信息:
mi=0.0512
最后获得的两张图片,基本相同,如下图所示:
三. 实验结论:
利用Matlab 能够实现对两幅图片互信息的计算,扩展到工程中可为求项目的相似度提供有力的参考,同时,利用互信息能够高效地发现共通之处,就相同的部分采取措施,以获得希望达到的目的,如模拟仿真等,另外通过实验加深了对互信息及信息熵的理解,为以后的工作和学习提供了方便。
通过数据的收集:发现如下问题:
1. 对于灰度图片, 信息熵普遍不大于8, 故设想有256个色素组成的图片,1-256像素各一
个, 可通过计算得其信息熵为8, 故又如下猜想:对于灰度图片, 信息熵不大于8;
2. 图片剪裁时互信息不一定随着剪切程度的加深而呈现单调变化, 有可能呈现曲线变
化;
3. 色彩越丰富的图片, 可简单理解为熵值较高; 色彩分布差别不大的两张图片, 互信息会
比较大
四. 实验缺陷:
本次我使用的图片为素描图, 像素分布不广, 一定程度上影响了获得的信息量, 可能导 致获得的结论概括不高
.