【问题标题】:Python: Coordinates Boxes around PolylinePython:围绕折线的坐标框
【发布时间】:2017-05-05 10:15:35
【问题描述】:

我有以下问题。我有一个 numpy 坐标数组(条目 0 到 2),并且想要在我的坐标列表对之间定义小框的所有坐标,而不是在列表中所有坐标的最小值和最大值周围创建一个巨大的框。例如,这些框在坐标对周围的范围应为 5。

例如,我的列表如下所示:

[[  24.313  294.679    1.5      1.       0.   ]
 [  25.51   295.263    1.5      2.       0.   ]
 [  26.743  294.526    1.5      3.       0.   ]
 ..., 
 [  30.362  307.242   10.779   95.       0.   ]
 [  29.662  307.502   10.38    96.       0.   ]
 [  29.947  308.99    11.147   97.       0.   ]]

我的第一个想法是计算每对的最小值和最大值,并使用 itertools.product 来创建小盒子的坐标。所以我想在24.313 294.679 1.525.51 295.263 1.5 周围放一个盒子,然后在25.51 295.263 1.526.743 294.526 1.5 周围放一个盒子等等。为了更好地理解,我想要这里的坐标,但当然是 3D:

不像这里:

有没有简单的 numpy、scipy 方法来做到这一点?

【问题讨论】:

  • 您想要输出的图片与您请求的文字不一致。它在哪一个?您想要在数据系列(图像)周围有一个恒定宽度的“管”,还是想要系列中连续成对数据点的边界框(文本)?
  • 我想要连续对的数据点周围的边界框

标签: python arrays numpy scipy


【解决方案1】:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

# create some data; in 2D so we can plot stuff
x = np.linspace(0, 2*np.pi, 10)
y = np.sin(x)
data = np.c_[x,y]

# --------------------------------------------------
# core bit: get boxes
# bboxes = np.array([data[:-1], np.diff(data, axis=0)]).transpose([1,2,0]) # shorter but with negative widths, etc
data_pairs = np.array([data[:-1], data[1:]])
minima = data_pairs.min(axis=0)
maxima = data_pairs.max(axis=0)
widths = maxima-minima
bboxes = np.array([minima, widths]).transpose(1,2,0)
# --------------------------------------------------

# plot
fig, ax = plt.subplots(1,1)
ax.plot(data[:,0], data[:,1], 'ko')
for bbox in bboxes:
    patch = Rectangle(xy=bbox[:,0], width=bbox[0,1], height=bbox[1,1], linewidth=0., alpha=0.5)
    ax.add_artist(patch)

plt.show()

带衬垫:

# padded boxes:
pad = 0.1
N, D = data.shape
correction = pad*np.ones((N-1,D))

padded = bboxes.copy()
padded[:,:,0] -= correction
padded[:,:,1] += 2*correction

fig, ax = plt.subplots(1,1)
ax.plot(data[:,0], data[:,1], 'ko')
for bbox in padded:
    patch = Rectangle(xy=bbox[:,0], width=bbox[0,1], height=bbox[1,1], linewidth=0., alpha=0.5, facecolor='red')
    ax.add_artist(patch)
ax.set_xlim(0-pad, 2*np.pi+pad)
ax.set_ylim(-1-pad, 1+pad)
plt.show()

【讨论】:

  • 好吧,这看起来不错!但是现在数据点是盒子的边缘,不是吗?我需要一个更大的盒子,所以必须添加一个半径。我认为可以在您的最小值和最大值的步骤中添加它?这将导致单个框之间的坐标重叠。但我认为这可以通过计算后使用 set 函数来解决。
  • 添加了填充计算边界框的代码。
  • 啊,谢谢 :),如果在 3D 中执行代码会是什么样子?
  • 我编写的代码使得所有相关部分(获取边界框并填充它们)都独立于数据的维度。绘图显然只能在 2D 中工作(至少已实现)。
  • 嗯,我总是得到错误:“ValueError:操作数不能与形状(97,5)(2,5)一起广播”
猜你喜欢
  • 2023-03-07
  • 2019-03-21
  • 1970-01-01
  • 2015-09-26
  • 2015-12-23
  • 1970-01-01
  • 2016-11-07
  • 2021-06-06
  • 2022-01-13
相关资源
最近更新 更多