前言

本系列为使用matlab进行图像处理的工具类笔记,将很少涉及相关原理、公式与推导。重点在于函数应用上,此笔记的目的在于便于快速查阅和使用。

Matlab提供的图像类型

matlab提供的图像类型主要包括以下四种:索引图像、灰度图像、RGB图像、二值图像

索引图像

索引图像包括一个数据矩阵X,一个颜色映射矩阵map。

X:可以为uint8、uint16或double类型。

map:总是一个\(m\times 3\) 的double类型矩阵,且元素值位于\([0,1]\)之间。每一列分别表示红(R)、绿(G)、蓝(B),每一行表示一个颜色。

索引图像是从像素值到颜色映射表值的“直接映射”。像素颜色由数据矩阵X作为索引指向矩阵Map进行索引,例如,值1指向矩阵Map中的第一行,值2指向第二行,以此类推。

灰度图像

灰度图像一般由uint8、uint16或double类型的矩阵描述。通常0表示黑色,uint8中的255、uint16中的65535、double中的1表示白色。大于相应类型的值也为白色。

RGB图像

RGB图像又称真彩图像,它利用R、G、B三个分量来表示一个颜色,通过RGB三种基本颜色可以组合出任意颜色。对于一个\(M\times N\)的图像,matlab将储存一个\(M\times N\times 3\) 的数据矩阵。

RGB图像不是用windows的颜色映射表,像素的颜色由保存在像素位置上的红、绿、蓝的灰度值的组合来确定。图形文件格式把RGB图像存储为24位的图像,红、绿、蓝分别占8位,这样可以有1000多万种颜色。

二值图像

与灰度图像类似,不过在数据矩阵中,灰度等级只有两种,即0或1。其中0代表黑色,1代表白色。

图像类型的转换

下面将介绍matlab中上述几种图像类型的转换函数。

常用的类型转换函数:

  • rgb2gray
  • gray2ind
  • rgb2ind
  • ind2gray
  • ind2rgb
  • im2bw(imbinarize)
  • grayslice

1.rgb2gray

作用:将RGB图像转化为灰度图像。

用法:

1
X = rgb2gray(I)
  • I:原RGB图像
  • X:转换后的灰度图像

示例:

1
2
3
4
5
6
7
8
% 将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");

2.gray2ind

作用:将灰度图像或二值图像转换为索引图像。

用法:

1
[X,map] = gray2ind(I,n)
  • I - 转换前的灰度或二值图像数据矩阵
  • n - 灰度级数
  • X - 转换后得到的索引数据矩阵
  • map - 转换后得到的颜色映射矩阵

示例:

1
2
3
4
5
6
7
8
9
10
% 将灰度图像转化为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");

3.rgb2ind

作用:将RGB图像转换为索引图像。

用法:

1
2
3
4
[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):启用或禁用抖动。

关于最小方差量化法、均匀量化法不在这里介绍。

示例:

1
2
3
4
5
6
7
8
9
% 将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");

4.ind2gray

作用:将索引图像转换为灰度图像。

用法:

1
X = ind2gray(I,map)

示例:

1
2
3
4
5
6
7
8
9
10
% 将索引图像转化为灰度图像
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");

5.ind2rgb

作用:将索引图像转换为RGB图像。

用法:

1
X = ind2rgb(I,map)

示例:

1
2
3
4
5
6
7
8
9
10
% 将索引图像转化为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");

6.im2bw(imbinarize)

作用:通过阈值法将图像转化为二值图像。

用法:

1
2
BW = im2bw(I,level) % I为灰度图像或RGB图像
BW = im2bw(I,map,level) % I为索引图像
  • level:阈值,取值\([0,1]\)

注:

matlab2018 中建议用 imbinarize 来将图片转换为二值图,其参数必须为灰度图。

matlab2016 中,只有 im2bw 函数,其参数可以是灰度图或 rgb 图。

matlab2016 中可以用 im2bw 直接将 rgb 图像转换为二值图;

matlab2018 中若要使用imbinarize 图片二值化,需要先将 rgb 图片转换为灰度图(用 rgb2gray() 函数),再用 imbinarize 转换为二值图。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% 将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");

7.grayslice

作用:通过多级阈值法将灰度图像转换为索引图像。

用法:

1
2
X = grayslice(I,n)
X = grayslice(I,v)
  • n:将图像I的亮度均匀化为n个等级,默认64
  • v:按指定阈值向量v对图像I的亮度进行划分

示例:

1
2
3
4
5
6
7
8
9
% 将灰度图像转化为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");