在Python中将3个独立的numpy数组组合成RGB图像

hi3rlvi2  于 2022-12-25  发布在  Python
关注(0)|答案(6)|浏览(178)

现在我有了一组数据,我可以把它们转换成独立的R,G,B波段数组,现在我需要把它们组合成一个RGB图像。
我尝试“图像”来做这项工作,但它需要“模式”的属性。
我试着做了一个小把戏。我会使用Image.fromarray()来获取数组到图像,但是当Image.merge需要“L”模式图像来合并时,它默认为“F”模式。如果我首先将fromarray()中的数组属性声明为“L”,所有的R G B图像都会失真。
但是,如果我保存图像,然后打开它们,然后合并,它工作得很好。Image用“L”模式读取图像。
现在我有两个问题。
首先,我认为这不是一种优雅的工作方式,所以如果有人知道更好的工作方式,请告诉我
第二,Image.保存无法正常工作。以下是我遇到的错误:

In [7]: Image.SAVE(imagefile, 'JPEG')
----------------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

/media/New Volume/Documents/My own works/ISAC/SAMPLES/<ipython console> in <module>()

TypeError: 'dict' object is not callable

请提出解决办法。
请注意,图像是大约4000x4000大小的阵列。

0ve6wy6x

0ve6wy6x1#

rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3

也要将浮点数0..1转换为uint8,

rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8)  # right, Janna, not 256
g6ll5ycj

g6ll5ycj2#

我真的不明白你的问题,但这里有一个例子,类似的东西,我最近做了,似乎它可能会有所帮助:

# r, g, and b are 512x512 float arrays with values >= 0 and < 1.
from PIL import Image
import numpy as np
rgbArray = np.zeros((512,512,3), 'uint8')
rgbArray[..., 0] = r*256
rgbArray[..., 1] = g*256
rgbArray[..., 2] = b*256
img = Image.fromarray(rgbArray)
img.save('myimg.jpeg')
mtb9vblg

mtb9vblg3#

rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3

这个代码不会创建三维数组,如果你通过3个通道。2通道保留。

0yg35tkg

0yg35tkg4#

在将numpy数组传递给Image.fromarray之前,将其转换为uint8
例如,如果浮点数在[0..1]范围内:

r = Image.fromarray(numpy.uint8(r_array*255.999))
sz81bmfz

sz81bmfz5#

你的失真我相信是由你的方式造成的分割成单独的波段,然后重新调整大小,然后再把它合并;

`
image=Image.open("your image")

print(image.size) #size is inverted i.e columns first rows second eg: 500,250

#convert to array
li_r=list(image.getdata(band=0))
arr_r=np.array(li_r,dtype="uint8")
li_g=list(image.getdata(band=1))
arr_g=np.array(li_g,dtype="uint8")
li_b=list(image.getdata(band=2))
arr_b=np.array(li_b,dtype="uint8")

# reshape 
reshaper=arr_r.reshape(250,500) #size flipped so it reshapes correctly
reshapeb=arr_b.reshape(250,500)
reshapeg=arr_g.reshape(250,500)

imr=Image.fromarray(reshaper,mode=None) # mode I
imb=Image.fromarray(reshapeb,mode=None)
img=Image.fromarray(reshapeg,mode=None)

#merge
merged=Image.merge("RGB",(imr,img,imb))
merged.show()
`

这个很好用!

dsf9zpds

dsf9zpds6#

如果使用PIL图像,将其转换为数组,然后继续执行以下操作,否则直接使用matplotlib或cv2执行。

image = cv2.imread('')[:,:,::-1]
image_2 = image[10:150,10:100]
print(image_2.shape)

img_r = image_2[:,:,0]
img_g = image_2[:,:,1]
img_b = image_2[:,:,2]

image_2 = img_r*0.2989 + 0.587*img_g + 0.114*img_b 

image[10:150,10:100,0] = image_2
image[10:150,10:100,1] = image_2
image[10:150,10:100,2] = image_2

plt.imshow(image,cmap='gray')

相关问题