反转图像的 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')
它产生以下图像:
可以获取图片there
我试过plt.gca().invert_yaxis()
没有成功
我该怎么办
imshow
的默认行为是将坐标系的原点放在上 左角。这不同于绘制科学数据,例如两个实体 x
和 y
相互对照,其中原点,即对应于坐标 (0,0)
的点位于 下左角,(正)x-axis向右延伸,(正)y-axis向上延伸。
后者只是科学惯例,尽管可以追溯到几个世纪前。可以说(虽然几乎不可能用历史证据来支持),x-axis 传统上对齐 left-to-right 因为这是许多语言中文本的书写方式,而 y-axis 则朝向顶部这就是人们凭直觉 增加 的方式——很像地形的高度。
另一方面,对于图像,现有约定植根于像素数据的内存布局以及在 canvas 上排列连续像素的方式:第一行从左到右 (按照与上面相同的逻辑),然后在下一行再次从左边开始,依此类推所有其他行,从上到下。就像页面上排列的单词一样 — 在从左到右书写的语言中,更普遍的是从上到下。
正是出于这个原因,您图像中的 y-axis 是按原样定向的。要使 y-values 自下而上增加,您可以调用选项 origin='lower'
以便按照科学惯例解释输入数据。但是,您随后还需要 翻转 图像的线条 上下颠倒 以便在屏幕上显示时,图像以其预期方向显示。那是因为以前图像加载到内存中时的第一行现在对应于最后 y-coordinate,即顶部的行。
底线(双关语并非无意),只需在上面的代码中调用 imshow
即可:
plt.imshow(np.flipud(img), cmap='gray', origin='lower')
为了进一步说明,这里有一个 self-contained 示例来演示该行为:
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
),即额外的一行代码。Im显然,NumPy 仍在做这项工作。)
类似问题:
- Matplotlib inverted image
- How to use "extent" in
matplotlib.pyplot.imshow
我正在尝试使用 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()
没有成功
我该怎么办
imshow
的默认行为是将坐标系的原点放在上 左角。这不同于绘制科学数据,例如两个实体 x
和 y
相互对照,其中原点,即对应于坐标 (0,0)
的点位于 下左角,(正)x-axis向右延伸,(正)y-axis向上延伸。
后者只是科学惯例,尽管可以追溯到几个世纪前。可以说(虽然几乎不可能用历史证据来支持),x-axis 传统上对齐 left-to-right 因为这是许多语言中文本的书写方式,而 y-axis 则朝向顶部这就是人们凭直觉 增加 的方式——很像地形的高度。
另一方面,对于图像,现有约定植根于像素数据的内存布局以及在 canvas 上排列连续像素的方式:第一行从左到右 (按照与上面相同的逻辑),然后在下一行再次从左边开始,依此类推所有其他行,从上到下。就像页面上排列的单词一样 — 在从左到右书写的语言中,更普遍的是从上到下。
正是出于这个原因,您图像中的 y-axis 是按原样定向的。要使 y-values 自下而上增加,您可以调用选项 origin='lower'
以便按照科学惯例解释输入数据。但是,您随后还需要 翻转 图像的线条 上下颠倒 以便在屏幕上显示时,图像以其预期方向显示。那是因为以前图像加载到内存中时的第一行现在对应于最后 y-coordinate,即顶部的行。
底线(双关语并非无意),只需在上面的代码中调用 imshow
即可:
plt.imshow(np.flipud(img), cmap='gray', origin='lower')
为了进一步说明,这里有一个 self-contained 示例来演示该行为:
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
),即额外的一行代码。Im显然,NumPy 仍在做这项工作。)
类似问题:
- Matplotlib inverted image
- How to use "extent" in
matplotlib.pyplot.imshow