将2D图像转换为3D

时间:2019-03-06 16:31:58

标签: python-3.x opencv

我想使用Python(使用OpenCV,PIL,SKImage等)将2D颜色(来自OpenCV的RGB)图像转换为3D图像。我发现的许多示例(例如https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html#perspective-transformation)都向您展示了如何拍摄代表3D对象的2D图像并转换为2D视图(例如,自上而下)。我想做相反的事情,我有一个自上而下的图像,并希望以不同的角度将其显示为围绕图像中心和X轴旋转(因此,看起来我正在从桌面上查看图像)坐姿)。 我怎样才能做到这一点?具体来说,如何构造旋转矩阵和偏斜矩阵?

我找到了以下代码,但是它并不能完全满足我的要求。它也仅适用于灰度图像,我的当前是彩色的。

此代码也实现了类似的效果,但是它不允许我指定旋转角度,因此实际上,我必须使用一些值来反映我认为旋转图像的外观。 https://zulko.github.io/moviepy/examples/star_worms.html

# from skimage import transform
from skimage.transform import warp, ProjectiveTransform
import matplotlib.pyplot as plt
import cv2
import numpy as np

img = cv2.imread('.top-down-image.jpeg')

theta = np.deg2rad(20)
tx = 0
ty = 0

S, C = np.sin(theta), np.cos(theta)

# Rotation matrix, angle theta, translation tx, ty
H = np.array([[C, -S, tx],
              [S,  C, ty],
              [0,  0, 1]])

# Translation matrix to shift the image center to the origin
r, c = img.shape
T = np.array([[1, 0, -c / 2.],
               [0, 1, -r / 2.],
              [0, 0, 1]])

# Skew, for perspective
S = np.array([[1, 0, 0],
              [0, 1.3, 0],
              [0, 1e-3, 1]])

trans = ProjectiveTransform(T)
img_rot = warp(img, H)
img_rot_center_skew = warp(img, S.dot(np.linalg.inv(T).dot(H).dot(T)))

for i in [img, img_rot, img_rot_center_skew]:
    f, ax = plt.subplots(figsize=(20,20))
    ax.imshow(i, cmap=plt.cm.gray, interpolation='nearest')
    plt.show()

0 个答案:

没有答案