我想使用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()