MATLAB | 画彩色图像的直方图,改对比度,计算均值、方差和信息熵

MATLAB | 画彩色图像的直方图,改对比度,计算均值、方差和信息熵

何为直方图,就是一幅图像的像素分布情况的条形图。如一幅RGB图像灰度化后,其像素均在在0-255范围内。以matlab里函数***h=imhist(f,b)***为例:
f是输入图像,b表示容器,如b为10,那么横坐标就有25个区间段。
彩色图像、红绿蓝图像分量、灰度图像都可以画出直方图。直方图对后续的图像增强、压缩、分割描述具有重要作用(后面再更啦),如调制图像的对比度那么像素分布肯定有变化,而且可以通过直方图看出变换明显的地方,如峰值。

当然绘制直方图还可以用***bar、stem、plot函数***,因为第一次分享博客是入学之前的小作业,这些也是后面慢慢摆上来。

在介绍方差均值之前说说,在matlab里如何得到具体数值吧 hhh这也是我开始没有具体做之前想的一个小问题。就是用matlab里自带的size函数
[M,N]=size(f)返回图像的行和列的数目,然后f(i,j)可得具体像素值,有此之后,其他的都是简单的数学知识,有些许c语言基础应该很快编出来!

下面就是具体matlab代码

// clc;
A1=imread('D:\MATshujialianxi\tushuguan.jpg');
subplot(4,4,1);imshow(A1);title('原图');
Ar=A1(:,:,1);%R通道 
Ag=A1(:,:,2);%G通道 
Ab=A1(:,:,3);%B通道 
subplot(4,4,4),imshow(A1(:,:,1));title('红色分量图'); %R通道 
subplot(4,4,7),imshow(A1(:,:,2));title('绿色分量图'); %G通道 
subplot(4,4,10),imshow(A1(:,:,3));title('蓝色分量图'); %B通道 
%subplot(ABK)可以在一张figure里显示多张图片,AB意思是几行几列的图片,K是那行的第几个图,是图片的话后面用imshow,直方图用imhist,,,,title是该小图的标题,一般默认居中。

%h=imhist(f,b);f为输入图像,b意为将0-256区间分为256/b个区间段;
%imhist( i );直接显示图像i的灰度直方图;
%imhist(i,n)n为指定灰度级显示直方图;
%[count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,x为灰度级
subplot(4,4,5),imhist(Ar);title('红色分量直方图');
subplot(4,4,8),imhist(Ag);title('绿色分量直方图');
subplot(4,4,11),imhist(Ab);title('蓝色分量直方图');
subplot(4,4,6),imhist(Ar,10);title('红色指定灰度级');
subplot(4,4,9),imhist(Ag,25);title('绿色指定灰度级');
subplot(4,4,12),imhist(Ab,50);title('蓝色指定灰度级');
if length(size(A1))>2%size获得矩阵的大小,length获得矩阵最大维度
    A1=rgb2gray(A1);
end
%上面if语句可以自动判断是否为彩色图像,都会转化成二维的灰度图

subplot(4,4,2);imshow(A1);title('原图灰度化');
subplot(4,4,3);imhist(A1);title('原直方图');

%用imadjust对灰度图像进行灰度变换,用histeq进行直方图均衡处理
ima=imadjust(A1);%按默认参数进行对比度调整
his=histeq(A1);%按默认参数对直方图进行均衡化
subplot(4,4,13);imshow(ima);title('对比度默认拉伸图');
subplot(4,4,14);imhist(ima);title('对比度默认拉伸后的直方图');
subplot(4,4,15);imshow(his);title('灰度图均衡后图');
subplot(4,4,16);imhist(his);title('灰度图均衡后直方图');

%求图像矩阵均值、方差、信息熵
%求矩阵所有元素(像素)的和
[row,col]=size(A1);%获取行数 和 列数
A1=double(A1);%要先转换成double 否则不能实现累加,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算
sum=0; 
for i=1:row
for j=1:col
sum=sum+A1(i,j);
end
end
%disp(sum);

%求均值
mid=sum/(row*col);
disp(['均值mid:',num2str(mid)]);

%求方差
s=0;
for x=1:row
for y=1:col
s=s+(A1(x,y)-mid)^2;%求得所有像素与均值的平方和。
end
end
var=s/(row*col);%方差
disp(['方差var:',num2str(var)]);

%求信息熵,通信原理上面有
[M,N]=size(A1);
temp=zeros(1,256);%设置空白矩阵,用于记录概率,一行256列的0矩阵。
for m=1:M
for n=1:N
if A1(m,n)==0%如果数值为0
i=1;%序号为1
else
i=A1(m,n);%否则为原来序号
end
temp(i)=temp(i)+1;%统计每个灰度值出现的次数
end
end

temp=temp/(M*N);%所有值除以元素个数,表示概率 即公式中的P(i)
com=0;
for i=1:length(temp)%返回temp的行列中的最大值 即256
if temp(i)==0%如果概率为0 则不累加 0要单独处理
else
com=com-temp(i)*log2(temp(i));
end
end
disp(['信息熵com:',num2str(com)]);



原图(不知道会不会有校友看见这熟悉的场景!)
在这里插入图片描述变换之后的图
在这里插入图片描述具体均值方差数字如下
在这里插入图片描述

啦啦啦!加油冲! 希望能给自己不断总结,进步的同时,能帮助到其他学习者!奋斗者!

本文参考了冈萨雷斯的数字图像处理,大家可以学学,基础版,学到就是自己的!!!
和其他大佬的一些具体步骤,总的来说,自己学到了这些知识,一起进步!
https://blog.csdn.net/piaoxuezhong/article/details/78269439

  • 15
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值