Найти - Пользователи
Полная версия: Изображение из массива.
Начало » Python для экспертов » Изображение из массива.
1 2 3
asv13
Levelup
Просто не понимаю, как в массиве определяются цвета
Каждое значение в массиве раскладывается декодером RGBA на четыре числа.

x, y = 511, 510
print ‘data=’, image
print ‘colour=’,pilImage.getpixel((x,y))

data= 260610
colour= (255, 1, 0, 0)

Собственно такой исходный массив, наверное малые диапазон даёт больше первого - красного цвета

Вот вам зеленые цвета -
image = numpy.array()

Или синие -
image = numpy.array()
Levelup
Тогда каким образом можно создать 8 битный массив, из которого можно получить разноцветное изображение. Я так понимаю RGBA и RGB используется только для 32 бит.
В данном случае выдает ошибку ValueError: buffer is not large enough, если меняю на uint32, то получаю изображение. Тогда какой режим использовать в данном случае, чтобы получить цветное изображение?

w = h = 512
i, j = indices()
image = i*j
image = (image*65535.0/image.max()).astype(uint16)
image = 65536

print image

pilImage = Image.frombuffer('RGBA',(w,h),image)
pilImage.show('my.png')
svas
Цвета у вас в 16 битах как кодируются?
Levelup
я вот это как раз и хотел узнать..
svas
Ну я точно не знаю в каком у вас формате изображение. Может 5-6-5
Могу предложить такой вариант, но он наверное медленный
im = Image.new('L', (w, h))
#в numbers наши цвета
for i in range(w):
for j in range(h):
r = numbers[i*w+h] & 0x1f
g = (numbers[i*w+h] >> 5) & 0x3f
b = (numbers[i*w+h] >> 11) & 0x1f
im.putpixel((i,j), int(round(0.2125*r + 0.7154*g + 0,0721*b)))
Levelup
А как это можно определить по массиву? То есть если дан только 16 битный двумерный массив как-нибудь можно это сделать?
Большое спасибо за предложенный вариант, но он, действительно, медленный. Даже через numpy расчитывать будет медленно, поэтому думаю подгружать массив в opengl, а там уже им оперировать.
asv13
import numpy as np
from PIL import Image

def f(i,j):
return i**2 + j**2

w, h = 512, 512
image = np.fromfunction(f, (w, h))+10000
b1, b2 = np.min(image), np.max(image)
print 'array min max =', b1, b2
image = (image-b1)/(b2-b1)*255
print 'new min max =', np.min(image), np.max(image)
image = np.array(image, dtype=np.uint8)
pilImage = Image.frombuffer('L', (w,h), image)
pilImage.show('my.png')
Levelup
Всем огромное спасибо за информацию. Очень помогли. Буду дальше разбираться.
certanista
http://ru.wikipedia.org/wiki/X_Pixmap вот это можно попробовать.
Subideal Ox
Levelup, eсли речь идет о контурном графике, то я бы его делал средствами matplotlib, а не PIL.

Вы что-то такое имеете ввиду http://matplotlib.sourceforge.net/examples/pylab_examples/griddata_demo.html ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB