Вопрос по image, image-processing, python, numpy – Объедините 3 отдельных массива с NGB-изображениями в Python

32

Таким образом, у меня есть набор данных, которые я могу преобразовать в отдельные массивы R, G, B. Теперь мне нужно объединить их, чтобы сформировать изображение RGB.

Я пробовал "Изображение" чтобы выполнить работу, но для этого требуется «режим»; быть приписанным.

Я пытался сделать трюк. Я бы использовал Image.fromarray (), чтобы перевести массив в изображение, но он достигает «F»; режим по умолчанию, когда Image.merge требует «L»; режим изображения для слияния. Если бы я объявил атрибут массива в fromarray () как «L» во-первых, все изображения R G B искажаются.

Но если я сохраню изображения, а затем открою их и затем объединю, все будет работать нормально. Изображение считывает изображение с «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.

Ваш Ответ

4   ответа
47

но вот пример чего-то похожего, что я недавно сделал, и похоже, что это может помочь:

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

Надеюсь, это поможет

@IshanTomar - вы можете принять этот ответ, если он был полезен.
Большое спасибо! Это работает Ishan Tomar
Если вы хотите сохранить массив как изображение, оно должно быть "toimage"
@IshanTomar, вы действительно должны принять самые полезные ответы, это важная часть того, что держит StackOverflow тикает
Спасибо ребята спасибо за ответ Ishan Tomar
2

что ваше искажение вызвано тем, как вы разделяете исходное изображение на отдельные полосы, а затем снова изменяете его размер, прежде чем объединить;

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

это работает хорошо!

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

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

uint8 прежде чем передать ихImage.fromarray

Например. если у вас есть поплавки в диапазоне [0..1]:

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

Похожие вопросы