我正在尝试使用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')
可以获取图像there
我尝试plt.gca().invert_yaxis()
失败
我该怎么办
答案 0 :(得分:3)
imshow
的默认行为是将坐标系的原点放在上的左上角。这与绘制科学数据(例如两个实体x
和y
相互绘制)不同,在这里,原点(即与坐标(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才能检索示例图像。其输出是:
类似的问题: