翻转图像的y轴,而无需上下翻转图像

时间:2019-07-06 18:24:10

标签: python matplotlib image-processing axis

我正在尝试使用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')

它产生以下图像: enter image description here

可以获取图像there

我尝试plt.gca().invert_yaxis()失败

我该怎么办

1 个答案:

答案 0 :(得分:3)

imshow的默认行为是将坐标系的原点放在的左上角。这与绘制科学数据(例如两个实体xy相互绘制)不同,在这里,原点(即与坐标(0,0)相对应的点)位于 左下角,(正)x轴向右延伸,(y)y轴向顶部延伸。

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

另一方面,对于图像,现有的约定植根于像素数据的内存布局,以及人们在画布上排列连续像素的方式:在第一行上从左到右(与上述相同的逻辑) ),然后再次从左到下一行,对于所有其他行,依此类推,从上到下。就像排列在页面上的单词一样-用从左到右,从上到下的通用语言写。

正因为如此,图像中的y轴才按照其原样定向。要使y值自下而上增加,可以调用选项origin='lower',以便按照科学惯例解释输入数据。但是,您还需要翻转图像的线上下,以便在屏幕上显示图像时,图像以预期的方向显示。这是因为,当图像被加载到内存中时,以前的第一行现在对应于最后一个y坐标,即顶部的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才能检索示例图像。其输出是:

output of demo script

类似的问题: