繁体   English   中英

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

[英]Invert the y-axis of an image without flipping the image upside down

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

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

图像可以在那里获得

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

我该怎么办

的默认行为imshow是把坐标系的原点在左上角 这是从绘制的科学数据不同,如两个实体xy彼此抵靠,其中,所述原点,即,对应于坐标点(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) 。所做的只是避免显式import NumPy(作为np )即,一个额外的代码行。plicitly,NumPy的还是做的工作。)

类似问题:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM