.out-of-scope/ellipse-shape.md
labelme does not support an ellipse (or rotated ellipse) annotation shape.
The existing circle shape stays a circle; it is not being generalized into
an ellipse.
The demand is thin and stale. Across the project's lifetime there have been three requests for an ellipse shape — #298 (2019), #391 (2019), #871 (2021) — all closed, with none in the years since. PR #909 implemented a working ellipse-fitting prototype on a branch and left it available for roughly five years; it attracted a single user comment. Latent demand that does not convert even when an implementation is sitting right there is weak demand.
The shape is also redundant for the practical cases. The domains that reach for
ellipses (cells, nuclei, some biology/astronomy) are already covered by
polygon and mask, both of which labelme supports and which most annotation
pipelines consume directly. An ellipse primitive would add a shape type,
serialization, rendering, mask conversion, and rotation UI for a niche that the
existing primitives already serve.
Do not resurrect PR #909's approach. It used skimage.measure.EllipseModel
fitting over a variable number of points with double-click finalize, and it
could not render rotated ellipses because the old QPainterPath-based renderer
had no rotated-ellipse path (the author stubbed those code paths with logger
errors).
The cheaper and more consistent direction, if needed, is to promote the geometry already in the tree rather than fit:
oriented_rectangle — which
already carries all the rotation machinery (oriented_rectangle_center,
rotate, get_rotation_handle, the direction arrow). The exact problem that
killed #909 (rendering a rotated ellipse) is already solved by reusing that
4-point representation.circle is already a degenerate ellipse: it rasterizes via
PIL.ImageDraw.ellipse (labelme/_utils/shape.py) and renders via
addEllipse(center, radius, radius) (labelme/_widgets/_shape_render.py). The
lowest-cost slice would be an axis-aligned ellipse (unequal radii, no
rotation), but it should not be built on spec.