本系列为使用matlab进行图像处理的工具类笔记,将很少涉及相关原理、公式与推导。重点在于函数应用上,此笔记的目的在于便于快速查阅和使用。
matlab提供的图像类型主要包括以下四种:索引图像、灰度图像、RGB图像、二值图像
索引图像包括一个数据矩阵X,一个颜色映射矩阵map。
X:可以为uint8、uint16或double类型。
map:总是一个 m × 3 m\times 3 m×3 的double类型矩阵,且元素值位于 [ 0 , 1 ] [0,1] [0,1]之间。每一列分别表示红(R)、绿(G)、蓝(B),每一行表示一个颜色。
索引图像是从像素值到颜色映射表值的“直接映射”。像素颜色由数据矩阵X作为索引指向矩阵Map进行索引,例如,值1指向矩阵Map中的第一行,值2指向第二行,以此类推。
灰度图像一般由uint8、uint16或double类型的矩阵描述。通常0表示黑色,uint8中的255、uint16中的65535、double中的1表示白色。大于相应类型的值也为白色。
RGB图像又称真彩图像,它利用R、G、B三个分量来表示一个颜色,通过RGB三种基本颜色可以组合出任意颜色。对于一个 M × N M\times N M×N的图像,matlab将储存一个 M × N × 3 M\times N\times 3 M×N×3 的数据矩阵。
RGB图像不是用windows的颜色映射表,像素的颜色由保存在像素位置上的红、绿、蓝的灰度值的组合来确定。图形文件格式把RGB图像存储为24位的图像,红、绿、蓝分别占8位,这样可以有1000多万种颜色。
与灰度图像类似,不过在数据矩阵中,灰度等级只有两种,即0或1。其中0代表黑色,1代表白色。
下面将介绍matlab中上述几种图像类型的转换函数。
常用的类型转换函数:
- rgb2gray
- gray2ind
- rgb2ind
- ind2gray
- ind2rgb
- im2bw(imbinarize)
- grayslice
作用: 将RGB图像转化为灰度图像。
用法:
X = rgb2gray(I)
- I:原RGB图像
- X:转换后的灰度图像
示例:
% 将RGB图像转换为灰度图像
clc;clear;close all;
I = imread("example.jpg");
subplot(1,2,1),imshow(I);
title("original");
X = rgb2gray(I);
subplot(1,2,2),imshow(X);
title("gray img");
作用: 将灰度图像或二值图像转换为索引图像。
用法:
[X,map] = gray2ind(I,n)
- I - 转换前的灰度或二值图像数据矩阵
- n - 灰度级数
- X - 转换后得到的索引数据矩阵
- map - 转换后得到的颜色映射矩阵
示例:
% 将灰度图像转化为4个灰度级的索引图像
clc;clear;close all;
I = imread("example.jpg");
I = rgb2gray(I); % 将RGB图像转换为灰度图像
subplot(1,2,1),imshow(I);
title("original");
[X,map] = gray2ind(I,4);
subplot(1,2,2),imshow(X,map);
title("gray(4) img");
作用: 将RGB图像转换为索引图像。
用法:
[X,map] = rgb2ind(RGB,n)
[X,map] = rgb2ind(RGB,tol)
X = rgb2ind(RGB,inmap)
___ = rgb2ind(___,dithering)
说明:
- [X,map] = rgb2ind(RGB,n) :使用具有
n
种量化颜色的最小方差量化法并加入抖动,将 RGB 图像转换为索引图像X
,关联颜色图为map
。- [X,map] = rgb2ind(RGB,tol):使用均匀量化法并加入抖动,将 RGB 图像转换为索引图像,容差为
tol
。- X = rgb2ind(RGB,inmap) :使用逆颜色图算法并加入抖动,将 RGB 图像转换为索引图像,指定的颜色图为
inmap
。- _ = rgb2ind(_,dithering):启用或禁用抖动。
关于最小方差量化法、均匀量化法不在这里介绍。
示例:
% 将RGB图像转化为包含4种颜色的索引图像
clc;clear;close all;
I = imread("example.jpg");
subplot(1,2,1),imshow(I);
title("original");
[X,map] = rgb2ind(I,4);
subplot(1,2,2),imshow(X,map);
title("rgb\_ind(4) img");
作用: 将索引图像转换为灰度图像。
用法:
X = ind2gray(I,map)
示例:
% 将索引图像转化为灰度图像
clc;clear;close all;
I = imread("example.jpg");
[I,map] = rgb2ind(I,4);% 将RGB图像转化为包含4种颜色的索引图像
subplot(1,2,1),imshow(I,map);
title("original");
X = ind2gray(I,map);
subplot(1,2,2),imshow(X);
title("gray img");
作用: 将索引图像转换为RGB图像。
用法:
X = ind2rgb(I,map)
示例:
% 将索引图像转化为RGB图像
clc;clear;close all;
I = imread("example.jpg");
[I,map] = rgb2ind(I,4);% 将RGB图像转化为包含4种颜色的索引图像
subplot(1,2,1),imshow(I,map);
title("original");
X = ind2rgb(I,map);
subplot(1,2,2),imshow(X);
title("RGB img");
作用: 通过阈值法将图像转化为二值图像。
用法:
BW = im2bw(I,level) % I为灰度图像或RGB图像
BW = im2bw(I,map,level) % I为索引图像
注:
在 matlab2018 中建议用 imbinarize 来将图片转换为二值图,其参数必须为灰度图。
在 matlab2016 中,只有 im2bw 函数,其参数可以是灰度图或 rgb 图。
在 matlab2016 中可以用 im2bw 直接将 rgb 图像转换为二值图;
在 matlab2018 中若要使用imbinarize 图片二值化,需要先将 rgb 图片转换为灰度图(用 rgb2gray() 函数),再用 imbinarize 转换为二值图。
示例:
% 将RGB图像转化为二值图像
clc;clear;close all;
I = imread("example.jpg");
subplot(3,2,1),imshow(I);
title("original RGB");
X_1 = im2bw(I,0.5);
subplot(3,2,2),imshow(X_1);
title("RBG\_bw img");
% 将灰度图像转化为二值图像
I_2 = rgb2gray(I); % 将RGB图像转化为灰度图像
subplot(3,2,3),imshow(I_2);
title("original gray");
X_2 = im2bw(I_2,0.5);
subplot(3,2,4),imshow(X_2);
title("gray\_bw img");
% 将索引图像转化为二值图像
[I_3,map_3] = rgb2ind(I,4);% 将RGB图像转化为包含4种颜色的索引图像
subplot(3,2,5),imshow(I_3,map_3);
title("original index");
X_3 = im2bw(I_3,map_3,0.5);
subplot(3,2,6),imshow(X_3);
title("index\_bw img");
作用: 通过多级阈值法将灰度图像转换为索引图像。
用法:
X = grayslice(I,n)
X = grayslice(I,v)
示例:
% 将灰度图像转化为8级索引图像
clc;clear;close all;
I = imread("example.jpg");
I = rgb2gray(I); % 将RGB图像转化为灰度图像
subplot(1,2,1),imshow(I);
title("original");
X = grayslice(I,8);
subplot(1,2,2),imshow(X,jet(8)); % jet:蓝头红尾饱和色
title("index\_jet");
I的亮度进行划分
示例:
% 将灰度图像转化为8级索引图像
clc;clear;close all;
I = imread("example.jpg");
I = rgb2gray(I); % 将RGB图像转化为灰度图像
subplot(1,2,1),imshow(I);
title("original");
X = grayslice(I,8);
subplot(1,2,2),imshow(X,jet(8)); % jet:蓝头红尾饱和色
title("index\_jet");