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

如何在Python中使旋转后的二值图像对象居中?

如何让旋转矫正后的图形与图像中心完美对齐

我来帮你搞定这个居中的问题!你已经找对了方向——计算质心偏移,接下来只需要把这个偏移和旋转整合到同一个变换里就行,不用手动去挪图像数组~

问题根源

你之前的代码是绕图像中心旋转,但目标图形的中心本来就不在图像中心,所以旋转后图形还是会偏移。正确的思路应该是:先绕图形自己的中心旋转(保证旋转后图形不歪),再把旋转后的图形平移到图像中心。

完整解决方案代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

path = "inputImage.png"
image = cv2.imread(path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# 提取目标图形的轮廓(如果有多个轮廓,选面积最大的更鲁棒)
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 筛选面积最大的轮廓,避免噪声干扰
cnt = max(contours, key=cv2.contourArea)
cnt = cv2.convexHull(cnt)

# 计算旋转角度(保留你原来的角度校正逻辑)
rect = cv2.minAreaRect(cnt)
angle = rect[-1]
p = np.array(rect[1])

if p[0] < p[1]:
    act_angle = rect[-1] + 180
else:
    act_angle = rect[-1] + 90

if act_angle < 90:
    angle = (90 + angle)
else:
    angle = act_angle - 180

# 计算图形的质心(即图形中心)
moments = cv2.moments(thresh)
cX = int(moments["m10"] / moments["m00"])
cY = int(moments["m01"] / moments["m00"])

# 图像的中心坐标
h, w = image.shape[:2]
img_center = (w // 2, h // 2)

# 1. 构造绕图形质心旋转的矩阵(这样旋转后图形不会偏移)
rotate_matrix = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)

# 2. 调整旋转矩阵的平移分量,让旋转后的图形中心移到图像中心
# 平移量 = 图像中心 - 图形质心
translate_x = img_center[0] - cX
translate_y = img_center[1] - cY
rotate_matrix[0, 2] += translate_x  # 修改矩阵的x平移项
rotate_matrix[1, 2] += translate_y  # 修改矩阵的y平移项

# 应用旋转+平移的复合变换
rotated_centered = cv2.warpAffine(image, rotate_matrix, (w, h), 
                                  flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 显示结果(matplotlib需要转成RGB格式)
plt.imshow(cv2.cvtColor(rotated_centered, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

# 保存结果
cv2.imwrite("rotated_centered.png", rotated_centered)

关键步骤解释

  1. 筛选正确轮廓:我加了max(contours, key=cv2.contourArea)来选面积最大的轮廓,避免把噪声小轮廓当成目标,让结果更鲁棒。
  2. 计算图形质心:通过cv2.moments从二值图中获取白色区域的质心,这就是图形的真实中心。
  3. 复合变换矩阵:
    • 先构造绕图形质心的旋转矩阵,确保旋转后图形的形状不会偏移。
    • 然后把“图像中心 - 质心”的偏移量加到旋转矩阵的平移分量上,这样旋转后的图形会自动移动到图像中心。
  4. 一次完成变换:用cv2.warpAffine应用复合矩阵,一次操作完成旋转+居中,避免多次插值导致图像模糊。

为什么不用单独移动图像数组?

手动修改图像数组需要处理边界填充、坐标映射等问题,容易出错且效率低。而通过修改变换矩阵,OpenCV会自动帮你处理这些细节,结果更准确也更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:15