在图像大小调整插值问题中,可以在对网格索引进行操作之前在行索引和col索引上使用np.meshgrid
:
nrows = 600
ncols = 800
image_in = np.random.randint(0, 256, size=(nrows, ncols, 3))
scale_factor = 1.5
r = np.arange(nrows, dtype=float) * scale_factor
c = np.arange(ncols, dtype=float) * scale_factor
rr, cc = np.meshgrid(r, c, indexing='ij')
# Nearest Neighbor Interpolation
# np.floor if scale_factor >= 1. np.ceil otherwise
rr = np.floor(rr).astype(int).clip(0, nrows-1)
cc = np.floor(cc).astype(int).clip(0, ncols-1)
image_out = image_in[rr, cc, :]
现在,我将如何撤销此过程?假设给定rr_1
,cc_1
(np.meshgrid
的产品)以未知方式(此处用np.random.randint
进行了处理),我如何得到r_1
和c_1
,即np.meshgrid
的输入(最好是使用ij
索引)?
# Suppose rr_1, cc_1 = np.meshgrid(r_1, c_1, indexing='ij')
rr_1 = np.random.randint(0, nrows, size=(nrows, ncols, 3))
cc_1 = np.random.randint(0, ncols, size=(nrows, ncols, 3))
r_1 = ?
c_1 = ?
更新:
发布后我立即知道了。答案是:
# Suppose rr_1, cc_1 = np.meshgrid(r_1, c_1, indexing='ij')
rr_1 = np.random.randint(0, nrows, size=(nrows, ncols, 3))
cc_1 = np.random.randint(0, ncols, size=(nrows, ncols, 3))
r_1 = rr_1[:, 0]
c_1 = cc_1[0]
答案 0 :(得分:1)
numpy.meshgrid
从输入数组创建一个更高维的数组,以便创建类似网格的数组。因此,假设您想通过使用一些输入的1D向量r
和c
来获得2D网格。 numpy.meshgrid
将rr
和cc
作为2D数组返回,它们分别在2D数组的各处保持y轴或x轴不变(这就是为什么它是网格)。
这是一个测试用例:
import numpy as np
r = np.arange(5) # [0 1 2 3 4]
c = np.arange(5,10,1) # [5 6 7 8 9]
rr, cc = np.meshgrid(r,c,indexing='ij')
r_original = rr[:,0]
c_original = cc[0,:]
print(r_original) # [0 1 2 3 4]
print(c_original) # [5 6 7 8 9]
请注意,我们为rr
和cc
创建的网格是
rr = [[0 0 0 0 0]
[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]]
cc = [[5 6 7 8 9]
[5 6 7 8 9]
[5 6 7 8 9]
[5 6 7 8 9]
[5 6 7 8 9]]
由于您使用的是indexing='ij'
,因此已对2D数组进行了转置。因此,rr
和cc
分别保持恒定的值是x轴和y轴(与不使用indexing='ij'
的情况相反)。