在数字图像处理中,有时需要将图像进行变换后才能进行处理,本节主要对图像平移、旋转、缩放、剪切和翻转等基本的图像变换处理方法进行介绍。
2.5.1 图像的平移
平移包括左移、右移、上移和下移。平移处理就是根据需要,将图像中每个位置的像素值移动到另一个位置。在MATLAB中,图像的位置坐标表示法和数学上的不太一致,在MATLAB中x轴是从左到右,y轴是从上到下,原点在左上角。图2-26中的红点在MATLAB中的坐标为(100,50),即距离图像左边界的距离为100像素,距离图像上边界的距离为50像素。
图2-26 图像在MATLAB中的坐标形式
图像平移就是平移图像中的像素点的位置,首先需要创建一个新图像newimg存放平移后的图像,newimg和原图像的尺寸信息一致。通常,我们设newimg=ones(size(img))或者newimg=zeros(size(img)),这样便可保证平移后空白的部分为纯白色或纯黑色。
假设a表示上下平移量,b表示左右平移量。
如果对一个灰度图像进行平移,则newimg(i,j)=img(i+a,j+b)。
如果对一个真彩色图像进行平移,则newimg(i,j,:)=img(i+a,j+b,:)。
a大于0表示上移,a小于0表示下移。b大于0表示左移,b小于0表示右移。下面我们通过Code19来说明如何对图像进行平移处理。
Code19:ch2_19.m
运行Code19后,结果如图2-27所示,图(b)是向左平移50像素后的结果。修改Code19中的平移量:a=50,b=-50,再运行Code19后,结果如图2-28所示,图(b)是向右平移50像素并且向上平移50像素后的结果。
图2-27 图像向左平移50像素
图2-28 图像向右平移50像素并向上平移50像素
读者可根据需求自行修改垂直平移量a的值和水平平移量b的值。
Code19在对图像平移的同时,对超出边界范围的图像进行了截取,如果不想截取,则可根据需要的平移量在水平或垂直方向上扩展newimg的尺寸。本书在此不做更多介绍。
2.5.2 图像的旋转
在数字图像处理中,图像旋转是一种不可或缺的图像变换操作之一。图像旋转就是以图像中心作为原点,将图像按照顺时针或者逆时针旋转一定角度。由于在MATLAB中图像都是以数值矩阵的形式存储的,因此,图像的旋转本质上就是像素点的旋转。在MATLAB中,函数imrotate可以实现图像的旋转,格式如下。
Newimg=imrotate(img,angle,method,bbox)
Newimg是旋转后的图片,img是旋转前的图片。
angle表示旋转的角度,angle>0,图像逆时针旋转;angle<0,图像顺时针旋转。
method表示旋转时采用的方法,如果不设置,则默认method=nearest,表示最近邻插值。也可以选择其他方法,如method=bilinear,表示双线性插值;method=bicubic,表示双三次插值。
bbox表示返回图像的大小,bbox=crop表示输出图像与原图像尺寸一致;bbox=loose表示输出图像有足够的空间包含旋转后的图像。若不设置bbox的值,则默认bbox=loose。
下面我们通过Code20来说明如何利用函数imrotate实现图像的旋转。
Code20:ch2_20.m
运行Code20后,结果如图2-29所示,可以看到原图像和各种不同旋转处理后的效果。图(a)是原图像;图(b)是angle=50,即逆时针旋转50°后的图像;图(c)是angle=-50,method=bilinear,即顺时针旋转50°并且旋转方法为双线性插值;图(d)是angle=50,bbox=crop,即逆时针旋转50°,并且旋转后的图像和原图像尺寸一致,越界的部分图像进行截取处理。图(b)和图(c)中转换后的图像是完整的。
图2-29 Code20的运行结果
2.5.3 图像的缩放
图像缩放是将原图像按照一定的比例进行缩小或放大。如果垂直方向和水平方向的缩放比例是一样的,则图像是全比例缩放,不会变形;若不一致,则缩放后的图像会发生几何畸形。在MATLAB中,函数imresize可以实现图像的缩放,格式如下。
Newimg=imresize(img,m);
img是原图像,可以是灰度图像、RGB图像或者二值图像。Newimg是缩放后的图像。m是缩放的比例,当0<m<1时,图像缩小;当m>1时,图像放大。
Newimg=imresize(img,[rows,clos])
img是原图像,可以是灰度图像、RGB图像或者二值图像。Newimg是缩放后的图像。rows和clos分别是缩放后的图像Newimg的行和列。
[newX newmap]=imresize(X,map,m)
和
[newX newmap]=imresize(X,map, [rows,clos])
这两种格式适用于索引图像的缩放,m和rows、clos的意义同上。
下面我们通过Code21来说明如何利用函数imresize实现图像的缩放。
Code21:ch2_21.m
运行Code21后,结果如图2-30所示。结果分为两组图,Figure1是对RGB图像的缩放,图(a)是原RGB图像,图(b)是缩小后的RGB图像,图(c)是放大后的RGB图像,图(d)是限制图像输出尺寸后的RGB图像。Figure2是对索引图像的缩放,图(a)是原索引图像,图(b)是缩小后的索引图像。
图2-30 Code21的运行结果
函数imresize还有一些可以设置的参数,如缩放方法method和缩放特性parameter,关于这些参数的使用,读者可以查阅MATLAB的帮助文档进行更多的学习。
2.5.4 图像的剪切
在数字图像处理中,我们通常需要获取一幅图像中我们感兴趣的部分。如果我们需要获取图2-31中包含人脸的那一部分,即方框区域内的图像,那么就需要对图像进行剪切处理。在MATLAB中,函数imcrop可以实现图像的剪切,格式如下。
newimg=imcrop(img,rect);
newimg是剪切后的图像。img是原图像,如果原图像是灰度图像、RGB图像或者二值图像,那么img就是图像矩阵;如果原图像是索引图像,则img=X,即[X,map]=imread(/'索引图像/')中的X矩阵。rect是剪切的区域,其形式为[x,y,w,h],(x,y)是剪切区域的左上角坐标,w是剪切区域的宽度,h是剪切区域的高度。
[newimg,rect]=imcrop(img)
和
[X,Y,newimg,rect]=imcrop(img)
img为原图像,如果是索引图像,则img就是数据矩阵X。
使用这两种格式,首先会显示img,然后会出现剪切工具,利用鼠标进行剪切后,会把剪切区域信息返回给newimg、rect和X、Y。
图2-31 对方框区域内的图像进行剪切
下面我们通过Code22来说明在给定剪切区域范围的情况下,如何利用函数imcrop实现图像的剪切。
Code22:ch2_22.m
运行Code22后,结果如图2-32所示。程序首先读入索引图像,设置剪切区域为[100,100,100,100],使用函数imcrop在索引图像上截取该区域。然后读入RGB图像,使用函数imcrop在RGB图像上截取相同的区域。最后在Figure1中显示原索引图像和对应的截取区域,在Figure2中显示原RGB图像和对应的截取区域。
图2-32 Code22的运行结果
图2-32 Code22的运行结果(续)
下面我们通过Code23来说明在没有给定剪切区域范围的情况下,如何把函数imcrop当作剪切工具进行图像的剪切。
Code23:ch2_23.m
运行Code23后,首先会显示原图像,并且出现剪切工具,可通过滑动鼠标选择要截取的图像区域,如图2-33所示。选择好要截取的区域后,双击该区域,此时截图完成,可以看到工作空间增加了rect和newimg。rect是截取图像的范围,如图2-34所示;newimg是截取的图像矩阵。最后显示原图像和截图部分的图像,并且以截取范围在原图像上作一个矩形框,如图2-35所示。
图2-33 滑动鼠标选择要截取的图像区域
如图2-34 截取图像的范围
图2-35 Code23的运行结果
2.5.5 图像的翻转
在数字图像处理中,图像的镜像就是对图像进行翻转,分为水平镜像和垂直镜像。水平镜像是以图像的垂直中心轴,将图像左右部分进行翻转;垂直镜像是以图像的水平中心轴,将图像上下部分进行翻转。在MATLAB中,函数fliplr可以实现矩阵的水平翻转,函数flipud可以实现矩阵的垂直翻转。由于在MATLAB中,图像是以矩阵的形式存在的,因此可使用函数fliplr和flipud进行图像的翻转,格式如下。
如果是索引图像,则只翻转它的数据矩阵X即可([X,map]=imread(ind))。
下面通过Code24来说明如何利用函数fliplr和flipud进行图像的翻转。
Code24:ch2_24.m
运行Code24后,结果如图2-36所示,Figure1是对灰度图像的各种翻转,Figure2是对索引图像的各种翻转。
图2-36 Code24的运行结果
图2-36 Code24的运行结果(续)