如何在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中调用旋转矩阵完成上述围绕质心的图像旋转操作?以下是我目前已实现的质心计算完整流程代码:
输入图像示例:

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
相关产品推荐
相关产品推荐

