如何将numpy数组通过最近邻插值resize到指定大小
时间: 2023-09-07 15:11:24 浏览: 305
可以使用`scipy.interpolate`库中的`NearestNDInterpolator`进行最近邻插值。具体步骤如下:
1. 导入库 `import numpy as np, scipy.interpolate`
2. 定义原始数组 `arr` 和目标大小 `new_size`,假设原始数组是二维的。
```
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
new_size = (4, 4)
```
3. 计算每个像素点在新图像中的坐标。
```
x, y = np.meshgrid(np.arange(arr.shape[1]), np.arange(arr.shape[0]))
new_x = np.linspace(0, arr.shape[1] - 1, new_size[1])
new_y = np.linspace(0, arr.shape[0] - 1, new_size[0])
new_x, new_y = np.meshgrid(new_x, new_y)
```
4. 将坐标和像素值打包成一维数组。
```
points = np.column_stack((x.ravel(), y.ravel()))
values = arr.ravel()
```
5. 创建最近邻插值函数。
```
interpolator = scipy.interpolate.NearestNDInterpolator(points, values)
```
6. 通过插值函数计算新图像的像素值。
```
new_values = interpolator(new_x.ravel(), new_y.ravel())
new_arr = new_values.reshape(new_size)
```
完整代码如下:
```python
import numpy as np
import scipy.interpolate
# 定义原始数组和目标大小
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
new_size = (4, 4)
# 计算每个像素点在新图像中的坐标
x, y = np.meshgrid(np.arange(arr.shape[1]), np.arange(arr.shape[0]))
new_x = np.linspace(0, arr.shape[1] - 1, new_size[1])
new_y = np.linspace(0, arr.shape[0] - 1, new_size[0])
new_x, new_y = np.meshgrid(new_x, new_y)
# 将坐标和像素值打包成一维数组
points = np.column_stack((x.ravel(), y.ravel()))
values = arr.ravel()
# 创建最近邻插值函数
interpolator = scipy.interpolate.NearestNDInterpolator(points, values)
# 通过插值函数计算新图像的像素值
new_values = interpolator(new_x.ravel(), new_y.ravel())
new_arr = new_values.reshape(new_size)
print(new_arr)
```
输出结果:
```
[[1 2 2 3]
[4 5 5 6]
[4 5 5 6]
[7 8 8 9]]
```
阅读全文