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

cnh2zyt3  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(164)

我有三个大的2D高程数据数组(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中,然后将它们堆叠在另一个上面吗?

***UPDATE***我尝试了两种解决方案的合并,但现在我遇到了一个问题,因为图像是一种奇怪的蓝色,即使我的限制设置为0,255,这种颜色似乎接管。变量diff,diff 2和diff 3是我一直在谈论的(5705,5953)数组。在result和im中都有 *255不是重复的吗?

diff = simslope(data_nan,2,pixsize) - simslope(data_nan,4,pixsize)
diff2 = simslope(data_nan,4,pixsize) - simslope(data_nan,8,pixsize)
diff3 = simslope(data_nan,8,pixsize) - simslope(data_nan,16,pixsize)

normdiff = (diff-np.nanmean(diff))/np.nanstd(diff)
normdiff2 = (diff2-np.nanmean(diff2))/np.nanstd(diff2)
normdiff3 = (diff3-np.nanmean(diff3))/np.nanstd(diff3)
data = (normdiff - np.nanmin(normdiff))/(np.nanmax(normdiff)-np.nanmin(normdiff) + 1e-9)
data2 = (normdiff2 - np.nanmin(normdiff2))/(np.nanmax(normdiff2)-np.nanmin(normdiff2) + 1e-9)
data3 = (normdiff3 - np.nanmin(normdiff3))/(np.nanmax(normdiff3)-np.nanmin(normdiff3) + 1e-9)
result = (255*np.stack((data,data2,data3))).clip(0,255).astype(np.uint8)
im = Image.fromarray((result[0]*255).clip(0,255).astype(np.uint8)) 
im.save("C://Users/Downloads/img.png")
plt.imshow(im,vmin=np.nanmin(im),vmax=np.nanmax(im))

yvfmudvl

yvfmudvl1#

在将数据转换为图像之前,如何预处理数据非常重要。

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)

注意,如果有异常值,前面的代码将给予暗图像,因为大多数值将接近零。

ryhaxcpt

ryhaxcpt2#

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

result = (255*np.stack((normalize1,normalize2,normalize3))).clip(0,255).astype(np.uint8)

相关问题