scipy.ndimage
中提供了对数组进行平移、缩放以及旋转操作的函数,分别是shift, zoom, rotate
。
为了让演示过程更加直观,这里对lena
图进行操作
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import *
path = "lena.jpg"
img = plt.imread(path).astype(float)/255
plt.imshow(img)
plt.axis('off')
plt.show()
分别对上述图像进行平移、缩放以及旋转操作,
imDct = {
"shift" : shift(img, [50, 50, 0]),
"zoom" : zoom(img, [1.5, 2, 1]),
"rotate" : rotate(img, 15, axes=(1,0))
}
fig = plt.figure()
for i, key in enumerate(imDct):
fig.add_subplot(1,3,i+1)
plt.imshow(imDct[key])
plt.title(key)
plt.show()
效果如下
其中,平移和旋转在对原数组进行操作后,空出来的区域补0;而缩放则直接对原数组进行插值。
在这三个函数中,除了input
和几何变换的参数之外,还有5个参数output, order, cval, perfilter
以及mode
,
output
不为None
,则将操作后的数组输出到output
中order
为几何变换过程中的插值次数cval
当集几何变换中出现空缺时,补充的常数,默认为0prefilter
为True
时,将在插值前进行样条滤波mode
当数组扩展到其边界之外后的处理方法,默认为constant
可见,其中mode
这个参数比较重要,设数组中的值为a b c d
,则其可选值和插值方案如下
reflect
/grid-mirror
反射取点 (d c b a | a b c d | d c b a)mirror
反射取点,不包括边缘点 (d c b | a b c d | c b a)constant
/grid-constant
添加常数k
(k k k k | a b c d | k k k k)grid-constant
(k k k k | a b c d | k k k k)nearest
就近取点 (a a a a | a b c d | d d d d)grid-wrap
循环处理 (a b c d | a b c d | a b c d)wrap
循环处理,不包括边缘点(d b c d | a b c d | b c a b)下面以旋转为例,看一下不同mode
的效果,旋转函数中有一个axes
参数,表示旋转所在的坐标平面。
imDct = {
"mirror" : rotate(img, 15, axes=(1,0), mode='mirror'),
"reflect" : rotate(img, 30, axes=(1,0), mode='reflect'),
"nearest" : rotate(img, 45, axes=(1,0), mode='nearest'),
}
fig = plt.figure()
for i, key in enumerate(imDct):
fig.add_subplot(1,3,i+1)
plt.imshow(imDct[key])
plt.title(key)
plt.show()
效果如下,果然变得有些诡异呢
其中,mirror
旋转了15°,补全方式使用的是mirror
,即反射,可以明显看到左上角出现了个帽子的轮廓,而右侧则对镜子进行了镜像;reflect
也是反射,其现象与mirror
,但因为旋转了30°,所以看起来更加明显;nearest
为最近点模式,可以看出,在旋转外部,其补全方式是寻找图像中最近的点的像素。