反转图像的 y 轴而不颠倒图像

ecj*_*cjb 7 python axis image-processing matplotlib

我正在尝试使用matplotlib. 然而,y 轴自下而上递减。我希望它在不翻转图像的情况下自下而上增加

我有以下代码

import matplotlib.pyplot as plt
import numpy as np
img_path = '/path/to/image.tif'
img = plt.imread(img_path)
plt.imshow(img, cmap = 'gray')
Run Code Online (Sandbox Code Playgroud)

它产生以下图像: 在此处输入图片说明

图像可以在那里获得

我试过plt.gca().invert_yaxis()没有成功

我该怎么办

ano*_*non 9

的默认行为imshow是把坐标系的原点在左上角。这是从绘图的科学数据,如两个实体不同xy彼此抵靠,其中,所述原点,即点对应于坐标(0,0),是在较低的左上角,与所述(正)X轴延伸到右侧和(正)y 轴朝顶部延伸。

后者只是科学惯例,尽管可以追溯到几个世纪之前。可以说(尽管几乎不可能用历史证据来支持),x 轴传统上是从左到右对齐的,因为这就是用多种语言编写文本的方式,而 y 轴则朝向顶部,因为这是人们的直觉的增长-就像地形的高程。

另一方面,对于图像,现有约定植根于像素数据的内存布局以及在画布上排列连续像素的方式:在第一行从左到右(按照与上述相同的逻辑),然后在下一行再次从左侧开始,对所有其他行以此类推,从上到下。就像排列在页面上的文字一样——语言是从左到右书写的,更普遍的是,从上到下书写。

正是出于这个原因,图像中的 y 轴按原样定向。要使 y 值自下而上增加,您可以调用该选项,origin='lower'以便按照科学惯例解释输入数据。但是,你则还需要翻转图像的线条在屏幕上显示时,这样,图像出现在其预期的取向。那是因为当图像加载到内存中时的第一行现在对应于最后一个 y 坐标,即顶部的那个。

底线(双关语并非无意),只需imshow在上面的代码中像这样调用:

plt.imshow(np.flipud(img), cmap='gray', origin='lower')
Run Code Online (Sandbox Code Playgroud)

为了进一步说明,这里是一个独立的示例,演示了该行为:

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()
Run Code Online (Sandbox Code Playgroud)

该示例需要安装ImageIO才能检索示例图像。它的输出是:

演示脚本的输出

(在该示例中的代码中,我使用的image[::-1]翻转图像,代替上述,和等效,语法np.flipud(image)。所有这些确实是避免显式importNumPy的的(如np),即,一个额外的代码行。plicitly,NumPy的是仍然做作业。)

类似问题: