imshow 的默认行为是将坐标系的原点放在左上角。这与绘制科学数据不同,例如两个实体x 和y 相互对立,其中原点,即对应于坐标(0,0) 的点位于左下角角,(正)x 轴向右延伸,(正)y 轴向上延伸。
后者只是科学惯例,尽管可以追溯到几个世纪以前。可以说(尽管几乎不可能用历史证据来支持),x 轴传统上是从左到右对齐的,因为这是用多种语言编写文本的方式,而 y 轴朝向顶部,因为这是人们直觉的方式增加 — 很像地形的高度。
另一方面,对于图像,现有约定植根于像素数据的内存布局以及在画布上排列连续像素的方式:在第一行从左到右(通过与上述相同的逻辑),然后在下一行从左开始,以此类推,从上到下。就像在页面上排列的单词一样——用从左到右书写的语言,更普遍的是,从上到下书写。
正是由于这个原因,图像中的 y 轴才按原样定向。要让 y 值自下而上增加,您可以调用选项 origin='lower' 以便按照科学惯例解释输入数据。但是,您还需要翻转图像的线条上下颠倒,这样,当图像显示在屏幕上时,图像就会按预期的方向显示。这是因为图像加载到内存时的第一行现在对应于最后一个 y 坐标,即顶部的那个。
底线(双关语并非无意),只需像上面的代码中那样调用imshow:
plt.imshow(np.flipud(img), cmap='gray', origin='lower')
为了进一步说明,这里有一个独立的示例来演示该行为:
from imageio import imread
image = imread('https://upload.wikimedia.org/wikipedia/commons'
'/thumb/6/6a/Mona_Lisa.jpg/158px-Mona_Lisa.jpg')
from matplotlib import pyplot
figure = pyplot.figure(tight_layout=True)
(axes1, axes2, axes3) = figure.subplots(nrows=1, ncols=3)
axes1.set_title("origin='upper'")
axes1.imshow(image)
axes2.set_title("origin='lower'")
axes2.imshow(image, origin='lower')
axes3.set_title("'lower' + flipped")
axes3.imshow(image[::-1], origin='lower')
pyplot.show()
该示例需要安装ImageIO 才能检索示例图像。它的输出是:
(在示例的代码中,我使用image[::-1] 来翻转图像,而不是前面提到的等效语法np.flipud(image)。所做的只是避免使用NumPy 的显式import(如np) ,即额外的代码行。我明确地说,NumPy 仍在做这项工作。)
类似问题: