首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在图形上绘制椭圆并获取coordinates_Python

在图形上绘制椭圆并获取coordinates_Python
EN

Stack Overflow用户
提问于 2018-02-08 02:19:11
回答 2查看 2.5K关注 0票数 3

我正在开发Python 2.7。我必须在图片上定义一些感兴趣的区域(AoI)。基本上,我试图在图片的特定部分绘制一个椭圆(或更多),并获得其轮廓的坐标(x;y)。我想将这些坐标保存在一个文件中,以便以后使用它们来查看我的数据是否在这个区域内。

这是我的代码:

代码语言:javascript
运行
复制
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()

当我运行代码时,我得到这样的结果(这正是我想要的):

但是,当我打印路径以检查它时,我得到了以下输出,(我认为)它专门与椭圆相关。

代码语言:javascript
运行
复制
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))

但是,我需要一个相对于图片像素的椭圆坐标列表(1600X1200)。我可能使用了错误的函数,或者在图片和椭圆之间有不匹配的东西。

我应该得到类似这样的东西(这是之前实验中的一个例子):

代码语言:javascript
运行
复制
[ Path(array([[ 1599.        ,   868.86791294],
   [ 1598.        ,   868.87197971],
   [ 1597.        ,   868.8801087 ],
   ..., 
   [ 1597.        ,   675.30378536],
   [ 1598.        ,   675.31373204],
   [ 1599.        ,   675.31870792]]), None)]
665 

有谁可以帮我?提前谢谢你,R

EN

回答 2

Stack Overflow用户

发布于 2019-08-15 02:40:06

您应该使用Ellipse.get_path().vertices,但是它不在正确的坐标系中。要对其进行转换,请对其应用ellipse.get_patch_transform().transform。请参见下面的工作示例

代码语言:javascript
运行
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2018-02-08 08:07:54

路径数组看起来是一个粗糙的归一化圆-我会忽略它

你已经有椭圆信息了

ellipse = Ellipse((1000, 400), width=400, height=100, ...)

如果你想显式地画一个高分辨率的椭圆,我会根据Ellipse((1000, 400), width=400, height=100中的前几个数字,即中心点和轴的长度,做一个正弦,cos参数化的椭圆。

对于成员资格测试,当ab分别为width=400, height=100的1/2时,(x - x_0)^2/a^2 + (y - y_0)^2/b^2 <= 1可能是最好的

当然,您只需要测试边界矩形内的像素索引

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48670760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档