Найти - Пользователи
Полная версия: Изображение из массива.
Начало » Python для экспертов » Изображение из массива.
1 2 3
Levelup
Всем доброго времени суток!
На входе имеется 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
У вас 16 битный массив, а вы создаете RGBA изображение, для которого, насколько я знаю, нужно 32 бита. Что числа в массиве? Значения в градации серого?
Levelup
На входе 16 бит RGB. На выходе необходимо получить 8 бит градацию серого. Нужно применить преобразование R = G = B = I/256 (I - исходная интенсивность от 0 до 65535). Когда я применяю RGBA, яркость изменяется правильно - от 0(черный) до 255(самый яркий). Не понятно каким образом формируется цвет выходного изображения. Например в данном случае получаю 2 красных градиентных полосы. Почему именно красные?:

[


…,


]
svas
Попробуйте формат изображения ‘L’ а не ‘RGBA’
Андрей Светлов
Посмотрите на
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
image - это тестовый 16 битный массив, то есть в будущем будет поступать определенный 16 битный массив, который необходимо преобразовать в градацию серого 8 бит, выбрав определенный диапазон - то есть 255(Imin-Imax) из всего 65535(I). И соответственно, чтобы было возможно менять значения Imin - Imax на всем I.
Андрей Светлов
вот и отмасштабируйте ваш “определенный массив” в “определенный диапазон” так, чтобы все значения помещались в один байт - и наступит счастье.
Масштабировать нужно средствами того же numpy
Levelup
Спасибо. А можно ли средствами numpy вырезать кусок из 16 бит массива? Потому что, как я понимаю, уберет детали, которые могут быть важны. Например I = 1024, и I = 1100, и I = 1200 отобразятся в одно и то же значение RGB.
Не могли бы вы привести пример, как можно создать 16 битный массив, чтобы в режиме RGBA получилось разноцветное изображение. У меня выходит только один цвет.
Андрей Светлов
Не понимаю вопросов. Преобразовывайте числа как хотите - лишь бы в итоге поместится в байтовый диапазон.

Зачем вам разноцветное изображение, да еще и в RGBA? В начале речь шла о градациях серого.
Levelup
Просто не понимаю, как в массиве определяются цвета, почему вот этот отображается красным цветом? Меняется только яркость.
[


…,


]
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