gpt4 book ai didi

python - 在 Pylab 中隔离颜色 channel 的问题

转载 作者:行者123 更新时间:2023-12-01 04:28:10 24 4
gpt4 key购买 nike

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

我没有得到我所期望的结果,所以我比较了孤立的 R 值,并尝试使用 imshow 与它,显然没有得到与我只使用 时相同的结果2D(单 channel )矩阵上的 >imshow。这是什么原因造成的?

请注意,我想使用 pylab (不是 PILImage 等) - 我想在 pylab使用imshow)

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

#!/usr/bin/env python

import numpy as np
from pylab import *

nn = 1000
nx = nn
ny = nn
xs = np.linspace(0.0, 10.0, nx)
ys = np.linspace(0.0, 10.0, ny)

fs = np.zeros([nx,ny])

fmax = 4000.0

natoms = 4
Xs = 10.0*random(natoms)
Ys = 10.0*random(natoms)
als = 10.0*random(natoms)
for ix in range(nx):
x = xs[ix]
for iy in range(ny):
y = ys[iy]
fv = 0.0
for iat in range(natoms):
X = Xs[iat]
Y = Ys[iat]
r = sqrt( (X-x)*(X-x) + (Y-y)*(Y-y) )
al = als[iat]
fv += fmax*exp( -al*r )
fs[ix,iy] = fv

figure(1)
imshow(fs)

figure(2)
A = np.zeros([nx, ny, 3])
A[:,:,0] = np.copy(fs)
imshow(A)

show()

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

enter image description here enter image description here

最佳答案

前面的一些事情

导入

您不应该执行 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 渲染二维数组,这是将二维数组的值转换为颜色的函数。

默认颜色图是 jet,它给出了彩虹形状。其他有用的颜色图是用于简单灰度图像的gray或用于黑体辐射的hot。我认为灰色适合显示单一颜色 channel 。

plt.imshow(image, cmap='gray)

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

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

如果给 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 channel :

#!/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

关于python - 在 Pylab 中隔离颜色 channel 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com