对代表图像的NumPy数组重新取样

685 阅读6分钟

概述

对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自带的软件包,如miscndimage ,用于图像处理。

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 。它可以使用多种插值、颜色范围和处理广泛的数组大小来调整图像的大小。