MATLAB求图像的均值、中值、众数、方差、协方差、相关系数

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);

最终结果
MATLAB求图像均值结果

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);

最终结果
在这里插入图片描述

  • 21
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值