gpt4 book ai didi

opencv - 如何在 tensorflow 中执行图像的线性单应性

转载 作者:行者123 更新时间:2023-12-02 17:27:53 27 4
gpt4 key购买 nike

我希望能够复制opencv函数warpPerspective的行为,该函数将图像和单应性矩阵作为输入,并根据单应性矩阵投影图像(更多详细信息:https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html)。

似乎tf.contrib.image.sparse_image_warp应该可以完成工作,但是我无法复制warpPerspective的行为。尽管使用了参数interpolation_order=1,但我获得的输出仍以非线性方式失真。

经过进一步的研究,我怀疑这是由于tf.contrib.image.interpolate_spline甚至在其阶数为1时也不执行线性插值,而是使用了一些RBF内核。

除了使用dense_image_warp对其进行编码外,我看不到其他解决方法,但是这似乎有点过大,甚至可能会花费很大。有人有其他解决方案吗?

最佳答案

经过研究,这是一个解决方案。它使用tf.contrib.image.dense_image_warp函数,虽然不是很漂亮,但是仍然可以工作:

第一个函数计算执行单应性所需的光流:

    def homography_matrix_to_flow(tf_homography_matrix, im_shape1, im_shape2):
Y, X = np.meshgrid(range(im_shape1), range(im_shape2))
Z = np.ones_like(X)
XYZ = np.stack((X, Y, Z), axis=-1)
tf_XYZ = tf.constant(XYZ.astype("float64"))
tf_XYZ = tf_XYZ[tf.newaxis,:,:, :, tf.newaxis]

tf_homography_matrix = tf.tile(tf_homography_matrix[tf.newaxis, tf.newaxis], (1, im_shape2, im_shape1, 1, 1))
tf_unnormalized_transformed_XYZ = tf.matmul(tf_homography_matrix, tf_XYZ, transpose_b=False)
tf_transformed_XYZ = tf_unnormalized_transformed_XYZ / tf_unnormalized_transformed_XYZ[:,:,:, -1][:,:,:, tf.newaxis]
flow = -tf.squeeze(tf_transformed_XYZ-tf_XYZ)[..., :2]

return flow

然后,它用来将原始图像扭曲为变形图像。

有一个技巧:由于 tf.contrib.image.dense_image_warp函数的工作方式,您需要传递单应性矩阵的逆函数以找到要使用的正确光流。
        homography_matrix = np.array([[-4.86219067e-01, -2.20871298e+00,  4.08214879e+02],
[-1.02940133e-01, -5.60378659e+00, 3.87573763e+02],
[-1.35051362e-04, -6.59600583e-03, 2.91244998e-01]])

inv_homography_matrix = np.linalg.inv(homography_matrix)

tf_inv_homography_matrix = tf.constant(inv_homography_matrix)[tf.newaxis]
flow = homography_matrix_to_flow(tf_inv_homography_matrix, img.shape[1], img.shape[2])[tf.newaxis]
flow =tf.tile(flow, (self.bs, 1,1,1))
image_warped = tf.contrib.image.dense_image_warp(tf.transpose(img, (0,2,1,3)), flow)
image_warped = tf.transpose(image_warped, (0,2,1,3))


我仍然希望找到一个更好的答案(一个不必计算整个流张量的答案),因此,我暂时不回答这个问题。

关于opencv - 如何在 tensorflow 中执行图像的线性单应性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58131815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com