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

数字图像处理 专栏收录该内容
2 篇文章 0 订阅

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

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

  • 6
    点赞
  • 7
    评论
  • 29
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值