![Keras深度学习:入门、实战与进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/725/41309725/b_41309725.jpg)
4.1.5 空间变换
对于灰色图像,可以使用R基础包的t()函数或者EBImage扩展包的transpose()函数进行转置。运行以下程序代码,得到转置后的灰色图像,如图4-14所示。
> img_t <- transpose(img) # 等价于 img_t <- t(img) > plot(img_t)
![110-1](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/110-1.jpg?sign=1739152042-3F4UsZfwDL696SNXiXr74GIRG89XUVX7-0-4f75a3bcab2c1583b7b585eaadffca93)
图4-14 对灰色图像进行转置
对于彩色图像,我们不能使用t()函数,而是需要使用transpose()函数对其进行转置,它能通过交换空间维度来置换图像。运行以下程序代码,得到转置后的彩色图像,如图4-15所示。
> t(imgcol) # 报错 Error in t.default(imgcol) : argument is not a matrix > imgcol_t <- transpose(imgcol) > plot(imgcol_t)
![110-2](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/110-2.jpg?sign=1739152042-bBTkkOZ5R0173gjp78U6PzP2XNmTicRv-0-4a6a13cf121b2a344ee313e242761903)
图4-15 对彩色图像进行转置
除了转置,我们还有更多关于图像的空间变换,例如平移、旋转、反射和缩放。translate()函数通过指定的二维向量移动图像平面,裁剪图像区域外的像素,并将进入图像区域的像素设置为背景。参数v是由两个数字组成的向量,表示以像素为单位的平移向量。以下代码可将图像往右移动100像素,往上移动50像素,如图4-16所示。
> img_translate <- translate(img, c(100,50)) > imgcol_translate <- translate(imgcol,c(100,50)) > par(mfrow=c(1,2)) > plot(img_translate) > plot(imgcol_translate) > par(mfrow=c(1,1))
![111-1](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/111-1.jpg?sign=1739152042-MRBb8yqRM7pu0R9x4lSWmXAXbSAP3EM9-0-33a9288a836bd720a2b105c571485aa2)
图4-16 图像平移
利用rotate()函数可以将图像顺时针旋转,参数angle表示需要旋转的角度。以下代码可将img图像顺时针旋转30度,如图4-17所示。
> img_rotate <- rotate(img,30) > plot(img_rotate)
![111-2](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/111-2.jpg?sign=1739152042-9YCgECWLRErHhJGMBbS1ycr7tFs7fxyS-0-3d5bec1ea10ebfe78b7c074b33802884)
图4-17 图像旋转
所有空间变换函数均有参数bg.col,用于设置图像背景色。比如我们可以通过以下代码将旋转后的图像背景色设置为白色,如图4-18所示。
> # 设置背景色为白色 > img_rotate_bg <- rotate(img,30,bg.col = 'white') > plot(img_rotate_bg)
![111-3](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/111-3.jpg?sign=1739152042-XW6T7zAlBnTcTOx1B8gUuvTzTGX4Q6Sa-0-d546e62f6e1b470162626a18dae9618c)
图4-18 调整图像背景色
使用resize()函数可以对图像进行缩放,如果仅提供宽度或者高度之一,则将自动计算另一个尺寸并保持原始宽高比。以下代码会将img、imgcol图像的宽、高均设置为256,如图4-19所示。
> # 调整图像尺寸 > img_resize <- resize(img,w = 256,h = 256) > imgcol_resize <- resize(imgcol,w = 256,h = 256) > par(mfrow=c(1,2)) > plot(img_resize) > plot(imgcol_resize) > par(mfrow=c(1,1))
![112-1](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/112-1.jpg?sign=1739152042-hIT0glk7RRhyeFi6Aq5JYKXvixakWGfj-0-e3ac61ecf59dda2a0657b480f20fb772)
图4-19 调整图像尺寸
使用flip()和flop()函数可以分别围绕水平轴和垂直轴反射图像,运行以下代码,得到如图4-20所示图像。
> img_flip <- flip(img) > img_flop <- flop(img) > display(combine(img_flip, img_flop), + all=TRUE,method = 'raster')
![112-2](https://epubservercos.yuewen.com/EC9CCF/21511155008171806/epubprivate/OEBPS/Images/112-2.jpg?sign=1739152042-gwtzna7z0yrTy0eGizESIl86blc6I5EP-0-78c1f388dc5472c25f27e156161c9943)
图4-20 反射图像
使用affine()函数可以实现空间线性变换,其中像素坐标(用矩阵px表示)转换为cbind(px, 1)%*%m。例如,可以通过以下代码实现水平剪切映射,如图4-21所示。
> m <- matrix(c(1, -.5, 128, 0, 1, 0), nrow=3, ncol=2) > img_affine <- affine(img, m) > display(img_affine)