概述
对Numpy数组重新取样意味着改变矩阵的大小。对代表图像的Numpy数组进行重采样的最有效方法是使用scipy.ndimage.zoom 函数。
scipy.ndimage.zoom(ndarray, zoom, output=None, order=3, mode='constant', prefilter=True, grid_mode=False)
- ndarray是要重新取样的数组。
- 缩放部分接受单个数字或序列。输入一个单一的数字意味着图像将在所有轴上以相同的值被放大。另一方面,一个序列会改变x、y和z的缩放顺序。
- 该函数创建一个与ndarray相同数据类型的输出。
- Order表示花键插值,范围在0到5之间。
- 模式决定了插值将如何影响超出边界像素的输出。它采取最接近、镜像、反射、常数、包裹的值。
- prefilter确认你是否要在插值前在ndarray上应用花键过滤器。
注意:当对代表图像的Numpy数组进行重采样时,你不能包含上述所有的选项。例如,如例子部分所示,你可以只通过指定插值顺序对数组进行重采样。
现在你已经了解了对Numpy数组进行重采样时的输入和预期输出,最好是在应用重采样函数之前找出它的影响。
图像重采样的起源
计算机能够理解二进制数字,1和0,通常被称为比特。只要你给它足够的比特,它就能表示任何物体。八个比特组成一个字节,这种表示方法使你能够处理更多的数据。
在知道如何表示一个图像之后,下一个挑战是传输它。这就是像ASCII和Unicode这样的公约的作用。与ASCII不同的是,ASCII只处理英文字符,而Unicode对英文和非英文字符都附加了一堆字节。
例如,大多数图像是由3个字节按红、绿、蓝(RGB)的顺序表示。除了RGB之外,你还可以使用其他的表示方法,如灰度。
图像的基本单位是一个像素。几个像素组成一个矩阵。因此,图像的原始形式是一组由矩阵中的数字表示的颜色。
同样值得注意的是,矩阵值的变化会改变原始图像。这就是图像处理背后的动机。
图像处理是一个多步骤的转换。它涉及图像显示、过滤、裁剪、旋转、翻转、分割、分类、注册和重新取样。
Scipy.ndimage.zoom在图像重取样中的作用
本节主要讨论为什么在图像重采样中,你可以优先选择scipy.ndimage.zoom ,而不是其他软件包。它首先定义了在没有scipy.ndimage.zoom ,处理图像时所面临的挑战。
传统的图像处理需要二维的像素阵列。也许还有一个第三维的颜色通道;第四维的透明度信息。
Scipy自带的软件包,如misc 和ndimage ,用于图像处理。
scipy的杂项方法使用imresize 函数对一个数组进行重采样。
scipy.misc.imresize
misc 模块有特定的内置图像,帮助启动数据分析,而不需要从其他文件加载图像。它在打开图像方面也起到了关键作用。
scipy.misc.imresize 的主要缺点是它包裹了PIL的调整大小函数,只提供四个颜色通道。第二个选择是ndimage'smap_coordinates() 函数。
scipy.ndimage.map_coordinates
scipy.ndimage.map_coordinates该函数可以为所有类型的重采样提供样条插值,包括非结构化网格。然而,它对大阵列来说是很慢的。
ndimage(n-dimensional image)软件包带有几个图像处理和分析功能。其中一个函数是缩放,它有二维、三维或更多维度的实现。让我们用它来重新取样一个代表图像的Numpy数组。
对代表图像的Numpy数组重新取样的步骤
问题1:给定一个有6个元素的Numpy数组,将数组重塑为2乘3维,然后使用2级缩放和双线性插值重新取样。
方法:
第1步:选择正确的软件包
我们将选择我们在上一节讨论过的scipy.ndimage.zoom ,对代表图像的Numpy数组进行重采样。
import numpy as np
import scipy.ndimage
步骤~2:获取Ndarray
有很多方法可以获得一个n维的数组。你可以使用图像处理库从外部文件中读取图像,或者使用NumPy的方法(如array() 或arange() )创建一个图像。
现在我们可以对2乘3的数组进行重采样,方法如下。
# get ndarray
ndarray = np.arange(6)
# reshape the array for easier manipulation
before_resampling = ndarray.reshape(2,3)
步骤~3:对数组进行重采样
让我们检查一下重采样前的数组。
# original array
print("Before resampling: ")
print(before_resampling)
我们得到一个2乘3的Numpy数组。
[[0 1 2]
[3 4 5]]
现在我们可以对其进行重采样。
代码:
# resampled array
print("After resampling with a factor of 2 with the bilinear interpolation: ")
after_resampling = scipy.ndimage.zoom(before_resampling, 2, order=1)
print(after_resampling)
输出:
After resampling with a factor of 2 with the bilinear interpolation:
[[0 0 1 1 2 2]
[1 1 2 2 3 3]
[2 2 3 3 4 4]
[3 3 4 4 5 5]]
让我们看一下另一个例子。
问题2:给出以下代表图像的Numpy数组。
[[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]]
用缩放阶数2和花样插值对数组重新取样。
方法:我们将把该数组存储在一个变量中并对其进行操作。
代码:
# Step~1: import the package
import numpy as np
import scipy.ndimage
# Step~2: store the array
print("before resampling: ")
nd_array = np.array([[10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]])
然后重新取样。
# Step~3: resample the array
print("After resampling with a factor of 2 with the spline interpolation: ")
resampled_array = scipy.ndimage.zoom(nd_array, 2, order = 0)
print(resampled_array)
输出。
After resampling with a factor of 2 with the spline interpolation:
[[10 10 11 11 12 12 13 13]
[10 10 11 11 12 12 13 13]
[20 20 21 21 22 22 23 23]
[20 20 21 21 22 22 23 23]
[30 30 31 31 32 32 33 33]
[30 30 31 31 32 32 33 33]
[40 40 41 41 42 42 43 43]
[40 40 41 41 42 42 43 43]]
结论
尽管有很多方法可以对代表图像的NumPy数组进行重采样,但最有效的软件包之一是scipy.ndimage.zoom 。它可以使用多种插值、颜色范围和处理广泛的数组大小来调整图像的大小。