@krekerov
Fullstack ninja

Что означает 16-bit signed integer image с параметром VALID RANGE -100–16000?

Приветствую. Делаю свою амбициозную штуку.
Никак не могу осмыслить, что означает 16-bit signed integer image с параметром VALID RANGE -100–16000.
У меня есть изображение, которое читаю в Python.

Значения выводятся следующие:

[[7578 7578 5873 ..., 3000 3000 3188]
[6503 7578 7435 ..., 2906 2978 2925]
[6876 7330 7330 ..., 3053 2781 2790]
...,
[8396 8240 8240 ..., 9258 9258 9180]
[8319 8319 8240 ..., 9589 9654 9689]
[8313 8353 8347 ..., 9855 9885 9891]]
  • Вопрос задан
  • 3342 просмотра
Пригласить эксперта
Ответы на вопрос 3
@radioxoma
Продолжая тему. Я сталкивался, по большей части, с медицинскими изображениями. От обычных фотографий до многомерных объёмных стеков. С ГИС особо не работал, можно начать отсюда.

То изображение, которое вы представили, является одноканальным. Его ещё могут называть серым (градации серого), полутоновым (grayscale). Каждый канал это просто матрица точек с разными интенсивностями. Вы сами привели пример. Чтобы получить цветное изображение, требуется три канала. См. RGB. Привычные нам фотографии имеют три канала в цветовой схеме RGB, каждый из которых содержит данные в uint8. Четвёртый канал (альфа-канал) добавляется для получения прозрачности, когда изображения накладывается друг на друга. Цветовые пространства и их математическое представление довольно обширная тема, обратитесь к литературе. Можно начать с RGB.

А теперь то, о чём вы спрашивали.

uint16 представляет 216 = 65536 (0...65535) возможных значений пиксела изображения. int16 то же самое, только отсчёт идёт не от нуля, а от -32768 до 32767.
uint8 представляет 28 = 256 (0...255) возможных значений, по аналогии. Для обработки изображений удобнее unsigned int, так как положительные значения естественны: матрица камеры получает свет различной интенсивности (положительные значения) или его отсутствие (ноль). Так устроен АЦП фотоматрицы.

Получается, что uint16 позволяет хранить больше (чем uint8) данных в одном пикселе (ячейке матрицы). В 65536/256 = 256 раз больше. Возникает вопрос: есть ли у вас данные, требующие такого диапазона? А если есть, то что вы с ними будете делать? Обрабатывать конечно лучше с большей точностью. А вот отображать всё равно придётся в uint8 на канал. Монитор не отобразит все 16 бит, не все форматы изображений такую глубину поддерживают, как поведёт себя браузер не имею понятия.

Резюме: обрабатывать с максимальной точностью. Картинки для браузера конечного пользователя отдавать в восьмибитном jpg (если не страшны артефакты) или png (если нужна прозрачность или максимальная сохранность данных).
Ответ написан
Комментировать
@radioxoma
Уточните вопрос. Signed short int, разве нет?

У вас двухмерный массив, каждый элемент массива имеет C-подобный (си-подобный) тип. В отличие от unsigned, каждый элемент может быть ещё и отрицательным, хотя обычно для обработки изображений с отрицательными значениями не работают.

Откуда данные получаете? Рентгеновские снимки?
Ответ написан
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Смотря какую обработку вы выполняете. Если всё ужать в 256 значений и вам будет этого достаточно для результата, то так и делайте.
Если точность теряется больше чем нужно, то переводите в целые 16 битные числа и работайте с такой разрядностью.
Я пологаю, что диапазон -100..0 не имеет особого физического смысла? Если имеет, то его можно выделить в отдельное изображение, например. Или принять тупо нулями, если они вообще не критичны для обработки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы