在Pylab中隔离颜色通道的问题

时间:2015-09-26 14:51:36

标签: python numpy

我想绘制具有特定颜色的numpy 2d矩阵。在示例中,颜色为红色。如果我只使用imshow,那么它会绘制正确的函数,但会将其绘制为热图颜色。这非常适合查看最大值,最小值等,但我希望将3个图像合并到同一个图像中,并将每个图像隔离为组合图像中的RGB通道。

我没有得到我期望的结果,所以我比较了孤立的R值并尝试使用imshow,并且显然没有像我刚才那样使用{ {1}}在2D(单通道)矩阵上。造成这种情况的原因是什么?

请注意,我要使用imshow(不是pylabPIL等 - 我希望使用{{1}在Image中完成此任务})

以下脚本是我遇到问题的最低示例:

pylab

我在这里列举了一个例子 - 红色图像应该显示与热图图像相同的定性特征,但它显示了某些东西......古怪?

enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

前面的一些事情

进口

您不应该from pylab import *import numpy as nppylabmatplotlib.pyplotnumpy组成。好的风格是将单个模块导入而不是全部导入全局命名空间。

import numpy as np
import matplotlib.pyplot as plt

imshowshow是来自pyplot的函数,因此您需要在plt.前添加前缀。 sqrexp等来自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阵列,其值为xy。 这简化了单个原子图像的计算:

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,对于黑体辐射,其他有用的色图为hotgray在我看来适合显示单一颜色通道。

plt.imshow(image, cmap='gray)

此处显示所有可用的色彩映射:http://matplotlib.org/examples/color/colormaps_reference.html

为什么使用RGB图像与显示2d-Array不同?

如果给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)

使用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()

结果: result