图像的统计和描述(matlab)
本篇是遥感数字图像处理中的关于图像的统计与描述。共分为七个部分,分别为均值、中值、排序、众数、方差/协方差、相关系数、直方图/累计直方图,下面将分别进行叙述。
程序均用matlab实现
1.均值
对图像进行处理时,首先需要先将二维向量转变为一维向量,同时将数据类型转换为double型才能使运算结果更加准确。
程序分析:使用for循环遍历每一个波段每一个像素的灰度值,累计相加求和,最后除以总的像素个数,得到每个波段的灰度平均值。
代码实现如下所示:
function st=statics(image)
[size,cols,bands]=size(image);
%初始化均值向量
average=zeros(1,bands);
for band=1:bands
%转换为一维向量
oneband=image(:,:,band);
%转换为double类型
oneband=double(oneband(:));
for i=1:rows*cols
average(band)=average(band)+oneband(i);
end
average(band)=average(band)/rows/cols;
end
2.中值
程序分析:循环遍历每个波段的灰度值,进行排序,去位于中间位置的灰度值即为中值。
程序实现如下:
%初始化中值向量
mid=zeros(1,bands);
for band=1:bands
oneband=image(:,:,band);
oneband=double(oneband(:);
%排序
for i=1:rows*cols-1
for j=i+1:rows*cols
if(oneband(j)<oneband(i))
t=oneband(j);
oneband(j)=oneband(i);
oneband(i)=t;
end
end
end
mid(band)=oneband(round(rows*cols/2);
end
3.众数
程序分析:求众数需要先求出灰度直方图,个数最大的那个对应的灰度值即为众数
%初始化灰度直方图向量
zft=zeros(bands+1,256);
%初始化众数向量
mode=zeros(1,bands);
for band=1:bands
oneband=image(:,:,band);
oneband=double(oneband(:));
%求灰度直方图
for i=rows*cols
zft(band+1,oneband(i)+1)=zft(band+1,oneband(i)+1)+1;
end
%遍历灰度直方图,求最大值
max=zft(band+1,1);
index=1;
for i=1:256
if(zft(band,i+1)>zft(band,i))
max=zft(band,i+1);
index=i+1;
end
end
%求众数
mode(band)=zft(1,index+1);
end
4.方差/协方差
程序分析:得到的方差/协方差矩阵是一个bands*bands的矩阵。矩阵的第一行第一列的值是该波段所有像素灰度值的方差,第一行第二列的值是第一个波段与第二个波段的协方差,以此类推。
程序实现如下所示:
%初始化方差/协方差矩阵
var=zeros(bands,bands)
for iband=1:bands
ioneband=image(:,:,iband);
ioneband=double(ioneband(:));
for jband=1:jbands
joneband=image(:,:,jband);
joneband=double(joneband(:));
sum=0;
for i=1:rows*cols
sum=sum+(ioneband(i)-average(band))*(joneband(i)-average(band));
end
end
var(iband,jband)=sum/rows/cols;
end
5.相关系数
程序分析:相关系数等于对应的协方差除以各自的方差
程序实现如下:
%初始化相关系数向量
p=zeros(bands,bands);
for i=1:bands
for j=1:bands
p(i,j)=var(i,j)/sqrt(var(i,i)*var(j,j));
end
end
6.直方图/累计直方图
程序分析:灰度直方图的代码上面已给出,累计直方图即统计该灰度值之间(包括它自己)的所有灰度值的像素和。
程序实现如下所示:
%初始化灰度直方图向量
zft=zeros(bands+1,256);
%初始化累计直方图向量
ljzft=zeros(bands+1,256);
for band=1:bands
oneband=image(:,:,band);
oneband=double(oneband(:));
%求灰度直方图
for i=rows*cols
zft(band+1,oneband(i)+1)=zft(band+1,oneband(i)+1)+1;
end
%求累计直方图
ljzft(band,1)=zft(band,1)
for i=2:256
ljzft(band,i)=ljzft(band,i-1)+zft(band,i);
end
end
7.排序
关于排序的部分代码已在求中值的时候给出,不再叙述。