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

如何在OpenCV中基于质心通过旋转矩阵实现图像旋转?

我找到一篇文献,其中研究人员通过质心对鸡蛋图像完成了旋转操作。我已经基于OTSU阈值化图像计算得到质心,相关代码如下:

_, thr = cv2.threshold(grayscale, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
moment = cv2.moments(thr)
if moment['m00'] !=0 :
    centroid = (int(moment['m10'] / moment['m00']), int(moment['m01'] / moment['m00']))
    cv2.circle(result, centroid, 3, (0, 255, 0), -1)
    showImage(result, "Centroid")

质心可视化效果图

研究人员建议使用旋转矩阵以质心为中心旋转图像,对应的旋转矩阵如下:
旋转矩阵公式

请问如何在OpenCV中调用旋转矩阵完成上述围绕质心的图像旋转操作?以下是我目前已实现的质心计算完整流程代码:

输入图像示例:
输入示例图像1
输入示例图像2

def showImage(img, titulo):
    plt.figure(figsize=(5,5))
    plt.title(titulo)
    plt.imshow(img)
    plt.show()

# 图像分割
imagePath = "images/sample1.jpeg"
image = cv2.imread(imagePath)
# BGR格式转RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
original = image
# 展示原始图像
showImage(image, "Imagen Original")

# 应用低通滤波(模糊)
image = cv2.blur(image,(9,9),0)
    
# 转换为HSV格式
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 展示鸡蛋对比度最高的R通道
showImage(hsv, "hsv image")

# 将HSV图像转换为灰度图
grayscale = cv2.cvtColor(hsv, cv2.COLOR_RGB2GRAY)
showImage(grayscale, "Escala de grises hsv")

# 应用OTSU二值化
_, thr = cv2.threshold(grayscale, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

showImage(thr, "OTSU imagen")

# 将thr掩码应用到原始图像
result = cv2.bitwise_and(original, original, mask=thr)

showImage(result, "Imagen segmentada")

# 计算质心
moment = cv2.moments(thr)
if moment['m00'] !=0 :
    centroid = (int(moment['m10'] / moment['m00']), int(moment['m01'] / moment['m00']))
    cv2.circle(result, centroid, 3, (0, 255, 0), -1)
    showImage(result, "Centroid")

解答

要在OpenCV中实现绕质心的图像旋转,你可以直接调用内置的cv2.getRotationMatrix2D()生成对应旋转矩阵,再用cv2.warpAffine()完成变换即可,具体实现如下:

补充代码

你可以在计算得到质心的代码块后,添加以下内容:

# 自定义旋转角度,单位为度,正值为逆时针旋转,可根据需求调整
angle = 30
# 获取原始图像高宽
h, w = original.shape[:2]
# 生成以质心为原点的旋转矩阵,最后一个参数1表示不调整缩放比例
rot_mat = cv2.getRotationMatrix2D(centroid, angle, 1)

# 可选:计算旋转后不裁剪内容的新画布尺寸
new_w = int(h * abs(rot_mat[0][1]) + w * abs(rot_mat[0][0]))
new_h = int(h * abs(rot_mat[0][0]) + w * abs(rot_mat[0][1]))
# 调整旋转矩阵的平移分量,保证旋转后图像在新画布居中
rot_mat[0][2] += (new_w / 2) - centroid[0]
rot_mat[1][2] += (new_h / 2) - centroid[1]

# 执行旋转变换,borderValue可自定义边界填充颜色
rotated_img = cv2.warpAffine(original, rot_mat, (new_w, new_h), borderValue=(0,0,0))
# 展示旋转结果
showImage(rotated_img, f"旋转{angle}度后的图像")

注意事项

  • 如果不需要保留完整旋转内容,直接使用原图像尺寸输出的话,可以跳过新画布尺寸计算步骤,把cv2.warpAffine的第三个参数改为(w, h)即可
  • 如果你需要手动实现旋转矩阵而不调用内置接口,直接按照你给出的公式给rot_mat的对应元素赋值即可,和调用cv2.getRotationMatrix2D生成的矩阵效果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:08