第3章图像运算与图像几何变换 图像运算和图像几何变换是数字图像处理的基础,非常重要。本章主要介绍图像的 代数和逻辑运算、图像的邻域和模板运算、图像的几何变换。 3.图像的代数和逻辑运算 1 图像的代数运算是图像的算数操作实现方法,指两幅输入图像之间进行的点对点的 加、减、乘、除运算得到输出图像的过程。图像的逻辑运算指将两幅图像对应像素进行 与、或、非等逻辑运算过程。算数运算和逻辑运算的原理简单易懂,实际应用经常用到。 假设两幅输入图像分别为f1(x,和f2(y), x, y) x,二者运算的输出结果图像为g(y), 则图像的代数运算有如下四种形式: g(x,=x,x,(31) y)αf1(y)+βf2(y) g(y)=αf1(y)-βf2(y)3 x,x,x,(2) y)x,x,( g(x,=x,x,( g(x,=αf1(y)×f2(y) 33) y)αf1(y)÷f2(y) 34) 使用图像处理工具箱中的图像代数运算函数无须再进行数据类型间的转换,这些函 数能够接受u8和u16数据,并返回相同格式的图像结果。其代数运算函数如表3. intint1 所示。需要注意的是,代数运算的结果有时需要使用一些截取规则使得运算结果符合数 据范围的要求,例如,图像乘法运算很容易出现结果超出数据类型允许范围的情况,图像 除法运算也会产生不能用整数描述的分数结果的情况,等等。此时一定要对算数运算结 果做截取操作,保证图像像素值在0~255之间。下面具体介绍一下各种代数运算的 用法。 表3.MATLAB图像处理工具箱中的代数运算函数 1 函数名 imabsdif imadd imcomplement imdivide 功能描述 两幅图像的绝对差值 两幅图像的加法 补足一幅图像 两幅图像的除法 51 函 数 名功能描述 imlincomb 计算两幅图像的线性组合 immultiply 两幅图像的乘法 imsubstract 两幅图像的减法 3.1.1 图像的加法运算 图像加法运算一般用于如下场合:①对同一场景的多幅图像求平均效果,以有效地 降低具有叠加性质的随机噪声;②将一幅图像的内容叠加到另一幅图像上去,以改善图 像的视觉效果;③图像融合与图像拼接。 图像的加法运算如式(3-1)所示,其中,参与运算的两幅图像f1(x,y)、f2(x,y)和 输出结果图像g(x,y)是同等大小的图像。需要注意的是,两幅图像相加时产生的结果 很可能超过图像数据类型所支持的最大值,尤其对于uint8类型的图像,溢出情况很常 见,当数据值发生溢出时,可以采用下面两种方法进行处理。 1.截断处理 g(x,y)=255, g(x,y)>255 g(x,y)=g(x,y), 其他} (3-5) 即如果g(x,y)>255,则仍取255,但新图像g(x,y)像素值偏大,图像整体较亮,后 续需要灰度级调整。 2.加权求和 g(x,y)=αf1(x,y)+ (1-α)f2(x,y), α ∈ [0,1] (3-6) 这种方法需要选择合适的加权系数α。 加法运算MATLAB实现函数为Z=imadd(X,Y)。 imadd函数将数据截取为数据类型所支持的最大值,这种截取效果称为饱和现象,为 了避免饱和现象,进行加法运算时,最好将图像转换为一种数据范围较宽的数据类型,例 如,将uint8类型转换为uint16类型。若X、Y 均为图像,则要求X和Y 的尺寸相等,对 应运算和大于255,则Z仍取255,即截断处理;若Y是一个标量,则Z表示对图像X整体 加上Y值;若Z为整型数据,对小数部分取整,超出整型数据范围的被截断。 【例3-1】 图像加法运算示例。 解:MATLAB代码如下所示: clear all;close all;clc; Before=imread('clock2.gif'); Back=imread('clock1.gif'); ZJ1=imadd(Before,-80); ZJ2=imadd(Back,-80); result1=imadd(Back,Before); result2=imadd(Back,ZJ1); 续表 52 result3=imadd(ZJ2,Before); imwrite(ZJ1,'暗前景图.jpg'); imwrite(ZJ2,'暗背景图.jpg'); imwrite(result1,'前聚焦叠加后聚焦结果.jpg'); imwrite(result2,'暗前景叠加后聚焦结果.jpg'); imwrite(result3,'暗背景叠加前聚焦结果.jpg'); subplot(231),imshow(Before),title('前聚焦图'); subplot(232),imshow(Back),title('后聚焦图'); subplot(233),imshow(ZJ2),title('暗前景图'); subplot(234),imshow(result1),title('前聚焦叠加后聚焦结果'); subplot(235),imshow(result3),title('暗背景叠加前聚焦结果'); subplot(236),imshow(result2),title('暗前景叠加后聚焦结果'); 程序运行结果如图3.1所示。 图3.1 图像加法运算示例 3.1.2 图像的减法运算 图像减法运算一般用于如下场合:①显示两幅图像的差异或变化,例如,在运动目标 检测应用中,检测同一场景两幅图像之间的变化,视频图像边界的检测等;②去除背景阴 影或周期性的噪声等不需要的叠加性图案或去除图像上每一个像素处均已知的附加污 染等;③图像分割,例如,在运动图像分割任务中,减法相邻运动帧图像间的静止部分,剩 余的就是运动目标和噪声信息;④生成合成图像,在利用图像减法处理图像时往往需要 考虑背景的更新机制,补偿由于大气、光照等因素对图像显示效果造成的影响。 图像的减法运算如式(3-2)所示,其中,参与运算的两幅图像f1(x,y)、f2(x,y)和 输出结果图像g(x,y)是同等大小的图像。需要注意的是,两幅图像相减时,对应像素值 的差可能为负数,遇到这种情况时,可以采用下列方法进行处理。 53 1.截断处理 g(x,y)=0, g(x,y)<0 g(x,y)=g(x,y), 其他} (3-7) 即如果g(x,y)<0,则仍取0,但新图像g(x,y)像素值偏小,图像整体较暗,后续需 要灰度级调整。 2.取绝对值 g(x,y)=|f1(x,y)-f2(x,y)| (3-8) 减法运算MATLAB实现函数为: Z=imsubstract(X,Y):差值结果小于0的赋值为0,对X、Y 的要求与imadd()函 数相同。 Z=imabsdiff(X,Y):差值结果取绝对值。 【例3-2】 图像减法运算示例。 解:MATLAB代码如下所示: clear all;close all;clc; Before=imread('clock2.gif'); Back=imread('clock1.gif'); result=imabsdiff(Before,Back); result2=imsubstract(Before,Back); imwrite(result*5,'相减取绝对值结果.jpg'); imwrite(result2*5,'直接相减结果.jpg'); subplot(222),imshow(Before),title('前聚焦图'); subplot(221),imshow(Back),title('后聚焦图'); subplot(223),imshow(result*5),title('相减取绝对值结果'); subplot(224),imshow(result2*5),title('直接相减结果'); 程序运行结果如图3.2所示。 图3.2 图像减法运算示例 54 3.1.3 图像的乘法运算 图像乘法运算可以实现图像的局部显示和提取,屏蔽掉图像的某些部分。一幅图像 乘以一个常数被称为缩放操作。若缩放因子大于1,图像变亮;若缩放因子小于1,图像 变暗。缩放通常将产生比简单添加像素偏移量自然得多的明暗效果,更好地维持图像相 关对比度。此外,时域卷积或相关运算与频率域乘积运算相对应。因此,乘法运算有时 也被作为一种技巧实现卷积或相关处理。 图像的乘法运算如式(3-3)所示,其中,参与运算的两幅图像f1(x,y)、f2(x,y)和 输出结果图像g(x,y)是同等大小的图像。需要注意的是,乘积通常会超出uint8类型的 最大值,超出部分会被截断,截断方法可参考图像加法运算的截断处理方式。 乘法运算MATLAB实现函数为: Z=immultiply(X,Y)。对X、Y的要求与imadd()相同。若X、Y 为uint8类型的数 据,乘积结果如超出uint8类型的最大值需要进行截断处理。 【例3-3】 图像乘法运算示例。 解:MATLAB代码如下所示: clear all;close all;clc; Image=im2double(imread('football.jpg')); Templet=im2double(imread('footballtemplet.jpg')); result=immultiply(Templet,Image); imwrite(result,'相乘结果.jpg'); subplot(131),imshow(Image),title('背景图'); subplot(132),imshow(Templet),title('模板'); subplot(133),imshow(result),title('相乘结果'); 程序运行结果如图3.3所示。 图3.3 图像乘法运算示例 3.1.4 图像的除法运算 图像除法运算可以用于校正成像设备的非线性影响、检测两幅图像之间的区别、消 55 除空间可变的量化敏感函数、产生比率图像等,这在特殊形态的图像(如断层扫描医学图 像)处理中较为常用。图像除法操作给出的是相应像素值的变化比率,而不是每个像素 的绝对差异,因而图像除法也称为比率变换。 图像的除法运算如式(3-4)所示,其中,参与运算的两幅图像f1(x,y)、f2(x,y)和 输出结果图像g(x,y)是同尺寸的图像。需要注意的是,除法运算如遇到超出uint8类型 的最大值,超出部分会被截断,截断方法可参考图像加法运算的截断处理方式。 除法运算MATLAB实现函数:Z=imdivide(X,Y)。 【例3-4】 图像除法运算示例。 解:MATLAB代码如下所示: clear all;close all;clc; I=double(imread('football.jpg')); J=double(imread('footballtemplet.jpg')); Ip = imdivide(I, J); subplot(131),imshow(uint8(I)),title('背景图'); subplot(132),imshow(uint8(J)),title('模板'); subplot(133),imshow(Ip),title('相除结果'); imwrite(Ip,'相除结果.jpg'); 程序运行结果如图3.4所示。 图3.4 图像除法运算示例 3.1.5 逻辑运算 两幅图像对应像素间也可以进行与、或、非等逻辑运算。 非运算:g(x,y)=255-f(x,y),用于获得原图像的补图像。 与运算:g(x,y)=f1(x,y)&f2(x,y),用于求两幅图像的相交子图,可作为模板运算。 或运算:g(x,y)=f1(x,y)|f2(x,y),用于合并两幅图像的子图像,可作为模板 运算。对 应的MATLAB函数为: (1)C=bitcmp(A)。A 为有符号或无符号整型矩阵,C为A 按位求补。 (2)C=bitand(A,B)。A 和B为有符号或无符号整型矩阵,C为A、B按位求与。 56 (3)C=bitor(A,B)。A 和B为有符号或无符号整型矩阵,C为A、B按位求或。 (4)C=bitxor(A,B)。A 和B为有符号和无符号整型矩阵,C为A、B按位求异或。 (5)&、|、~运算符。相“&”的两个数据非零则输出1,否则为0;相“|”的两个数,一 个非零则输出1;“~A”的意思是若A 为0,则输出1,否则输出0。要注意运算符与按位 逻辑运算不一致。 【例3-5】 两幅图像进行逻辑运算的MATLAB实现。 解:MATLAB代码如下所示: clear all;close all;clc; Image = imread('football.jpg'); Templet = imread('footballtemplet.jpg'); result1 = bitcmp(Image ); result2 = bitand(Templet,Image ); result3 = bitor(Templet,Image ); result4 = bitxor(Templet,Image ); subplot(231),imshow(Image ),title('原图'); subplot(232),imshow(Templet),title('模板'); subplot(233),imshow(result1),title('求反'); subplot(234),imshow(result2),title('相与'); subplot(235),imshow(result3),title('相或'); subplot(236),imshow(result4),title('异或'); imwrite(result1,'求反.jpg'); imwrite(result2,'相与.jpg'); imwrite(result3,'相或.jpg'); imwrite(result4,'异或.jpg'); 程序运行结果如图3.5所示。 图3.5 逻辑运算结果 3.图像的邻域运算和模板运算 图像处理中邻域运算和模板运算非常实用和常见,邻域运算通常是以包含中心像素 在内的邻域为分析对象,每个像素点和其周围邻域内的点共同参与运算,是多种图像处 理算法的运算方式。模板通常也称滤波器(itr核(enl掩模(empae或窗口 fles)、kres)、tlts) (windows), 模板运算本质上也是一种邻域运算。邻域运算能够将像素关联起来,处理结 果来源于对邻域内像素灰度值的计算。点运算是邻域运算的基础,是对图像中每个像素 点进行运算,其他点的值不会影响到该像素点,如图像的几何变换、灰度级变换等。本节 先介绍像素间的基本距离度量关系、邻点和邻域等基本概念,再介绍邻域和模板运算。 3.2.1 像素间的基本关系 图像是一种二维信号,像素在图像空间是按某种规律排列的,同时与其他像素又构 成了相互的空间关系,因此,首先对常用的像素间基本关系进行介绍。 假设图像上的任意三个像素pq 和z, x,t) v,表示, 、y),( 其坐标分别用(s,和(w) 如 果满足: (1)D(q)≥0,当且仅当p=p,=0成立, p, q 时有 D (q)即两点之间距离大于或等 于0,距离应满足非负性; (2)D(q)q,即距离与方向无关; ( p,=D(p), z), 两点之间直线距离最短。 3)D(p,p,+D( z)≤D(q)q, 则 D 是距离函数或距离度量 。 在图像处理中,常用的距离函数有三种,即欧氏距离、城市街区距离和棋盘距离。下 面分别介绍这三种距离函数。值得注意的是距离函数与任何通路无关,仅与点的坐标 有关。 1. 欧氏距离 欧氏距离是一个最常用的距离度量,p(y) s,两点间的欧氏距离De x,和q(t) 定义为 2 De(q)(s)yt)39) p,=-2+ (-( 欧氏距离示意图如图3.氏距(x) x,的距离小于或等于某一值 6所示。欧离是指距点(y) r(必须是非负实数)的像素组成的集合,是以(x,y) 为圆心,其中距离等于 r 的像素 r 为半径的圆平面 , 位于圆上 。 2. 城市街区距离 p(x,和q(t) 或 y) s,两点间的城市街区距离( 称为D4 距离)定义为图3.6 欧氏距离示意图 q)| x s|+| y t| 310)D4(p,=- y) -(- 必须是非负实数) 城市街区距离是指距点(x,的距离小于或等于某一值r( 的像素 组成的集合,是以(y) 对角线分别为 x 轴和 y 轴且长度为2r 的正方形,其中 x,为中心, 距离等于r的像素位于正方形的四个边上。 例如,距(y) 7所示。 x,点的D4 距离小于或等于2的像素构成的 城市街区距离如图3. 3. 棋盘距离 p(x,和q(t) 或称为D8 距离) y) s,两点间的棋盘距离( 定 义为 D8(p,=ma| x s|,| y t|) (311) q)x(-- 棋盘距离是指距点(x,y)的距离小于或等于某一值r(必图3.7 城市街区距离 须是非负实数)的像素组成的集合,是以(x,y)为中心,边长为示意图 2r 的正方形,且正方形的边分别与 x 轴平行或垂直,其中距离 等于 r 的像素位于正方形的四个边上。 例如,距(y)8所示。 x,点的D8 距离小于或等于2的像素构成的棋盘距离如图3. 【例36】9所示pq 两点间的De D4 和D8 -试计算图3.、、。 图3.8 棋盘距离示意图图3.9 p、 q 两点位置示意图 解:根据距离计算定义,假设 p 点坐标位置为p(0,0), 则 q 点坐标位置为q(3, 4), 则 De(p, = (-s)y-t)= 2 q) x 2+ (5 D4(p,=|x-s|+|y-t|=7 q) D8(p,=max(--= q)| x s|,| y t|)4 3.2.2 邻点和邻域 图像是由像素构成的,对于一个像素而言,其邻近像素之间 关系密切。图像中相邻的像素构成邻域,邻域中的像素点互为 邻点。根据对近邻像素的不同定义,可以得到由不同邻近像素 组成的邻域,常用的像素邻域主要有如下3种。 1.4邻域 假设位于坐标(x,的一个像素p, 10 所示,则其空 y) 如图3. 间上有四个水平和垂直的邻近像素(黑色), 其坐标分别为(x+ 图3.10 像素的邻域y),(y),(y+1),(1), 即点 p 具有D4=1的 1,x-1,x,x,y 像素集合,称为像素 p 的4邻域,用N4(p)表示。 2. 对角邻域 像素的邻域如图3.则其有空间上有四个对角的相邻像素( 其坐标分 10 所示, 灰色), 别为(x+1,x-y-1),(1,x+1,y-用ND (表示, y+1),(1,x-y+1),(1), p) 称为像 素 p 的对角邻域。 3.8领域 与4邻域的4个点组成的8个点称为像素 p 的8邻域,用N8(p)表示。可以看出, 8邻域是图像中所有D8 距离等于1的点的集合。 需要指出,像素的4邻点和8邻点由于与像素直接相邻,因此在邻域处理中较为常 用。另外,由于数字图像尺寸总是有限的,如果像素 p 本身处于图像的边缘,则上述的三 个邻域会落在图像的外面。 3.2.3 邻域运算和模板运算 在图像处理中,邻域处理通常是以包含中心像素在内的邻域为分析对象的。邻域处 理将像素关联起来,邻域处理结果来源于对邻域内像素灰度值的计算,已在图像处理中 得到了广泛的应用。 模板也称滤波器、核、掩模等,通常用一个二维阵列来表示(如3×3 、5×5 或7×7 等)。 模板运算的数学含义是卷积或互相关运算,模板就是卷积运算中的卷积核。图像的卷 积运算实际是通过模板在图像上移动完成的,在图像处理中,不断在图像上移动模板的位 置,每当模板的中心对准一个像素,此像素所在邻域内的所有像素分别与模板中的每一个 加权系数相乘,乘积求和所得结果即为该像素的滤波输出结果, .对图 如图311 所示。这样, 像中的每个邻域依次重复上述过程,直到模板遍历图像中所有可能位置。模板操作实现了 一种邻域运算,即某个像素点的结果不仅和本像素灰度值有关,还和其邻点的值有关。 图3.11 模板运算示意图 图像卷积操作本质上也是一种模板运算,是当前许多深度特征提取算法的基础。卷 积操作就是循环将图像和卷积核逐个元素相乘再求和,得到卷积结果图像的过程。在卷 积操作中,卷积核在原始图像上做从上到下、从左到右的滑动扫描,每次扫描使用卷积核 与其扫描覆盖区域图像做一次卷积运算,然后再移动到下一个位置再进行一次扫描,重 复此步骤,直到扫描完毕。卷积公式见式(3-12), 12 所示。卷积操作的示例如图3. y[m,=x[n]m, = ΣΣx[j]i,(n]m,*h[n]i,h[ m -n-j]3-12) ji 图3.12 图像卷积操作示意图 卷积运算在目前盛行的深度学习技术中广泛应用。卷积有助于帮助深度神经网络 找到特定的局部图像特征,所以用在网络后续各层的学习中。卷积核也可以看做滤波 器,卷积核大小即为滤波器尺寸,包含其宽高及个数,卷积核每次移动的距离称为步长。 由于卷积核在一次卷积运算中其权重向量并不会改变,可以有效地减少神经网络同层的 参数个数,所以神经网络可以更快地达到收敛。 需要注意的是,在对图像进行邻域模板运算过程中,当模板中心与图像外围像素点 重合时,模板的部分行和列可能会处于图像平面之外,没有相应的像素值与模板数据进 行运算。针对这种情况,需采用如下措施。 (1)保留该区域中原始像素灰度值不变。 (2)假设模板大小为n×n,对于图像中行和列方向上距离边缘小于(n-1)/2个像 素的区域,在图像边缘以外再补上(1)/2行和(1)/2列,对应的灰度值可以补零, n-n 也可以将边缘像素灰度值进行复制 。 3.图像的几何变换 3 图像几何变换(geometricoperation)指通过图像像素位置的变换,直接确定该像素 灰度的运算。与代数运算不同,几何变换可改变图像中各物体之间的空间关系。图像几 何变换将图像中任一像素映射到一个新位置,是一种空间变换,关键在于确定图像中点 与点之间的映射关系,通过这种映射关系可以知道原图像任意像素点变换后的坐标,或 者变换后的图像像素在原图像中的坐标位置,并对新图像像素赋值从而产生新的图像。 图像的几何变换在图像配准、电影、电视和媒体广告等影像特技处理中广泛应用,常 常需要对影像进行大小、形状、位置等方面的变换处理。 3.3.1 图像几何变换的基础 图像齐次坐标变换、图像插值运算和几何变换是图像几何变换的基础。 61 1.齐次坐标变换 用n+1维向量表示n 维向量的方法称为齐次坐标表示法。图像空间中的一个点 (x,y)用齐次坐标表示为 x y1 . è ... . . ÷÷÷ ,和某个变换矩阵T= a b k c d m p q s . è ... . . ÷÷÷ 相乘变为新的点 x' y' 1 . è ... . . ÷÷÷ ,即 x' y' 1 . è ... . . ÷÷÷ = a b k c d m p q s . è ... . . ÷÷÷ x y1 . è ... . . ÷÷÷ (3-13) 变换矩阵T 中,子矩阵 a b c d . è . . . ÷ 分别实现图像的比例、对称、错切、旋转等基本变换; 子矩阵 k m . è . . . ÷ 用于图像的平移变换;子矩阵(p q)用于图像的投影变换;s 用于图像的全 比例变换。 一般情况下,二维图像可表示为3×n 的点集矩阵 x1 x2 … xn y1 y2 … yn 1 1 … 1 . è ... . . ÷÷÷ 。实现二维图 像几何变换的一般过程是 变换矩阵T×变换前的点集矩阵=变换后的点集矩阵 2.图像的插值运算 图像几何变换过程中,可能会产生一些原图像中没有的新像素点,给这些新像素点 赋值的运算即为图像插值运算,利用已知邻近像素点的灰度值来产生未知像素点的灰度 值。常用的像素灰度内插法有最近邻插值法(nearestneighborinterpolation,NNI)、双线 性插值法(bilinearinterpolation,BLI)和三次立方插值法(bicubicinterpolation,BI)。插 值法直接影响到图像变换的视觉效果。 (1)最近邻插值法。最近邻插值法也称零阶内插法,是一种简单而有效的灰度内插 方法。在待求点的四邻像素中,将距离这点最近的相邻像素灰度赋给该待求点。最近邻 插值法示意图如图3.13所示,图中与位置坐标(x,y)最近的点是(x',y'),则将该点的灰 度值g(x',y')赋值给f(x,y),即 f(x,y)=g(x',y') (3-14) 图3.13 最近邻插值法示意图 最近邻插值法处理后的结果图像中灰度值略带有不连续性,但是对图像的灰度失真 最小,有一定的精度,而且具有运算速度快的特点。 62 (2)双线性插值法。双线性插值法又叫一阶插值法。该方法是通过映射点在输入图 图3.14 双线性插值 法示意图 像的4个邻点的灰度值对映射点进行插值,它假定共轭点周围的 4个点围成的区域内的灰度变化是线性的,从而用线性内插方 法,根据共轭点的周围4个已知像素的灰度值,内插计算出该点 的灰度值,双线性插值算法示意图如图3.14所示,计算公式为 Ip =(1-Δx)(1-Δy)I11 + (1-Δx)ΔyI12 + Δx(1-Δy)I21 +ΔxΔyI22 (3-15) 其中,Δx=xp -int(xp );Δy=yp -int(yp )。 双线性插值算法在一般的计算机上运行要比最近邻域法花 费更多的时间,且它对于数据中的高频边缘信息具有平滑作用,因此可以消除最近邻法 插值法中的锯齿效果,即消除了灰度值不连续现象,相比于最近邻插值法精度较高。 (3)三次立方插值法。三次立方插值法是一种较复杂的插值方法,该方法在计算新 像素点时要将周围16个点全部考虑进去,计算时用式(3-16)来得到理论上的最佳插值 函数sinx/x,y=sinx/x 曲线如图3.15所示。 W (x)= 1-2|x|2 +|x|3, |x|<1 4-8|x|+5|x|2 -|x|3, 1≤|x|≤2 0, |x|>2 ì . í .. .. (3-16) 计算时采用共轭点周围16个像素的灰度值去确定每一个输出图像像素的灰度值, 如图3.16所示。 图3.15 sinx/x 函数曲线 图3.16 三次立方插值法 三次立方插值的矩阵计算公式为 Ip =WxIWTy (3-17) 其中,Wx =(Wx2 Wx2 Wx3 Wx4),Wy =(Wy1 Wy2 Wy3 Wy4) Wx1 =-Δx +2Δx2 -Δx3, Wy1 =-Δy +2Δy2 -Δy3 Wx2 =1-2Δx2 +Δx3, Wy2 =1-2Δy2 +Δy3 Wx3 =Δx +Δx2 -Δx3, Wy3 =Δy +Δy2 -Δy3 Wx4 =-Δx2 +Δx3, Wy4 =-Δy2 +Δy3 Δx =xp -int(xp ), Δy =yp -int(yp ) 63 I= I11 I12 I13 I14 I21 I22 I23 I24 I31 I32 I33 I34 I41 I42 I43 I44 . è ..... . . ÷÷÷÷÷ 从图3.16中可见,这种插值方法实际上被简化成两个方向分别进行的一维插值实 现,是对应用sinx/x 的理论最优插值的有效逼近,在一般的计算机上运行要比sinx/x 效率高得多。该方法虽然计算量大,但克服了最近邻法图像灰度的不连续性和双线性插 值法的平滑高频细节现象,具有较好的视觉效果。 3.3.2 基本的图像几何变换 图像的几何变换主要包含位置变换和形状变换。图像的位置变换指图像的大小和 形状不发生变化,只是图像像素点的位置发生改变,如平移、旋转和镜像等变换。图像的 形状变换主要包括图像的放大、缩小、仿射变换等。下面仅对几种基本的图像几何变换 进行介绍。 1.平移变换 图像的平移是将一幅图像上的所有点都沿x 轴、y 轴按照给定的偏移量移动,平移 后的图像内容不发生变化,只是改变了原有图像内容在画面上的位置。 设点(x,y)进行平移后的坐标为(x',y'),Δx 为x 轴方向的平移量,Δy 为y 轴方向 的平移量,则平移变换公式为 x'=x +Δx y'=y +Δy { (3-18) 平移矩阵表示为 x' y' 1 . è ... . . ÷÷÷ = 1 0 Δx 0 1 Δy 0 0 1 . è ... . . ÷÷÷ x y1 . è ... . . ÷÷÷ (3-19) 平移变换求逆,则 x =x'-Δx y =y'-Δy { . x y1 . è ... . . ÷÷÷ = 1 0 -Δx 0 1 -Δy 0 0 1 . è ... . . ÷÷÷ x' y' 1 . è ... . . ÷÷÷ (3-20) 这样,平移后图像上每一点(x',y')都可在原图像中找到对应点(x,y)。 【例3-7】 基于MATLAB编程,采用反向映射法实现图像平移,分别沿x 轴、y 轴 平移20个像素。 解:MATLAB代码如下所示: Image=im2double(imread('football.jpg')); %读取图像并转换为double 型 [h,w,c]=size(Image); %获取图像尺寸 NewImage=ones(h,w,c); %新图像初始化 deltax=20;deltay=20; for x=1:w 64 for y=1:h %循环扫描新图像中点 oldx=x-deltax; oldy=y-deltay; %确定新图像中点在原图中的对应点 if oldx>0 && oldx0 && oldy1时,实现图像的放大处理。 设原图像中点(x,y)进行缩放处理后,移到点(x',y'),则缩放处理的矩阵形式可表 示为 x' y' 1 . è ... . . ÷÷÷ = kx 0 0 0 ky 0 0 0 1 . è ... . . ÷÷÷ x y1 . è ... . . ÷÷÷ (3-26) 对矩阵变换求逆,则 x y1 . è ... . . ÷÷÷ = 1/kx 0 0 0 1/ky 0 0 0 1 . è ... . . ÷÷÷ x' y' 1 . è ... . . ÷÷÷ (3-27) MATLAB中实现图像缩放功能的函数是imresize(),具体调用方式如下。 B=imresize(A,SCALE,METHOD):返回原图A 的SCALE倍大小图像B。 B=imresize(A,[NUMROWSNUMCOLS],METHOD):对原图A 进行比例缩 放,返回图像B的行数和列数由NUMROWS、NUMCOLS指定,如果二者为NaN,则表 明MATLAB自动调整了图像的缩放比例,保留图像原有的宽高比。 [Y,NEWMAP]=imresize(X,MAP,SCALE,METHOD):对索引图像进行成比 例缩放。 【例3-11】 基于MATLAB编程,实现图像放大,比例为kx =1.2,ky =1.2,分别采用 最近邻插值和双线性插值方法生成放大后的图像。 解:MATLAB代码如下所示: Image = im2double(imread('lena256.bmp')); NewImage1 = imresize(Image,1.2,'nearest'); NewImage2 = imresize(Image,1.2,'bilinear'); imwrite(NewImage1,'最近邻插值1.2 倍.jpg'); imwrite(NewImage2,'双线性插值1.2 倍.jpg'); subplot(1,3,1),imshow(Image),title('原图'); subplot(1,3,2),imshow(NewImage1),title('最近邻插值1.2 倍放大结果'); subplot(1,3,3),imshow(NewImage2),title('双线性插值1.2 倍放大结果'); 程序运行结果如图3.24所示。 从图3.24中可以看出,最近邻插值图像放大有较明显的锯齿现象,双线性插值图像