最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了。
复习一下:
1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示数字图像的一个最小单位,称为像素。
2.数字图像处理可以理解为两个方面的操作:一个是图像到图像的处理(如图像的灰度转换,图像增强等),另外一个是图像到非图像的一种表示,比如图像的测量。
3.数字图像处理的研究内容有很多个方向,比如:
·图像数字化:将一幅图像以数字的形式表示,主要包括采样和量化两个过程。
·图像增强:将一幅图像中的有用信息进行增强,同时对无用的信息进行抑制,提高图像的可观察性。
·图像的几何变化:改变图像的大小、形状等。
·图像的变换:通过数学的方法,将空间域的图像信息 转换 到 频域、时频域等空间进行分析。
·图像识别与理解:通过对图像中各种不同的物体特征进行量化描述后,将其所期望获得的目标物进行提取,并且对所提取的目标物进行一定的定量分析。
4.位图可以使用二维的矩阵进行表示,不同的格式图像,存储格式不一样,主要有:
·二值图像:图像像素使用二维矩阵表示,矩阵的值就是像素的颜色值,值只有两个值0和1(或者0和某个不为0的值,比如0和255),只能表示两种颜色:黑和白,一般值越大越趋于白;
·8位索引图像:图像像素使用二维矩阵表示,但是矩阵的值不是像素的颜色值,矩阵的值表示索引表的序号;也就是说,8位索引图像需要一个矩阵和一张索引表来表示,索引表有256个序号,每个序号对应一组RGB值,表示了一种颜色,因此8位索引图像的一个像素有256中颜色变化。
8位索引图像有彩色图像和灰度图像之分,灰度图像的RGB值相等且都等于序号的值;而彩色图像的RBG不相等。
·24位真彩图:也是用矩阵表示,图像像素直接用RGB颜色显示,而不是通过颜色索引表。图像的像素用三个变量表示即(R,G,B),每个变量从0~255变化,因此一个像素也就是8bit*3=24bit,一个像素用24bit表示可以有2^24种颜色。
今天主要学的是:
·RGB图像转为灰度图像
·有颜色的索引表位图转换成灰度图
·RGB图像转为索引图像
·灰度图像转为索引图像
·灰度图像转为二值图像
·RGB图像转为二值图像
1、RGB图像转为灰度图像
这里的RGB图像为任何一张彩色图,然后经过转换之后,得到一张灰度图像,使用matlab实现如下所示:
close all ;%关闭所有文件
clear all ;%清除所有变量
clc ; %清屏
X=imread(\'Hydrangeas.jpg\');%读入RGB图像
I=rgb2gray(X);%进行灰度变化
set(0,\'defaultFigurePosition\',[100,100,1000,500]);%设置显示图像的窗口大小
set(0,\'defaultFigureColor\',[0 0 0]);%设置显示的背景颜色
subplot(121),imshow(X);%显示读入的图像
subplot(122),imshow(I);%显示进行灰度变化后的图像
运行一下,如下图所示:
得到如下结果:
下面说一下代码中需要注意的事项:
·imread是读入图像的函数,读入的图像需要放到当前的工作目录下,或者直接输入路径:X=imread(\'F:/图像处理/Hydrangeas.jpg\');
·rgb2gray是将彩色图像转换成灰度图像的函数
·运行之后,可以查看X和I的变量:
X是三维的,而I是二维的,这是需要注意的。
·然后:set(0,\'defaultFigurePosition\',[100,100,1000,500]);中:
[100,100,1000,500]:前面的两个参数100,1000主要是用来设置窗口的相对位置,后面的两个参数1000,500主要设置窗口大小,1000是设置窗口的横向长度,500是设置窗口的高度。 set(0,\'defaultFigureColor\',[0 0 0]);中:
[0 0 0]表示设置背景颜色为黑色。[1 0 0]表示设置背景颜色为红色,等等。
·imshow是显示图像的函数。
subplot(121)是窗口显示图像的方式,设置为在同一个窗口显示,一行两列。然后subplot(121),imshow(X)则是:X显示第一幅图像在第一行第二列的第一个位置。
subplot(122),imshow(I)则是:I显示第一幅图像在第一行第二列的第二个位置。效果如上面所示。
2.有颜色的索引表位图转换成灰度图
但是这里输入的8bit的带索引表的彩色图像,然后将它转换成灰度图。代码如下所示:
close all ;
clear all ;
clc ;
[X,map] = imread(\'Hydrangeas.bmp\');%读入图片
newmap = rgb2gray(map);%将彩色的索引表转换成灰色的索引表
figure, imshow(X,map);%显示原始的图片
figure, imshow(X,newmap);%显示转换后的图片
图片如下所示:
下面说一下需要注意的地方:
从上图中我们看到,X是一个二维的变量,此外map、newmap也是一个二维的变量;变量的含义是不一样的,X变量表示的是这是一张768x1024像素大小的图片。
而map和newmap则表示的颜色索引表的内容,总共256行,每行3列(即RGB)。
这里用figure进行显示图像。
3.RGB图像转为索引图像
这里将一幅RGB图(彩色图,比如说jpg、真彩色等彩色图)转换成索引图,也就是带索引表的图像。这里转换成索引的彩色图像,与第1.不同,代码如下:
close all ;
clear all ;
clc ;
RGB=imread(\'F:/图像处理/Hydrangeas.jpg\');
[X1,map1]=rgb2ind(RGB,64);
[X2,map2]=rgb2ind(RGB,0.2);
map3 = colorcube(128);
X3 = rgb2ind(RGB,map3);
set(0,\'defaultFigurePosition\',[100,100,1000,500]);
set(0,\'defaultFigureColor\',[0 1 1]);
figure;
subplot(131),imshow(X1,map1),title(\'最小方差转换\');
subplot(132),imshow(X2,map2),title(\'均匀量化发转换\');
subplot(133),imshow(X3,map3),title(\'颜色近似法转换\');
下面解释一下代码:
RGB=imread(\'F:/图像处理/Hydrangeas.jpg\');
这是读入图像了,跟前面的两种转换方式的意思一样,读入的是一幅彩色图像。
[X1,map1]=rgb2ind(RGB,64);
[X2,map2]=rgb2ind(RGB,0.2);
这两行代码都用到了rgb2ind这个函数,我们来看一下这个函数的意思:
由此,我们可以知道,
[X1,map1]=rgb2ind(RGB,64);就是使用最小方差量化将RGB图像转换为索引图像X. MAP最多包含N种颜色。 N必须<= 65536。
[X,MAP] = rgb2ind(RGB,TOL)使用均匀量化将RGB图像转换为索引图像X. MAP最多包含(FLOOR(1 / TOL)+1)^ 3种颜色。 TOL必须介于0.0和1.0之间。、
这里FLOOR=1,当TOL等于0.2时,则表示216种颜色。
map3 = colorcube(128);
X3 = rgb2ind(RGB,map3);
上面的两行代码则是创建一个指定颜色数目的所以表,然后用这个索引表进行近似显示RGB图。colorcube增强的彩色立方体颜色图。 colorcube(M)返回一个包含彩色立方体的M-by-3矩阵。 colorcube本身的长度与当前的色彩映射相同。 彩色立方体在RGB色彩空间中包含尽可能多的定期间隔的颜色,同时尝试提供更多的灰色,纯红,纯绿和纯蓝色的步骤。 该多维数据集的算法灵感来自默认的Macintosh系统colortable,对于M = 256,colorcube返回完全相同的颜色。 对于M <8,返回长度为M的灰色斜坡。
后面的代码则是显示了,不再多说。
下面的显示效果:
4.灰度图像转为索引图像
我们先将彩色图像转换成灰度图像,然后再讲灰度图像转换成8种颜色的索引表(也就是索引表长度为8),代码如下所示:
close all ;
clear all ;
clc ;
RGB=imread(\'F:/图像处理/Hydrangeas.jpg\');
gray=rgb2gray(RGB);%得到灰度图
[X,map] = gray2ind(gray,8);%将灰度图转成索引图,8种颜色
set(0,\'defaultFigurePosition\',[100,100,1000,500]);
set(0,\'defaultFigureColor\',[0 0 0]);
figure;
subplot(121), imshow(gray);%显示灰度的图片
subplot(122), imshow(X,map);%显示转换后的图片
这里需要说明的是用到了gray2ind函数,这个就是将灰度图像转换成索引图像的函数,功能如下所示:
我们这里取N=8,索引表长度为8。运行效果如下所示:
5.灰度图像转为二值图像
我们也是先将RGB图转成灰度图,然后在将灰度图转为二值图像,代码如下所示:
close all ;
clear all ;
clc ;
RGB=imread(\'F:/图像处理/Hydrangeas.jpg\');
gray=rgb2gray(RGB);%得到灰度图
BW1 = im2bw(gray,0.3);%将灰度图转成二值图,阈值为0.4
BW2 = im2bw(gray,0.7);%将灰度图转成二值图,阈值为0.7
set(0,\'defaultFigurePosition\',[100,100,1000,500]);
set(0,\'defaultFigureColor\',[1 1 1]);
figure;
subplot(131), imshow(gray);%显示灰度的图片
subplot(132), imshow(BW1);%显示转换后的图片
subplot(133), imshow(BW2);%显示转换后的图片
这里需要说明的是,灰度转二值图的函数是im2bw,后面的阈值的意思是,判断哪些该转换成1,哪些该转换成0,阈值设置得越小,得到的二值图像的白色面积越多。代码运行的效果如下所示:
6.RGB图转为二值化图像
读进RGB图之后,直接转为二值图像,代码如下所示:
close all ;
clear all ;
clc ;
RGB=imread(\'F:/图像处理/Hydrangeas.jpg\');
BW1 = im2bw(RGB,0.3);%将灰度图转成二值图,阈值为0.4
BW2 = im2bw(RGB,0.7);%将灰度图转成二值图,阈值为0.7
set(0,\'defaultFigurePosition\',[100,100,1000,500]);
set(0,\'defaultFigureColor\',[1 1 1]);
figure;
subplot(131), imshow(RGB);%显示灰度的图片
subplot(132), imshow(BW1);%显示转换后的图片
subplot(133), imshow(BW2);%显示转换后的图片
运行效果如下所示: