1.均值
求出图像矩阵所有数值的均值。
注意点:
①图像矩阵的每个值都是uint8类型的,uint8的范围是0-255,在进行求和之前需要把图像矩阵转换成double类型,如果不转换,继续对uint8类型进行运算会产生溢出;
②将矩阵变为1×n或者n×1形式,求和时可以采用单层循环,加快计算速度。
函数代码
function [result]=junzhi(a)
%a为图像读入的矩阵,result返回的是这些数求得的均值
a=double(a);%影像矩阵的类型默认是uint8 (0~255) 如果不转换为double,在求和时会溢出
a=a(:);%将影像变为n行一列,采用单层循环就可以计算,加快计算速度
sum=0;%用于求和
for i=1:size(a,1)
sum=sum+a(i);%求出矩阵中所有数之和
end
result=sum/size(a,1);%求出均值
end
函数调用
我选择处理的图像为
先读入这张图像,然后调用函数并用一个新变量接收返回值
a=imread('原图像.jpg');
b=junzhi(a);
最终结果
2.中值
我这里求的中值是将矩阵的最大值和最小值求平均得到的
函数代码
function [ midR,midG,midB ] = zhongzhi( a )
%a为影像数据(包含3个波段)
a=double(a);
d1=a(:,:,1);
d2=a(:,:,1);
d3=a(:,:,1);
d1=d1(:);
d2=d2(:);
d3=d3(:);
max1=d1(1);
max2=d2(1);
max3=d3(1);
for i=1:size(d1,1)
if (d1(i)>=max1)
max1=d1(i);
end
end
for i=1:size(d2,1)
if (d2(i)>=max2)
max2=d2(i);
end
end
for i=1:size(d3,1)
if (d3(i)>=max3)
max3=d3(i);
end
end
min1=d1(1);
min2=d2(1);
min3=d3(1);
for i=1:size(d1,1)
if (d1(i)<=min1)
min1=d1(i);
end
end
for i=1:size(d2,1)
if (d2(i)<=min2)
min2=d2(i);
end
end
for i=1:size(d3,1)
if (d3(i)<=min3)
min3=d3(i);
end
end
midR=(max1+min1)/2;
midG=(max2+min2)/2;
midB=(max3+min3)/2;
end
函数调用
直接在命令行中调用
a=imread('原图像.jpg');
c=zhongzhi(a);
最终结果
3.众数
由于我们处理的是图像,所有要处理的矩阵的每一个值都在0~255中间,所以求众数时可以先对所有的值进行统计,然后找到数量最大的值,这个数就是众数。
注意点:
①众数可能有多个,在有多个众数的情况下不能只返回一个;
②我们读入的数组矩阵的数值范围是0-255。
函数代码
function [result]=zhongshu2(a)
%a为图像读入的矩阵,result返回的是众数的数组
a=a(:);
h=zeros(1,256);%定义一个数组用来几率每个数值出现的次数
for i=1:size(a,1)
h(a(i)+1)=h(a(i)+1)+1;%由于矩阵的值时0-255,所以加一以后才是索引值
end
ma=h(1);
for i=1:256
%求出现的最大次数
if(h(i)>ma)
ma=h(i);
end
end
j=1;
for i=1:256
%得到所有出现次数最多的数
if(ma==h(i))
num(j)=i;
j=j+1;
end
end
result=num;
end
函数调用
直接在命令行中调用即可
a=imread('原图像.jpg');
b=zhongshu2(a);
最终结果
4.方差
求方差时调用之前的求均值函数,按照求方差的公式计算即可
函数代码
function [ result ] = fangcha( a )
%a为输入的一个数组或者一行多列的矩阵
a=a(:);%把行向量变成列向量
a=double(a);
length=size(a,1);%得到a的维数
sum=0;
junzhi=junzhi(a);//利用之前写的函数求均值
for i=1:length
sum=sum+(a(i)-junzhi)*(a(i)-junzhi);
end
result=sum/length;
end
函数调用
a=imread('原图像.jpg');
fangcha(a);
最终结果
5.协方差
协方差计算公式:
协方差体现的是两张不同图像之间的关系,计算起来依旧不难,调用之前的函数,按公式计算即可
函数代码
function [ result ] = xiefangcha(a,b)
%a,b分布为两张不同的图像
a=a(:);
b=b(:);
a=double(a);
b=double(b);
mi1=junzhi(a);
mi2=junzhi(b);
sum=0;
for i=1:size(a,1)
sum=sum+(a(i)-mi1)*(b(i)-mi2);
end
result=sum/size(a,1);
end
函数调用
由于计算协方差需要两张图像,所以这里我是用了第二张图像和之前的图片一起进行调用
在命令行中进行调用
a=imread('原图像.jpg');
b=imread('匹配图像.jpg');
xiefangcha(a,b);
最终结果
6.相关系数
同样,调用之前的函数,按公式计算即可
相关系数算公式:
函数代码
function [ result ] = xianggaunxishu(a,b )
%a,b分布为两张不同的图像
a=a(:);
b=b(:);
xie=xiefangcha(a,b);
fangcha1=fangcha(a);
fangcha2=fangcha(b);
result=xie/(sqrt(fangcha1)*sqrt(fangcha2));
end
函数调用
a=imread('原图像.jpg');
b=imread('匹配图像.jpg');
xianggaunxishu(a,b);
最终结果