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

如何在PyTorch Tensor上绘制线条?仿numpy数组操作实现

在PyTorch Tensor上实现类似OpenCV的线条绘制操作

你习惯用OpenCV在numpy数组上绘制线条,示例代码如下:

pts = [[160, 160], [280, 280]]
mask = np.zeros([640,640]).astype(np.uint8)
mask = cv2.line(mask, *pts, (255, 255), 15)
plt.imshow(mask)
plt.show()

对应的绘制结果:
图像结果

现在要对如下PyTorch Tensor完成相同的线条绘制操作:

mask_t = torch.zeros([640,640],dtype=torch.uint8).to(device)

可以通过以下两种方式实现:

方法一:借助OpenCV(简单高效)

利用OpenCV对numpy数组的良好支持,将Tensor转换为numpy数组完成绘制后再转回Tensor,步骤如下:

import torch
import cv2

pts = [[160, 160], [280, 280]]
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
mask_t = torch.zeros([640,640], dtype=torch.uint8).to(device)

# 将Tensor转回CPU并转为numpy数组
mask_np = mask_t.cpu().numpy()
# 用OpenCV绘制线条
mask_np = cv2.line(mask_np, *pts, (255, 255), 15)
# 将numpy数组转回Tensor并放回原设备
mask_t = torch.from_numpy(mask_np).to(device)

这种方法直接复用OpenCV优化成熟的绘制逻辑,代码简洁,适合大多数场景。

方法二:纯PyTorch实现(避免设备切换开销)

如果需要全程在GPU上操作、避免数据在CPU与GPU间传输的开销,可以手动实现画线算法(比如Bresenham算法),示例代码如下:

import torch

def draw_line_tensor(tensor, pt1, pt2, value, thickness=1):
    assert len(tensor.shape) == 2, "输入必须是2D Tensor"
    y0, x0 = pt1
    y1, x1 = pt2

    dx = abs(x1 - x0)
    dy = abs(y1 - y0)
    sx = 1 if x0 < x1 else -1
    sy = 1 if y0 < y1 else -1
    err = dx - dy

    while True:
        # 绘制当前点及厚度范围内的区域
        y_min = max(0, y0 - thickness // 2)
        y_max = min(tensor.shape[0] - 1, y0 + thickness // 2)
        x_min = max(0, x0 - thickness // 2)
        x_max = min(tensor.shape[1] - 1, x0 + thickness // 2)
        tensor[y_min:y_max+1, x_min:x_max+1] = value

        if x0 == x1 and y0 == y1:
            break
        e2 = 2 * err
        if e2 > -dy:
            err -= dy
            x0 += sx
        if e2 < dx:
            err += dx
            y0 += sy
    return tensor

# 使用示例
pts = [[160, 160], [280, 280]]
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
mask_t = torch.zeros([640,640], dtype=torch.uint8).to(device)
mask_t = draw_line_tensor(mask_t, pts[0], pts[1], 255, thickness=15)

这种方法适合对性能要求较高、需要批量GPU操作的场景,无需依赖OpenCV。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:21:27