使用matplotlib imsh绘制NxMx3 ndarray作为图像

2024-05-14 09:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码旨在用matplotlib.imshow():

import pylab as plt
import numpy as np
import colorsys

W = 512
H = 256

hsls = np.ndarray(shape=(H, W, 3), dtype=float)
hsls[:] = .0

baseCol = np.linspace(0, 1, H)[np.newaxis, :].transpose()
print baseCol.shape, hsls.shape # Gives: (256, 1) (256, 512, 3)
hsls[:, :, 0] = np.tile(baseCol, (1, W))
hsls[:, :, 1:3] = 0.5 # Use constant saturation and lightness.

vfunc = np.vectorize(colorsys.hsv_to_rgb)
rgbs = np.array(vfunc(hsls[:, :, 0], hsls[:, :, 1], hsls[:, :, 2])).transpose()

im = plt.imshow(rgbs, interpolation='nearest', aspect='auto')
plt.colorbar(im, orientation='horizontal')
plt.show()

结果是: transposed image

这看起来几乎是对的,只是它被换了位置。我希望它看起来是逆时针旋转的。但当我用这种方式转换/重塑它时:

^{pr2}$

我得到了一个水平层叠的图像: Horizontally cascaded image

我还使用了resheme()的order参数,但是'F'给出了第一个结果,而'C'给出了第二个结果。在

如何实现我想要的,即逆时针旋转?在


Tags: 代码importasnpplttransposeshapeimshow
2条回答

形状(W, H)的NumPy数组有W行和H列。如果您想要H行和W列,那么数组的形状应该是(H, W)。在

所以使用

hsls = np.zeros((H, W, 3), dtype=float)

我认为其他的一切都会自然而然地(没有翻转或换位)如果 从形状正确的数组hsls开始:

^{pr2}$

收益率

enter image description here

请注意,此结果是您发布的结果的垂直镜像。但是 我可能会想,如果不换图像的话 实际上是你想要的结果。(您看到的图像与 如果要打印hsls,您将看到的数字。左上角 对应于hsls[0,0],而在您的图像中hsls[0,0]对应于 左下角不管勾号怎么说。您可以通过将hsls[:10,:10,:] = 0放在rgbs的定义之前来测试这个断言。您将在hsls[0,0]所在的角落看到一个小的黑色正方形。)


要生成垂直镜像,请调用ax.invert_yaxis()。在

import matplotlib.pyplot as plt
import numpy as np
import colorsys

W = 512
H = 256

hsls = np.zeros((H, W, 3), dtype=float)

baseCol = np.linspace(0, 1, H)
hsls[:, :, 0] = baseCol[:, np.newaxis]
hsls[:, :, 1:3] = 0.5 

vfunc = np.vectorize(colorsys.hsv_to_rgb)
rgbs = np.dstack(vfunc(hsls[:, :, 0], hsls[:, :, 1], hsls[:, :, 2]))

fig, ax = plt.subplots()
im = ax.imshow(rgbs, interpolation='nearest', aspect='auto')
plt.colorbar(im, orientation='horizontal')
ax.invert_yaxis()
plt.show()

收益率

enter image description here

请注意,这也会反转记号标签,显示0从左下角开始。在

我自己想出来的。我可以首先创造出正确的形状。在

import pylab as plt
import numpy as np
import colorsys

W = 512
H = 256

hsls = np.ndarray(shape=(W, H, 3), dtype=float)
hsls[:] = .0

baseCol = np.linspace(0, 1, H)[np.newaxis, :]
print baseCol.shape, hsls.shape # Gives: (256, 1) (256, 512, 3)
hsls[:, :, 0] = np.tile(baseCol, (W, 1))
hsls[:, :, 1:3] = 0.5 # Use constant saturation and lightness.

vfunc = np.vectorize(colorsys.hsv_to_rgb)
rgbs = np.flipud(np.array(vfunc(hsls[:, :, 0], hsls[:, :, 1], hsls[:, :, 2])).transpose())

im = plt.imshow(rgbs, interpolation='nearest', aspect='auto')
plt.colorbar(im, orientation='horizontal')
plt.show()

结果是: enter image description here

相关问题 更多 >

    热门问题