如何对表示图像的 NumPy 数组进行重采样?
对表示图像的 NumPy 数组进行重采样是指在保持图像质量的同时改变数组大小的过程。我们可以使用 Python 中的插值、抽取和上采样技术对数组进行重采样。我们可以使用 Python 中 Scipy 库的 ndimage.zoom() 函数对表示图像的 NumPy 数组进行重采样。在本文中,我们将了解如何使用 Python 中的 Scipy 模块对表示图像的 NumPy 数组进行重采样。
插值
插值是一种用于估算现有数据点之间值的技术。在 NumPy 中,我们有几种插值方法,例如线性插值、三次插值和最近邻插值。当新数组的分辨率高于原始数组时,使用插值技术。
抽取
抽取是一种通过丢弃一些现有数据点来减小数组大小的技术。当新数组的分辨率低于原始数组时,使用抽取技术。
上采样
上采样是一种通过在现有数据点之间插入新数据点来增加数组大小的技术。当新数组的分辨率高于原始数组时,使用此技术。
使用 scipy 模块对表示图像的 Numpy 数组进行重采样
为了对 Numpy 数组进行重采样,我们将使用 scipy 库及其中的 ndimage.zoom() 函数来缩放图像并增加其大小,而不会影响图像质量。您可以按照以下步骤对表示图像的 Numpy 数组进行重采样。
算法
可以使用 scipy 库按照以下算法对表示图像的 Numpy 数组进行重采样 -
导入所需的库 - NumPy、Scipy 和 Matplotlib
使用 Scipy 库中的 imread() 函数将图像加载为 NumPy 数组。
使用 Matplotlib 库中的 imshow() 函数显示原始图像。
计算重采样图像的缩放系数。缩放系数是新图像大小与原始图像大小的比率。
使用 Scipy 库中的 ndimage.zoom() 函数对图像进行重新采样。将图像数组和缩放系数作为参数传递给函数。
使用 Matplotlib 库中的 imshow() 函数显示重采样后的图像。
使用 set_title() 函数设置原始图像和重采样后图像的标题。
使用 Matplotlib 库中的 show() 函数显示图形。
运行代码并观察输出,以检查重采样是否成功。
根据需要调整缩放系数以增加或减少图像的分辨率。
我们可以使用 Scipy 库和 ndimage.zoom() 函数轻松地对表示图像的 NumPy 数组进行重采样。
语法
scipy.ndimage.zoom(input, zoom, output=None, order=3, mode='reflect', cval=0.0, prefilter=True)
此处,ndimage.zoom() 函数中使用的参数为 -
input - 这是需要重采样的输入数组。它应该是一个 NumPy 数组。
zoom - 此参数是用于重采样图像的缩放系数。它可以是一个标量或标量序列,指定输入数组每个维度的缩放系数。
output - 此参数是一个可选的输出数组,用于放置重采样的结果。它应该是一个与所需输出形状相同的 NumPy 数组。
order - 此参数是要使用的样条插值的阶数。它应该是一个整数,默认值为 3。
mode − 此参数是用于处理输入边界外点的模式。它应该是以下字符串之一:"reflect"、"constant"、"nearest"、"mirror"或"wrap"。默认值为"reflect"。
cval − 当 mode='constant' 时,此参数是用于处理输入边界外点的值。其默认值为 0.0。
prefilter − 此参数是一个布尔标志,指示是否在重采样之前对输入数据应用预过滤器。其默认值为 True。
步骤 1:导入必要的库
我们将导入 numpy 用于数组操作,导入 scipy 用于 ndimage.zoom() 函数,以及导入 matplotlib 用于图像可视化。
导入 numpy 作为 np 从 scipy 导入 ndimage 导入 matplotlib.pyplot 作为 plt
步骤 2:加载图像
我们将以 numpy 数组的形式创建一个简单的 3*3 图像,并在下一步中缩放该图像。
image = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
步骤 3:重采样图像
为了缩放图像,我们将使用 ndimage.zoom() 函数。ndimage.zoom() 函数接受两个参数:待缩放的输入数组和缩放系数。缩放系数是一个元组,用于指定输入数组每个维度的缩放系数。我们将使用缩放系数 (2,2) 将图像的两个维度尺寸都翻倍。
zoom_factor = (2, 2) resampled_image = ndimage.zoom(image, zoom_factor)
步骤 4:可视化原始图像和重采样图像
我们可以使用 matplotlib 的 plt.show() 函数将原始图像和重采样图像可视化。我们创建两个子图,第一个子图显示原始图像,第二个子图显示重采样后的图像。
# 创建一个包含两个子图的图形 fig, (ax1, ax2) = plt.subplots(1, 2) # 在第一个子图中显示原始图像 ax1.imshow(image, cmap='gray') ax1.set_title('Original Image') # 在第二个子图中显示重采样后的图像 ax2.imshow(resampled_image, cmap='gray') ax2.set_title('Resampled Image') # 显示图形 plt.show()
示例
重采样图像的完整代码如下 -
import numpy as np from scipy import ndimage import matplotlib.pyplot as plt # 将图像加载为 NumPy 数组 image = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 定义缩放系数 zoom_factor = (2, 2) # 使用 ndimage.zoom() 函数对图像进行重采样 resampled_image = ndimage.zoom(image, zoom_factor) # 创建一个包含两个子图的图形 fig, (ax1, ax2) = plt.subplots(1, 2) # 在第一个子图中显示原始图像 ax1.imshow(image, cmap='gray') ax1.set_title('Original Image') # 在第二个子图中显示重采样后的图像 ax2.imshow(resampled_image, cmap='gray') ax2.set_title('Resampled Image') # 显示图形 plt.show()
输出
结论
在本文中,我们讨论了对表示图像的 NumPy 数组进行重采样的方法。我们使用插值、抽取和上采样技术对图像进行重采样。我们使用 Python 的 Scipy 库中的 ndimage.zoom() 函数对图像进行重采样。通过更改缩放比例,我们可以根据需要增加或降低图像的分辨率。