【问题标题】:Invert the y-axis of an image without flipping the image upside down在不倒置图像的情况下反转图像的 y 轴
【发布时间】:2019-07-06 18:24:10
【问题描述】:

我正在尝试使用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()没有成功

我该怎么办

【问题讨论】:

  • 可能无法比the matplotlib tutorial on origin and extent 更好地解释这一点。
  • 感谢您的评论@ImportanceOfBeingErnest。这确实是一个很好的参考。我正在尝试找到我的答案,虽然我还没有找到问题的直接答案

标签: python matplotlib image-processing axis


【解决方案1】:

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)。所做的只是避免使用NumPy 的显式import(如np) ,即额外的代码行。明确地说,NumPy 仍在做这项工作。)

类似问题:

【讨论】:

  • 所以无论如何默认情况下原点都是“上”,我们可以保持原点。需要改变的是程度;在这种情况下plt.imshow(img, extent=[-.5, img.shape[1]-0.5, -0.5, img.shape[0]-0.5])。这是explicit extent 部分的第一行。
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 2019-11-03
  • 2013-11-04
  • 2021-02-13
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多