Draw an ellipse on a figure and get coordinates_Python

偶尔善良 提交于 2019-12-11 13:39:31

问题


I'm working on Python 2.7. I have to define some Areas of Interest (AoI) on a picture. Basically, I'm trying to do this drawing an ellipse (or more) on a specific part of the picture and to get the coordinates (x; y) of its contour. I want to save these coordinates on a file, in order to use them later to see whether (or not) my data are inside this area.

This is my code:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse, Circle
from matplotlib.path import Path

# Get an example image

img = imread('sposa.png')

# Create a figure. Equal aspect so circles look circular
fig,ax = plt.subplots(1)
ax.set_aspect('equal')

# Show the image
ax.imshow(img)
ax.set_xlim(0,1600)
ax.set_ylim(0,1200)
# Now, loop through coord arrays, and create a circle at each x,y pair
ellipse = Ellipse((1000, 400), width=400, height=100, edgecolor='white',facecolor='none',linewidth=2)

ax.add_patch(ellipse)
path = ellipse.get_path()

# Show the image
plt.show()

When I run the code, I get this (that is exactly what I want):

However, when I print the path in order to check it, I get the following output, which (I suppose) is exclusively related to the ellipse.

Path(array([[ 0.        , -1.        ],
   [ 0.2652031 , -1.        ],
   [ 0.51957987, -0.89463369],
   [ 0.70710678, -0.70710678],
   [ 0.89463369, -0.51957987],
   [ 1.        , -0.2652031 ],
   [ 1.        ,  0.        ],
   [ 1.        ,  0.2652031 ],
   [ 0.89463369,  0.51957987],
   [ 0.70710678,  0.70710678],
   [ 0.51957987,  0.89463369],
   [ 0.2652031 ,  1.        ],
   [ 0.        ,  1.        ],
   [-0.2652031 ,  1.        ],
   [-0.51957987,  0.89463369],
   [-0.70710678,  0.70710678],
   [-0.89463369,  0.51957987],
   [-1.        ,  0.2652031 ],
   [-1.        ,  0.        ],
   [-1.        , -0.2652031 ],
   [-0.89463369, -0.51957987],
   [-0.70710678, -0.70710678],
   [-0.51957987, -0.89463369],
   [-0.2652031 , -1.        ],
   [ 0.        , -1.        ],
   [ 0.        , -1.        ]]), array([ 1,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
    4,  4,  4,  4,  4,  4,  4,  4, 79], dtype=uint8))

However, I need a list of coordinates of the ellipse in relation to the pixel of the picture (1600 X 1200). I'm probably using the wrong function or there is something that does not match between the picture and the ellipse.

I should obtain something like this (this is an example from a previous experiment):

[ Path(array([[ 1599.        ,   868.86791294],
   [ 1598.        ,   868.87197971],
   [ 1597.        ,   868.8801087 ],
   ..., 
   [ 1597.        ,   675.30378536],
   [ 1598.        ,   675.31373204],
   [ 1599.        ,   675.31870792]]), None)]
665 

Can anyone help me? Thank you in advance, R


回答1:


the path array appears to be a coarse normalized circle - I'd ignore it

you have the ellipse info already
ellipse = Ellipse((1000, 400), width=400, height=100, ...)

I would just do a sin, cos paramaterized ellipse based on the 1st few numbers in Ellipse((1000, 400), width=400, height=100which are the center point and axis lengths if you want to draw a hi res ellipse explicitly

for a membership test (x - x_0)^2/a^2 + (y - y_0)^2/b^2 <= 1 is probably best where a, b are 1/2 of the respective width=400, height=100

of course you would only need to test pixel indices within the bounding rectangle




回答2:


You should use Ellipse.get_path().vertices, however it's not in the correct coordinates system. To transform it, apply ellipse.get_patch_transform().transform to it. See below a working example

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
from matplotlib.path import Path
from matplotlib.patches import PathPatch

img = plt.imread("image.jpg")

fig, ax = plt.subplots(1)
ax.set_aspect('equal')

ax.imshow(img)

# Create the base ellipse
ellipse = Ellipse((300, 300), width=400, height=100,
                  edgecolor='white', facecolor='none', linewidth=2)

# Get the path
path = ellipse.get_path()
# Get the list of path vertices
vertices = path.vertices.copy()
# Transform the vertices so that they have the correct coordinates
vertices = ellipse.get_patch_transform().transform(vertices)

# You can then save the vertices array to a file: csv, pickle... It's up to you

plt.show()


来源:https://stackoverflow.com/questions/48670760/draw-an-ellipse-on-a-figure-and-get-coordinates-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!