将三个 2D numpy 数组转换为 RGB 堆叠图像

问题描述 投票:0回答:2

我有三个大型二维高程数据数组 (5707,5953),每个数组都是在不同的基线处获取的。我已经使用例如一个规范化了数组:

normalize = (eledata-np.mean(eledata))/np.std(eledata)

我在网上阅读过,我的数组中的每个数据点似乎都需要有一个 0-255 之间的值,才能根据字节限制为其分配一个 RGB 颜色值。从我可以在网上拼凑的内容来看,我有点卡在这里,并且已经尝试过但是一直在循环中出现不同的错误。我在网上看到的所有其他指南都有一个用零填充的基本数组,这让我的大数组感到困惑。以下是我尝试使用 PIL、astropy、opencv 库的一些不同方法。我对任何一个都没有偏好,只是对这种情况最简单的使用。

normalize[:,:,0] = normalize*64/255.0
normalize[:,:,1] = normalize*128/255.0
normalize[:,:,2] = normalize*192/255.0
cv2.imwrite('C://User/Downloads/color_img.jpg', normalize)
cv2.imshow("image", normalize)
cv2.waitKey()
def rescale(arr):
     arr_min = arr.min()
     arr_max = arr.max()
     return (arr - arr_min) / (arr_max - arr_min)

red_arr_b = 255.0 * rescale(diff)
green_arr_b = 255.0 * rescale(diff2)
blue_arr_b = 255.0 * rescale(diff3)
img = Image.fromarray(arr.astype(int), 'RGB')
image = make_lupton_rgb(normalize1,normalize2,normalize3)
plt.show(image)

当我在上面的代码中完成 plot show 时,它只返回一个空图,其中包含我设置的 x 和 y 范围。我也试过 np.dstack,但它似乎没有提供有意义的数据,而且文档很短。

rgb = np.dstack((normalize1,normalize2,normalize3))

我可以尝试制作三个数组,一个在 R 中,一个在 G 中,一个在 B 中,然后将它们堆叠在另一个之上?

python opencv python-imaging-library numpy-ndarray rgb
2个回答
0
投票

在将数据转换为图像之前如何预处理数据太重要了。在我提供的代码中,我生成了假数据并将其缩放到范围

[0, 255]

import numpy as np
from PIL import Image
data = np.random.randn(5707, 5953, 3)
data = 255*(data - data.min())/(data.max()-data.min() + 1e-9)
data = np.clip(data, 0, 255).astype(np.uint8)
img = Image.fromarray(data)
img.save("img.png")
plt.imshow(img)

注意如果有异常值,前面的代码将给出暗图像,因为大多数值将接近于零。所以正如我所说,首先对数据进行预处理很重要,例如将数据保留在分位数中

[q5, q95]


0
投票

也许我误解了这个问题/问题,但你能不能只使用 Numpy 堆栈然后乘以 255 并转换为 uint8?

result = (255*np.stack((normalize1,normalize2,normalize3))).clip(0,255).astype(np.uint8)
© www.soinside.com 2019 - 2024. All rights reserved.