Python对高维数组旋转、平移和缩放

文章目录

    • 图像准备
    • 初步调用
    • 参数

图像准备

scipy.ndimage中提供了对数组进行平移、缩放以及旋转操作的函数,分别是shift, zoom, rotate

为了让演示过程更加直观,这里对lena图进行操作

Python对高维数组旋转、平移和缩放_第1张图片

初步调用

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()

效果如下

Python对高维数组旋转、平移和缩放_第2张图片

其中,平移和旋转在对原数组进行操作后,空出来的区域补0;而缩放则直接对原数组进行插值。

参数

在这三个函数中,除了input和几何变换的参数之外,还有5个参数output, order, cval, perfilter以及mode

  • 如果output不为None,则将操作后的数组输出到output
  • order为几何变换过程中的插值次数
  • cval 当集几何变换中出现空缺时,补充的常数,默认为0
  • prefilterTrue时,将在插值前进行样条滤波
  • 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()

效果如下,果然变得有些诡异呢

Python对高维数组旋转、平移和缩放_第3张图片

其中,mirror旋转了15°,补全方式使用的是mirror,即反射,可以明显看到左上角出现了个帽子的轮廓,而右侧则对镜子进行了镜像;reflect也是反射,其现象与mirror,但因为旋转了30°,所以看起来更加明显;nearest为最近点模式,可以看出,在旋转外部,其补全方式是寻找图像中最近的点的像素。

你可能感兴趣的:(#,scipy,python,ndimage,图像处理,旋转,缩放)