Интерпретация массива numpy, полученного из файла tif

Мне нужно работать с некоторыми файлами tif в оттенках серого, и я использую PIL для их импорта в виде изображений и преобразования их в массивы numpy:

    np.array(Image.open(src))

Я хочу иметь четкое представление о том, чему именно соответствуют значения этого массива, и, в частности, было неясно, какое значение подходит в качестве точки белого или точки черного для моих изображений. Например, если бы я хотел преобразовать этот массив в массив с плавающей запятой со значениями пикселей 1 для белых значений и 0 для черных с линейным масштабированием других значений между ними.

Я пробовал некоторые наивные методы, включая масштабирование по максимальному значению в массиве, но открывая полученные файлы, всегда есть некоторый сдвиг в уровнях цвета.

Есть ли какая-либо документация для правильного понимания значений, хранящихся в этих массивах tif?


person Frank Wang    schedule 10.06.2016    source источник


Ответы (1)


TIFF — это, по сути, формат компьютерного файла для хранения растровых графических изображений. У него много спецификаций, и быстрый поиск в Интернете даст вам ресурсы, которые вам нужны.

Дело в том, что вы используете PIL в качестве входной библиотеки. Массив, который у вас есть, скорее всего, работает с типом данных uint8, что означает, что ваши данные могут быть где угодно в пределах от 0 до 255. Чтобы получить цветовой диапазон от 0 до 1, сделайте следующее:

im = np.array(Image.open(src)).astype('float32')/255

Обратите внимание, что ваш массив, вероятно, будет иметь 4 слоя, заданных в третьем измерении im[:,:, here] (im.shape = (i,j,k)). Таким образом, каждая трассировка im[i,j,:] (которая представляет пиксель) будет квадруплетом для значения RGBA.

R означает красный (или количество красных), G — зеленый, B — синий. A — это альфа-канал, и именно он позволяет вам иметь прозрачность (более низкие значения означают меньшую непрозрачность и большую прозрачность).

Он также может иметь три слоя только для RGB или один слой, если он предназначен для построения в оттенках серого.

В случае, если у вас есть RGB (или RGBA, но без учета альфы), но вам нужно одно значение, вы должны понимать, что существует довольно много разных способов сделать это. В этом сообщении @denis рекомендует использовать следующую формулировку:

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

где гамма 2,2 для многих ПК. Обычный RGB иногда записывается как R'G'B' (R' = Rlin ^ (1/gamma)) (пуристы щелкают языком), но здесь я опускаю '.

И, наконец, L* = 116 * Y ^ 1/3 - 16 для получения яркости.

Рекомендую прочитать его пост. Также рассмотрите возможность изучения следующих понятий:

person armatita    schedule 10.06.2016