MATLAB图像灰度化—优化三种灰度化算法

一、彩色、灰度、二值、索引图像

彩色图像:每个像素由R、G、B三个分量表示,每个通道取值范围0~255。数据类型一般为8位无符号整形unit8。(通常我们认为一个彩色图像是由三页组成的,分别是R、G、B,每一页都是一个二维矩阵,这三个二维矩阵的叠加构成了彩色图像)

灰度图像:每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。数据类型一般为8位无符号整形unit8。(一般认为是由一页组成,这一页并不一定是R、G、B中的一页,也可能是三者的叠加,但这一页一定是一个二维矩阵)

二值图像(黑白图像):每个像素点只有两种可能,0和1.0代表黑色,1代表白色。数据类型通常为1个二进制位。

索引图像:类似于查字典,为了解决彩色图像消耗空间大的问题,一般应用于色彩构成比较简单的场景。

二、图像灰度化的原因

在许多图像处理系统中,对图像进行归一化都是必备的预处理过程。一般而言,对于灰度图像(或彩色通道的每个颜色分量)进行灰度归一化就是:使其像素的灰度值分布在0~255之间,避免图像对比度不足(图像像素亮度分布不平衡)从而对后续处理带来干扰。
对于图像而言,灰度化处理就是使彩色的R,G,B分量值相等的过程。

三、图像灰度化的三种方法

最大值法:使R,G,B的值等于3值中最大的一个,R=G=B=max(R,G,B),最大值法会形成亮度很高的灰度图像。

平均值法:是R,G,B的值求出平均值,R=G=B=(R+G+B)/3,平均值法会形成较柔和的灰度图像。

加权平均值法:根据重要性或其他指标给R,G,B赋予不同的权值,并使R,G,B的值加权平均,R=G=B=WR+VG+UB,W,V,U分别表示权重,研究表明,人对绿色的敏感度最高,对红色次之,对蓝色的敏感度最低,因此W>V>U,实验和理论证明当W=0.30,V=0.59,U=0.11时,能得到最合理的灰度图像。
(这种方法就是matlab中自带的函数rgb2gray的原理及算法)

程序如下:

clear; % 清理工作区变量
clc;% 清除命令窗口并将光标定位
close all; % 关闭之前打开的所有显示窗口

MyYuanLaiPic = imread('m.jpg');% 读取RGB格式的图像 
% 显示原来的RGB图像  
figure(1); 
imshow(MyYuanLaiPic);

MyFirstGrayPic = rgb2gray(MyYuanLaiPic);% 用已有的函数进行RGB到灰度图像的转换  
% 显示经过系统函数运算过的灰度图像  
figure(2); 
imshow(MyFirstGrayPic);

[rows , cols , colors] =size(MyYuanLaiPic);% 得到原来图像的矩阵的参数  
MidGrayPic1 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像  
MidGrayPic1 = uint8(MidGrayPic1);% 将创建的全零矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的  
for i = 1:rows  
   for j = 1:cols  
       sum = 0;  
       for k = 1:colors  
           sum = sum + MyYuanLaiPic(i , j , k) / 3;% 进行转化的关键公式,sum每次都因为后面的数字而不能超过255  
       end  
       MidGrayPic1(i , j) = sum;  
   end  
end  
% 平均值法转化之后的灰度图像  
figure(3); 
imshow(MidGrayPic1);

MidGrayPic2 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像  
MidGrayPic2 = uint8(MidGrayPic2);% 将创建的全零矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的  
for i = 1:rows  
   for j = 1:cols  
       MidGrayPic2(i , j) =max(MyYuanLaiPic(i,j,:));  
   end  
end  
% 最大值法转化之后的灰度图像  
figure(4); 
imshow(MidGrayPic2);

MidGrayPic3 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像  
MidGrayPic3 = uint8(MidGrayPic3);% 将创建的全零矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的  
for i = 1:rows  
   for j = 1:cols  
       MidGrayPic3(i , j) = MyYuanLaiPic(i , j ,1)*0.30+MyYuanLaiPic(i , j ,2)*0.59+MyYuanLaiPic(i ,j , 3)*0.11;  
   end  
end  
% 加权平均值法转化之后的灰度图像  
figure(5); 
imshow(MidGrayPic3);

优化

  1. figure不用进行编号,MATLAB会自动编号。
  2. 在每个处理后的图像要加标题,便于对比观察。
  3. MATLAB在处理矩阵计算时很简单,可以简化代码。

优化程序如下:

clear; % 清理工作区变量
clc;% 清除命令窗口并将光标定位
close all; % 关闭之前打开的所有显示窗口

MyYuanLaiPic = imread('m.png');% 读取RGB格式的图像 
% 显示原来的RGB图像  
figure; 
imshow(MyYuanLaiPic); 
title('原图像')

MyFirstGrayPic = rgb2gray(MyYuanLaiPic);% 用已有的函数进行RGB到灰度图像的转换  
% 显示经过系统函数运算过的灰度图像  
figure; 
imshow(MyFirstGrayPic);  
title('灰度图像')

[rows , cols , colors] =size(MyYuanLaiPic);% 得到原来图像的矩阵的参数(行 = 高 ,列 = 宽 ,颜色 = 维度)  
MidGrayPic1 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像  
MyYuanlaiPic = double(MyYuanLaiPic); 
MidGrayPic1=(MyYuanlaiPic(:,:,3)+MyYuanlaiPic(:,:,2)+MyYuanlaiPic(:,:,1))/3;
% matlab中可以直接用矩阵计算,不需要用到每一个元素。
% 平均值法转化之后的灰度图像  
MidGrayPic1 = uint8(MidGrayPic1);% 将得到新矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的
figure; 
imshow(MidGrayPic1);
title('平均值图像')

MidGrayPic2 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像  
MidGrayPic2=max(max(MyYuanLaiPic(:,:,1),MyYuanLaiPic(:,:,2)),MyYuanLaiPic(:,:,3));
% matlab中max函数是两两比较型的,故需要两个max函数进行三者之间的比较
% 最大值法转化之后的灰度图像  
MidGrayPic2 = uint8(MidGrayPic2);% 将得到的新矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的 
figure; 
imshow(MidGrayPic2);
title('最大值图像')

MidGrayPic3 = zeros(rows , cols);% 用得到的参数创建一个全零的矩阵,这个矩阵用来存储用下面的方法产生的灰度图像   
MidGrayPic3 = MyYuanLaiPic(: , : , 1)*0.30+MyYuanLaiPic(: , : , 2)*0.59+MyYuanLaiPic(: ,: , 3)*0.11;  
% matlab直接进行矩阵运算
% 加权平均值法转化之后的灰度图像  
MidGrayPic3 = uint8(MidGrayPic3);% 将得到的新矩阵转化为uint8格式,因为用上面的语句创建之后图像是double型的
figure; 
imshow(MidGrayPic3);
title('加权平均值图像')

程序运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参考资料

https://blog.csdn.net/cysisu/article/details/85009351

https://blog.csdn.net/JX_Cesare/article/details/82284863

https://blog.csdn.net/discoverer100/article/details/61426650

谢谢各位观读我的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值