如何在给定中心浮点(子像素)坐标的图像上绘制圆圈

How to draw a circle on image given float (subpixel) coordinates of it center

我想在python中可视化关键点跟踪算法的结果。我有一系列(图像,关键点)对(基本上是视频)。跟踪算法足够强大,可以提供亚像素精度。但是我不知道如何正确地可视化它。

我尝试将我的坐标四舍五入并画一个圆 cv2.circle(image, (int(round(x)), int(round(y)))),但由于图像分辨率太小,这会导致我的关键点视觉抖动。

我检查了 OpenCV、Pillow、skimage、Pygame (pygame.draw.circle)。都不能用float坐标正确画圆

DIPlib 具有函数 DrawBandlimitedBall(),它可以绘制圆盘或圆,过渡平滑且具有浮点原点坐标(披露:我是作者之一)。您可能需要在空白图像中绘制圆圈,然后将其混合以获得您想要的效果。代码看起来像这样:

import diplib as dip

img = dip.ImageRead('/Users/cris/dip/images/flamingo.tif')
p = [366.4, 219.1]

# Create an empty image and draw a circle in it
circle = dip.Image(img.Sizes(), 1, 'SFLOAT')
circle.Fill(0)
dip.DrawBandlimitedBall(circle, diameter=22.3, origin=p, value=1, mode='empty')
circle /= dip.Maximum(circle)

# Blend: img * (1-circle) + circle * color
img *= 1 - circle
img += circle * dip.Create0D([0,255,0]) # we make the circle green here

img.Show()
dip.ImageWrite(img, 'so.jpg')

(请注意,在没有 JPEG 压缩伪影的情况下,圆圈实际上看起来更好。)

您可以直接在图像中绘制圆圈,但此函数将圆圈值添加到图像中,它不会尝试混合,因此对于这个特定的应用程序,您会得到更糟糕的外观。