OpenCV逆透视变换实现方法咨询:能否还原Y轴45°旋转后的图像
解答
OpenCV反向透视变换支持说明
OpenCV原生提供了透视变换相关的全套工具,完全支持你需要的反向还原操作,核心依赖两个接口:cv2.getPerspectiveTransform() 用于生成透视变换矩阵,cv2.warpPerspective() 用于执行透视变换操作。只要你掌握原始变换的相关参数,完全可以从旋转后的图像还原出原始图像。
具体实现方法
分两种场景对应不同的实现逻辑:
场景1:你保留了当初沿Y轴旋转45°时生成的透视变换矩阵
这种场景操作最简单,直接对原始变换矩阵求逆,即可得到反向变换的矩阵,执行变换即可还原:
示例代码如下:import cv2 import numpy as np # 读取旋转后的图像 img_rotated = cv2.imread("旋转后图像的本地路径") # M为当初执行Y轴旋转时用到的3*3透视变换矩阵 M_inv = np.linalg.inv(M) # 填入原始图像的宽度、高度参数即可得到还原后的原图 img_restored = cv2.warpPerspective(img_rotated, M_inv, (original_width, original_height))场景2:你已经丢失了原始的透视变换矩阵
这种情况需要先获取4组一一对应的关键点坐标,分别来自旋转后图像和原始图像(可选图像四角、前景物体的明显特征点等),通过对应点计算反向变换矩阵后再执行还原:
示例代码如下:import cv2 import numpy as np # 读取旋转后的图像 img_rotated = cv2.imread("旋转后图像的本地路径") # 旋转后图像上的4个关键点坐标,按顺序排列 pts_rotated = np.float32([[p1_x, p1_y], [p2_x, p2_y], [p3_x, p3_y], [p4_x, p4_y]]) # 原始图像上和上述4个点一一对应的坐标 pts_original = np.float32([[p1_x_o, p1_y_o], [p2_x_o, p2_y_o], [p3_x_o, p3_y_o], [p4_x_o, p4_y_o]]) # 计算反向变换矩阵 M_inv = cv2.getPerspectiveTransform(pts_rotated, pts_original) # 执行变换得到还原后的原图 img_restored = cv2.warpPerspective(img_rotated, M_inv, (original_width, original_height))
补充说明
如果当初执行旋转操作时你开启了边缘填充避免裁剪,还原后的图像边缘会存在填充的无效区域,你可以根据原始图像的尺寸自行裁剪去除。不考虑像素插值模糊的前提下,只要变换矩阵或标注的关键点精度足够,还原后的图像几何结构可以完全匹配原始输入。
内容的提问来源于stack exchange,提问作者Joymaker
相关产品推荐
相关产品推荐

