如何使用OpenCV从图像形心按固定角度间隔向形状边缘绘制连线
从形心按固定角度向边缘绘制放射连线实现方案
实现逻辑
- 首先确定自定义角度间隔,将0-360度范围按间隔拆分所有待绘制的角度值,转换为弧度后计算对应射线的方向向量
- 从形心坐标(cx, cy)出发,沿着当前角度的方向向量逐像素步进,每次判断当前步进位置是否属于Canny检测得到的边缘区域
- 找到第一个边缘点后,直接绘制从形心到该点的连线即可,步进时最大步长限制为图像对角线长度,避免无效遍历
完整实现代码
import cv2 import numpy as np import matplotlib.pyplot as plt # 1. 图像初始化 image = cv2.imread('blackcirr.jpg') h, w = image.shape[:2] # 2. 形心计算(和现有逻辑一致) gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) canny_edges = cv2.Canny(gray_img, 30, 200) M = cv2.moments(canny_edges) cx = int(M['m10'] / M['m00']) cy = int(M['m01'] / M['m00']) # 标注形心 cv2.circle(image, (cx, cy), 5, (255, 255, 0), -1) cv2.putText(image, "centroid", (cx - 25, cy - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 0)) # 3. 按角度间隔绘制放射连线 angle_step = 2 # 可自定义角度间隔,此处为2度 max_radius = int(np.hypot(w, h)) # 最大搜索半径为图像对角线长度,避免死循环 for angle in np.arange(0, 360, angle_step): # 角度转弧度,计算方向向量 rad = np.deg2rad(angle) dx = np.cos(rad) dy = np.sin(rad) # 沿方向搜索边缘点 for r in range(1, max_radius): x = int(cx + dx * r) y = int(cy + dy * r) # 超出图像边界就停止当前角度搜索 if x < 0 or x >= w or y <0 or y >= h: break # 碰到边缘点就绘制连线并停止搜索 if canny_edges[y, x] == 255: cv2.line(image, (cx, cy), (x, y), (0, 255, 0), 1) # 颜色、线宽可自定义 break # 显示结果 fig = plt.figure(figsize = (5, 5)) plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # 转换颜色通道避免matplotlib显示偏色 plt.xticks([]) plt.yticks([]) plt.show()
参数调整说明
- 修改
angle_step的数值即可自定义角度间隔,比如设为5就是每5度画一条线 - 调整
cv2.line的最后两个参数可修改连线的颜色和粗细,满足不同显示需求
内容的提问来源于stack exchange,提问作者Newyen minh
相关产品推荐
相关产品推荐

