You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV Python3图像旋转后无法正确复原问题咨询

解决OpenCV图像旋转后无法准确复原的问题

嘿,我懂你遇到的困扰了——旋转后的图像没法精准回到原始位置对吧?其实问题出在你可能忽略了旋转后图像尺寸的变化以及旋转矩阵的基准点这两个关键细节。

当你第一次旋转图像时,OpenCV的warpAffine默认会裁剪掉超出原图像范围的部分,就算没裁剪,旋转后的图像中心和原图像中心的坐标关系也已经改变了。直接用原始旋转矩阵的逆矩阵去复原,自然会出现位置偏移。

正确的处理思路

我们需要分两步走:先计算旋转后的图像完整尺寸,生成适配的旋转矩阵;再基于旋转后图像的中心,生成对应的逆旋转矩阵来完成复原。

完整可运行代码

#! /usr/bin/env python3
#! -*- coding:utf-8 -*-
import cv2
import numpy as np

# 读取原始图像
img = cv2.imread('./lena.jpg')
if img is None:
    print("无法读取图像,请检查路径是否正确!")
    exit()

# 获取原始图像尺寸与中心
h, w = img.shape[:2]
original_center = (w // 2, h // 2)

# 第一步:生成15度旋转矩阵,计算旋转后的完整图像尺寸
rotate_angle = 15
rot_mat = cv2.getRotationMatrix2D(original_center, rotate_angle, 1.0)
# 计算旋转后图像的宽高(避免像素被裁剪)
cos_val = np.abs(rot_mat[0, 0])
sin_val = np.abs(rot_mat[0, 1])
new_width = int((h * sin_val) + (w * cos_val))
new_height = int((h * cos_val) + (w * sin_val))
# 调整旋转矩阵的平移参数,让旋转后的图像在新画布中居中
rot_mat[0, 2] += (new_width / 2) - original_center[0]
rot_mat[1, 2] += (new_height / 2) - original_center[1]

# 执行旋转,得到完整的旋转后图像
rotated_img = cv2.warpAffine(img, rot_mat, (new_width, new_height), flags=cv2.INTER_NEAREST)

# 第二步:生成逆旋转矩阵(-15度),基于旋转后图像的中心
rotated_center = (new_width // 2, new_height // 2)
inv_rot_mat = cv2.getRotationMatrix2D(rotated_center, -rotate_angle, 1.0)
# 调整平移参数,确保复原图像映射回原始尺寸的正确位置
inv_rot_mat[0, 2] += (w / 2) - rotated_center[0]
inv_rot_mat[1, 2] += (h / 2) - rotated_center[1]

# 执行逆旋转,得到复原图像
restored_img = cv2.warpAffine(rotated_img, inv_rot_mat, (w, h), flags=cv2.INTER_NEAREST)

# 显示所有窗口
cv2.namedWindow('original', cv2.WINDOW_NORMAL)
cv2.namedWindow('NEAREST', cv2.WINDOW_NORMAL)
cv2.namedWindow('NEAREST-OK-RESTORE', cv2.WINDOW_NORMAL)
cv2.imshow('original', img)
cv2.imshow('NEAREST', rotated_img)
cv2.imshow('NEAREST-OK-RESTORE', restored_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

核心细节解释

  • 计算旋转后图像的新尺寸:这一步是为了保留所有旋转后的像素,避免图像被裁剪,同时保证旋转后的图像在新画布中居中。
  • 调整旋转矩阵的平移参数:默认旋转矩阵以原图像中心为基准,但旋转后画布尺寸改变,必须调整平移量才能让图像居中显示。
  • 逆旋转的基准点对齐:逆旋转要以旋转后图像的中心为基准,旋转角度设为负的原角度,再通过平移参数调整,让复原图像精准映射回原始图像的尺寸与位置。

这样处理后,你就能看到复原后的图像和原始图像完全对齐了。

内容的提问来源于stack exchange,提问作者zqer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:27:43