asv13
Янв. 13, 2011 13:24:19
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
Янв. 13, 2011 15:07:37
Тогда каким образом можно создать 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
Янв. 13, 2011 15:13:34
Цвета у вас в 16 битах как кодируются?
Levelup
Янв. 13, 2011 15:15:43
я вот это как раз и хотел узнать..
svas
Янв. 13, 2011 15:36:49
Ну я точно не знаю в каком у вас формате изображение. Может 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
Янв. 13, 2011 15:45:40
А как это можно определить по массиву? То есть если дан только 16 битный двумерный массив как-нибудь можно это сделать?
Большое спасибо за предложенный вариант, но он, действительно, медленный. Даже через numpy расчитывать будет медленно, поэтому думаю подгружать массив в opengl, а там уже им оперировать.
asv13
Янв. 14, 2011 05:33:32
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
Янв. 14, 2011 14:29:59
Всем огромное спасибо за информацию. Очень помогли. Буду дальше разбираться.
certanista
Янв. 14, 2011 17:26:42
Subideal Ox
Янв. 28, 2011 10:28:37
Levelup, eсли речь идет о контурном графике, то я бы его делал средствами matplotlib, а не PIL.
Вы что-то такое имеете ввиду
http://matplotlib.sourceforge.net/examples/pylab_examples/griddata_demo.html ?