我用opencv做了一些图像处理。我试图然后在我的绘图仪上绘制图像(左下角的原点),但图像被翻转。 opencv的原点位于左上方,因此图像的y坐标被翻转。
我应该对我的点应用什么函数,以便它能在新的原点系统中正确绘制(左下角)?
编辑: 我不关心改变情节显示,我实际上需要点数'坐标翻转。 使用np.flipud并没有改变点,因为该点由N X 2矩阵显示。
答案 0 :(得分:4)
问题不在于numpy,而在于matplotlib显示数据的方式。为了产生有效的可视化,您应该在图像生成级别上翻转y轴,而不是numpy分析。它可以通过matplitlib API轻松完成到axis对象:
plt.gca().invert_yaxis()
答案 1 :(得分:1)
您是否在询问如何翻转numpy数组或如何显示它?
如果您要问如何翻转数组,请查看np.flipud
或等效your_data[::-1, ...]
numpy.flipud
是一个使用上面显示的精确切片的函数。但是,如果你不熟悉numpy切片,它会更具可读性。
要解释为什么data[::-1, ...]
将垂直翻转数组,您需要了解索引的工作原理。
通常,python中的索引通过指定start:stop:step
来工作。其中每个都可以为无(例如:-10
指定start=None
,stop=-10
,step=None
)。
因此,::-1
指定start=None
,stop=None
,step=-1
- 换句话说,遍历整个序列,但以负步增量,有效地反转序列
...
是Ellipsis
。在numpy中,这用于表示包括所有其他维度。
省略号避免了特殊情况下您的数组需要2D或3D(或27维,就此而言)的需要。如果它是2D数组,那么x[::-1, ...]
相当于x[::-1, :]
。如果它是3D数组,则相当于x[::-1, :, :]
等等。
在numpy中,第一个轴是行。因此,x[::-1, ...]
说“反转行并保留所有其他维度。这将创建一个视图,因此内存不会重复,也不会创建副本。
在行的特定情况下,您可以省略省略号。但是,考虑一般情况是有用的。例如,左右翻转将为x[:, ::-1, ...]
(或np.fliplr
)。