首先,我假设人们熟悉 Python numpy.tensordot .在这里,我使用了一个简单的实例,如下所示(伪代码):
A.shape = (1, x, y)
B.shape = (x, y, z, t)
C = numpy.tensordot(A, B)
C.shape = (1, z, t)
现在假设上面的A和C是灰度图像(1 channel ),并且有一个将A变成C的图像转换。具体来说,假设人们熟悉Python中的OpenCV和函数cv2.warpAffine和 cv2.warpPerspective ,让我们(伪代码):C = cv2.warpSomething(A, **kwargs)
我的问题是,假设上述等式成立,那么如何从变量(伪代码)计算 B(足够有效):x, y, z, t, the_transformation (i.e. warpAffine or warpPerspective, M, flags, borderMode, borderValue)
如果一个人只能从 (warp, x, y, z, t, M) 生成 B,我也很满意,修复 flags=INTER_LINEAR、borderMode=BORDER_CONSTANT 和 borderValue=0。提前致谢!
最佳答案
如果有N
A 和 C 中的像素,则变换张量 B 有 N**2
组件。对于 N
在 1E+6 的数量级上,你真的不想存储 B 张量。如果它是一个非常小的数据集,你可以尝试这样的事情:
# assuming C and A are already initialized.
B = np.zeros(A.shape + C.shape)
A1 = np.zeros_like(A)
for i in range(A1.shape[0]):
for j in range(A1.shape[1]):
A1[i, j] = 1
B[i, j, :, :] = affine_something(A1)
A1[i, j] = 0
但这仍然非常缓慢且效率低下。
关于python - 如何从图像转换中计算张量乘数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62513236/