我想绘制具有特定颜色的numpy
2d矩阵。在示例中,颜色为红色。如果我只使用imshow
,那么它会绘制正确的函数,但会将其绘制为热图颜色。这非常适合查看最大值,最小值等,但我希望将3个图像合并到同一个图像中,并将每个图像隔离为组合图像中的RGB通道。
我没有得到我期望的结果,所以我比较了孤立的R值并尝试使用imshow
,并且显然没有像我刚才那样使用{ {1}}在2D(单通道)矩阵上。造成这种情况的原因是什么?
请注意,我要使用imshow
(不是pylab
,PIL
等 - 我希望使用{{1}在Image
中完成此任务})
以下脚本是我遇到问题的最低示例:
pylab
我在这里列举了一个例子 - 红色图像应该显示与热图图像相同的定性特征,但它显示了某些东西......古怪?
答案 0 :(得分:2)
您不应该from pylab import *
和import numpy as np
。 pylab
由matplotlib.pyplot
和numpy
组成。好的风格是将单个模块导入而不是全部导入全局命名空间。
import numpy as np
import matplotlib.pyplot as plt
imshow
,show
是来自pyplot
的函数,因此您需要在plt.
前添加前缀。 sqr
,exp
等来自numpy
的功能,因此请在np.
前加上
使用numpy.meshgrid
,您可以在没有任何python for
循环的情况下获得一个原子的计算。
n_pixel_x = n_pixel_y = 1000
pixel_x = np.linspace(0.0, 10.0, n_pixel_x)
pixel_y = np.linspace(0.0, 10.0, n_pixel_y)
pixel_x, pixel_y = np.meshgrid(pixel_x, pixel_y)
为每个图像像素提供2个2d阵列,其值为x
和y
。
这简化了单个原子图像的计算:
r = np.sqrt((x - pixel_x)**2 + (y - pixel_y)**2)
single_image = fmax * np.exp(-al * r)
for i in range(N)
访问数组成员,那么您做错了" 使用zip
功能:
n_atoms = 4
atoms_x = np.random.uniform(0, 10, n_atoms)
atoms_y = np.random.uniform(0, 10, n_atoms)
atoms_al = np.random.uniform(0, 10, n_atoms)
for x, y, al in zip(atoms_x, atoms_y, atoms_al):
r = np.sqrt((x - pixel_x)**2 + (y - pixel_y)**2)
single_image = fmax * np.exp(-al * r)
image += single_image
plt.imshow()
命令使用colormap
呈现二维数组
是一个将2d数组的值转换为颜色的函数。
默认色图是jet
,它提供了这种彩虹形状。
对于简单的灰度图像,其他有用的色图为gray
,对于黑体辐射,其他有用的色图为hot
。
gray
在我看来适合显示单一颜色通道。
plt.imshow(image, cmap='gray)
此处显示所有可用的色彩映射:http://matplotlib.org/examples/color/colormaps_reference.html
如果给plt.imshow
一个RGB数组(所以一个数组的形状为(x,y,3)),matplotlib希望这些值在[0,1]中。所以你必须在绘制之前对它们进行标准化。
image_rgb = np.zeros([n_pixel_x, n_pixel_y, 3])
# normalize the image to values in [0, 1]
normalized_image = (image - image.min()) / (image.max() - image.min())
image_rgb[:, :, 0] = normalized_image
plt.imshow(image_rgb)
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
def normalize_image(image):
a = np.min(image)
b = np.max(image)
return (image - a) / (b - a)
n_pixel_x = n_pixel_y = 1000
pixel_x = np.linspace(0.0, 10.0, n_pixel_x)
pixel_y = np.linspace(0.0, 10.0, n_pixel_y)
pixel_x, pixel_y = np.meshgrid(pixel_x, pixel_y)
fmax = 4000.0
image_rgb = np.zeros([n_pixel_x, n_pixel_y, 3])
for i in range(3):
image = np.zeros([n_pixel_x, n_pixel_y])
n_atoms = 4
atoms_x = np.random.uniform(0, 10, n_atoms)
atoms_y = np.random.uniform(0, 10, n_atoms)
atoms_al = np.random.uniform(0, 10, n_atoms)
for x, y, al in zip(atoms_x, atoms_y, atoms_al):
r = np.sqrt((x - pixel_x)**2 + (y - pixel_y)**2)
single_image = fmax * np.exp(-al * r)
image += single_image
image_rgb[:, :, i] = image
plt.figure(figsize=(10, 10))
plt.subplot(2, 2, 1)
plt.title('RGB')
plt.imshow(normalize_image(image_rgb))
plt.subplot(2, 2, 2)
plt.title('R')
plt.imshow(image_rgb[:, :, 0], cmap='gray')
plt.subplot(2, 2, 3)
plt.title('G')
plt.imshow(image_rgb[:, :, 1], cmap='gray')
plt.subplot(2, 2, 4)
plt.title('B')
plt.imshow(image_rgb[:, :, 2], cmap='gray')
plt.tight_layout()
plt.show()