索引与python和matplotlib混淆

时间:2016-06-02 21:09:01

标签: python matplotlib plot

python和matplotlib的索引太混乱了。

import matplotlib as plt

我读了一张图片,我是一个矩阵。首先,我使用plt.imshow()来显示图像。

该图像上有一条线,我有一条线L: x=[x0, x1, ..., xn], x=[y0, y1, ..., yn]的x坐标和y坐标。所以我可以使用plt.plot(x,y)在图像上绘制这条线。这一步仍然没问题。至少,图像上显示的线条是正确的。

然而,当我使用plt.plot(I[x,y])在线L的位置绘制图像I的强度值时,显然是错误的!

我认为错误可能是因为线的坐标与图像的坐标有些不一致。我试过了plt.plot(I[y,x]),但它仍然不正确。

那么,第一个问题,我应该使用哪个I[x,y] or I[y,x]

我观察到plt.imshow()上的y轴是从上到下。这可能是y轴被翻转的原因吗? x是否也被翻转?我对坐标命令感到困惑......

有人可以告诉我哪里出错吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

  

那么,第一个问题,我应该使用哪个I[x,y]I[y,x]

始终使用I[x,y]。这种表示法在所有计算库和数学分支中都是标准的。

plt.plot(x,y)需要一个序列。我相信,I[a,b]将返回一个像素值,而不是该区域的值。

答案 1 :(得分:0)

正如您可能已经猜到的那样,这里有两个约定。

首先,图表中有坐标的数学约定,其中(x,y) = (0,0)位于较低左下角:

Mathematical convention

其次,有用于数组的约定。以此数组为例:

img = [[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 0]]

该行的图像将如何存储。现在,img[y, x] = img[0, 0]指的是顶部左上角!

当您使用matplotlib的imshow函数(用于显示图像)时,它会使x轴和y轴显示图像矩阵的像素索引。因此,(0,0)是左上角:

enter image description here

因此,为了对齐坐标系,请执行以下操作:

plt.plot(np.flipud(I)[y, x])

np.flipud翻转矩阵)