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

已知中心亚像素浮点坐标 如何在图像上绘制无抖动的圆形

亚像素级别关键点跟踪结果可视化解决方案

亚像素坐标的视觉抖动本质是整数取整导致的位置跳变,可通过以下3种可直接落地的方案解决:

  • 方案1:上采样后绘制再降采样(性能最优,适合实时视频预览)

    操作步骤:
    1. 先将原始图像按照2~4倍的放大系数使用cv2.resize()做上采样,插值方式选cv2.INTER_LANCZOS4保证边缘平滑
    2. 将浮点关键点坐标同步乘以放大系数后取整,使用cv2.circle()配合lineType=cv2.LINE_AA(反走样)绘制标记
    3. 将绘制完成的图像再降采样回原始分辨率,输出预览或写入视频
      示例代码片段:
    scale = 4
    img_up = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_LANCZOS4)
    # 坐标变换
    x_draw = int(round(x * scale))
    y_draw = int(round(y * scale))
    cv2.circle(img_up, (x_draw, y_draw), radius=2*scale, color=(0,0,255), thickness=-1, lineType=cv2.LINE_AA)
    # 降采样回原尺寸
    img_res = cv2.resize(img_up, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_AREA)
    
    该方案的亚像素偏移会转化为标记点边缘的透明度渐变,完全消除跳变抖动。
  • 方案2:基于Matplotlib渲染(效果最优,适合论文配图/高精度结果输出)

    Matplotlib的散点绘制原生支持浮点坐标,自带抗锯齿渲染,无需手动处理坐标映射:
    1. 用plt.imshow()加载原始图像
    2. 直接传入浮点坐标调用plt.scatter()绘制关键点,可自定义点大小、颜色、边缘样式
    3. 关闭坐标轴后将画布转成numpy数组即可用于视频合成
      示例代码片段:
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 直接传入浮点x、y坐标
    ax.scatter(x, y, s=10, c='red', edgecolor='white', linewidth=0.5)
    ax.axis('off')
    # 转成numpy数组
    fig.canvas.draw()
    img_res = np.array(fig.canvas.renderer.buffer_rgba())
    plt.close(fig)
    
  • 方案3:手动实现亚像素点渲染(灵活度最高,适合自定义渲染逻辑)

    对于浮点坐标(x,y),你可以基于双线性权重或者高斯核计算相邻4个像素的贡献值,将标记颜色按照权重和对应像素做alpha混合,完全保留亚像素精度,不会出现任何位置跳变。
    示例逻辑:
    # 取浮点坐标的整数部分和小数部分
    x0 = int(np.floor(x))
    y0 = int(np.floor(y))
    dx = x - x0
    dy = y - y0
    # 双线性权重
    w1 = (1 - dx) * (1 - dy)
    w2 = dx * (1 - dy)
    w3 = (1 - dx) * dy
    w4 = dx * dy
    # 给四个相邻像素按权重上色,可叠加高斯核扩大点的范围
    point_color = np.array([0,0,255])
    img[y0, x0] = img[y0, x0] * (1 - w1) + point_color * w1
    img[y0, x0+1] = img[y0, x0+1] * (1 - w2) + point_color * w2
    img[y0+1, x0] = img[y0+1, x0] * (1 - w3) + point_color * w3
    img[y0+1, x0+1] = img[y0+1, x0+1] * (1 - w4) + point_color * w4
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:45:04