Отображение RGB с использованием np.newaxis с расширением от (:,:, 1) до (:,:, 3) - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь взять то, что изначально является списком «ThetaVect1», который превращается в np.ndarray, который имеет форму (16,), изменяя его на (4,4) массив, а затем используя np. newaxis, чтобы получить третье измерение, которое я пытаюсь установить, чтобы быть 3, но не могу понять, как.

Смысл в том, что, как только я это сделаю, я могу добавить окраску к своим изображениям в оттенках серого на основе случайных чисел np.random.randint (0,255), которые различаются для каждого «пикселя». Поэтому, хотя я могу получить печать (Greyscale_Theta1_RGB.shape) = (4,4,1), я не могу получить ее в формате (4,4,3). Я считаю, что это то, что нужно сделать.

Я пытаюсь работать через следующую идею здесь

Greyscale_ThetaVect1 = np.array(ThetaVect1,dtype=np.uint8)
print(Greyscale_ThetaVect1.shape)
Greyscale_Theta1 = np.reshape(Greyscale_ThetaVect1, (-1, 4))

Greyscale_Theta1_RGB = Greyscale_Theta1[:,:,None]
# Greyscale_Theta1_RGB [:,:,0] = np.random.randint(0,255)
# Greyscale_Theta1_RGB [:,:,1] = np.random.randint(0,255)
# Greyscale_Theta1_RGB [:,:,2] = np.random.randint(0,255)

print(Greyscale_Theta1_RGB.shape)

save_file = "CM.jpg"
i = Image.fromarray(Greyscale_Theta1).save(save_file)

i = Image.open("CM.jpg")
i.show()

EDIT

Используя отличный ответ Марка Сетчелла вместе с принятым ответом здесь Я пытаюсь поместить случайные цвета в массив 2-D изображения. Я получил что-то, используя этот код:

for k,l in enumerate(rgb):
    print(l)
    rgb[k] = l * [random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)]

Это не совсем правильно, так как вначале видны черные линии и черная полоса. Изображение увеличено, чтобы показать прямые черные линии.

enter image description here

Я также убрал градиент, изменив f на: f = lambda i, j: int((128)) и смог получить это интересное изображение, хотя обратите внимание, что вместо него есть не пиксели, а линии.

enter image description here

1 Ответ

2 голосов
/ 16 мая 2019

Просто добавьте комментарий к комментарию от @hpaulj ...

Просто скопируйте и добавьте фрагменты кода ниже, чтобы изображения не перемежались, чтобы получить один работающий кусок кода.

Я думаю, что у вас есть изображение в оттенках серого, которое вы хотите аннотировать в цвете, но не можете понять, как превратить его в изображение RGB, а также, возможно, сохранить уже имеющиеся значения серого.

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Define width and height big enough to see
w,h = 256,100

# Make left-right gradient of greyscale values - without going to pure white so you can see the extent on StackOverflow's white background
f = lambda i, j: int((j*192)/w)
gg = np.fromfunction(np.vectorize(f), (h,w)).astype(np.uint8)

Это дает нам одноканальное изображение в градациях серого:

enter image description here

# Replicate greyscale and stack to make RGB image where R=G=B
rgb = gg[:,:,np.newaxis].repeat(3,2)

# If you find the above syntax difficult, here is an alternative
# ... stack the grey image 3 times in the "depth" dimension
# rgb = np.dstack((gg,gg,gg))

# DEBUG: Save image
Image.fromarray(rgb).save('result1.png')

Это дает нам это изображение RGB:

enter image description here

# DRAWING PART
# Make top edge red 10px wide
rgb[:10,:,:]=[255,0,0]

# Make left border green 20px wide
rgb[:,:20,:]=[0,255,0]

# Make right border blue 30px wide
rgb[:,:-30:-1,:]=[0,0,255]

# DEBUG: Save image
Image.fromarray(rgb).save('result2.png')

enter image description here

Если вы хотите нарисовать или раскрасить изображение, используя PIL, а не Numpy, удалите следующий код«ЧЕРТЕЖНАЯ ЧАСТЬ» выше и заменить следующим:

from PIL import ImageDraw 

# Make PIL Image from numpy array
rgb = Image.fromarray(rgb)

# Get drawing handle and draw magenta circle and save
draw = ImageDraw.Draw(rgb)
draw.ellipse([10,10,90,90],fill=(255,0,255))
rgb.save('result.png')

enter image description here


Если вы просто хотите случайное изображение 700x300:

import numpy as np
from PIL import Image

# Generate a random image 700x300 
im = np.random.randint(0,256,(300,700,3), dtype=np.uint8)                                  

# Make into PIL Image, display and save
p = Image.fromarray(im)
p.display()
p.save('result.png')

enter image description here

Если вы хотите сделать случайное изображение поверх градиента, вы можете сделать это:

import numpy as np
from PIL import Image

# Generate a random image 700x300 
im = np.random.randint(0,256,(300,700,3), dtype=np.uint8) 

gradient = np.linspace(0,1,700,dtype=np.float32) + np.zeros(300)[:, None] 
im = im*np.dstack((gradient,gradient,gradient)) 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...