在Python中将3个独立的numpy数组合并为RGB图像
image
image-processing
numpy
python
5
0

因此,我有一组数据,可以转换为R,G,B波段的单独的numpy数组。现在,我需要将它们组合以形成RGB图像。

我尝试使用“图像”来完成这项工作,但需要将“模式”归因于此。

我试图做个把戏。我将使用Image.fromarray()将数组转换为图像,但是当Image.merge要求将“ L”模式图像合并时,默认情况下它将达到“ F”模式。如果我首先将fromarray()中array的属性声明为'L',则所有RGB图像都会失真。

但是,如果我保存图像然后打开它们然后合并,则效果很好。图像以“ L”模式读取图像。

现在我有两个问题。

首先,我不认为这是一种优雅的工作方式。所以,如果有人知道更好的方法,请告诉

其次,Image.SAVE无法正常工作。以下是我遇到的错误:

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。

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

我不太了解您的问题,但以下是我最近做过的类似事例,似乎对您有所帮助:

# 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')

希望对您有所帮助

收藏
评论

我认为您的失真是由您将原始图像分割成各个频段,然后在将其合并之前再次调整其大小引起的;

`
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()
`

这很好用!

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

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

rgb_uint8 = (np.dstack((r,g,b)) * 255.999) .astype(np.uint8)  # right, Janna, not 256
收藏
评论
rgb = np.dstack((r,g,b))  # stacks 3 h x w arrays -> h x w x 3

如果您传递3个通道,则此代码不会创建3d数组。剩下2个频道。

收藏
评论

在将numpy数组传递给Image.fromarray之前,将其转换为uint8

例如。如果浮点数在[0..1]范围内:

r = Image.fromarray(numpy.uint8(r_array*255.999))
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号