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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:36:04