Levelup
Янв. 12, 2011 15:58:53
Всем доброго времени суток!
На входе имеется 16 битный двумерный массив. Необходимо получить из него изображение,желательно в градации серого. Подскажите, как лучше это реализовать? Попытался сделать через PIL, но что-то странное творится с цветами и яркостью. Не совсем понятно, как работает функция frombuffer, в документации PIL очень мало про неё написано, семантика совсем не разбирается. Очень прошу, подскажите кто что знает.
import numpy
from numpy import indices
from PIL import Image
w = 512
h = 512
i, j = indices()
image = numpy.array()
image.shape=h,w
print image
pilImage = Image.frombuffer('RGBA',(w,h),image)
pilImage.show('my.png')
svas
Янв. 13, 2011 06:14:45
У вас 16 битный массив, а вы создаете RGBA изображение, для которого, насколько я знаю, нужно 32 бита. Что числа в массиве? Значения в градации серого?
Levelup
Янв. 13, 2011 11:09:40
На входе 16 бит RGB. На выходе необходимо получить 8 бит градацию серого. Нужно применить преобразование R = G = B = I/256 (I - исходная интенсивность от 0 до 65535). Когда я применяю RGBA, яркость изменяется правильно - от 0(черный) до 255(самый яркий). Не понятно каким образом формируется цвет выходного изображения. Например в данном случае получаю 2 красных градиентных полосы. Почему именно красные?:
[
…,
]
svas
Янв. 13, 2011 11:21:24
Попробуйте формат изображения ‘L’ а не ‘RGBA’
Андрей Светлов
Янв. 13, 2011 11:33:13
Посмотрите на
import numpy
from numpy import indices
from PIL import Image
w = h = 256
iindices([h,w])
image = numpy.array(i, numpy.uint8)
print image
pilImage = Image.frombuffer('L',(w,h),image)
pilImage.show('my.png')
и определитесь, какие данные в image вам нужны
Levelup
Янв. 13, 2011 11:54:22
image - это тестовый 16 битный массив, то есть в будущем будет поступать определенный 16 битный массив, который необходимо преобразовать в градацию серого 8 бит, выбрав определенный диапазон - то есть 255(Imin-Imax) из всего 65535(I). И соответственно, чтобы было возможно менять значения Imin - Imax на всем I.
Андрей Светлов
Янв. 13, 2011 12:07:20
вот и отмасштабируйте ваш “определенный массив” в “определенный диапазон” так, чтобы все значения помещались в один байт - и наступит счастье.
Масштабировать нужно средствами того же numpy
Levelup
Янв. 13, 2011 12:21:37
Спасибо. А можно ли средствами numpy вырезать кусок из 16 бит массива? Потому что, как я понимаю, уберет детали, которые могут быть важны. Например I = 1024, и I = 1100, и I = 1200 отобразятся в одно и то же значение RGB.
Не могли бы вы привести пример, как можно создать 16 битный массив, чтобы в режиме RGBA получилось разноцветное изображение. У меня выходит только один цвет.
Андрей Светлов
Янв. 13, 2011 12:34:05
Не понимаю вопросов. Преобразовывайте числа как хотите - лишь бы в итоге поместится в байтовый диапазон.
Зачем вам разноцветное изображение, да еще и в RGBA? В начале речь шла о градациях серого.
Levelup
Янв. 13, 2011 12:41:11
Просто не понимаю, как в массиве определяются цвета, почему вот этот отображается красным цветом? Меняется только яркость.
[
…,
]