Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод 16 бит на пиксел как сделать ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
whale_nik
Всем привет!
Есть вопрос, имеется массив данных, каждое данное размером в два байта те 1024,
нужно вывести картинку из этих данных, и чтобы каждый пиксель отображал всю градацию 0-1024.
Как такое можно сделать ? Желательно в желтом цвете )
Знаю формат pf24bit но там на каждый цвет только то байту....
На крайний случай можно в сером.
Прогаю в Buildere
_pv
куда вывести-то?
во-первых обычные мониторы даже 8 бит нормально-то не отображают, а во-вторых далеко не каждый увидит разницу яркости в 0.5%, а уж тем более в градациях жёлтого цвета.


увеличьте картинки да посмотрите, каждую ли ступеньку видно?

ну а чтобы отобразить 10 бит, делите на 4 или логарифмируйте.
whale_nik
Вывод на монитор, теоретически вывести возможно и как это практически на си ?
Поделить и логарифмировать всегда успеется, данные при этом теряются.
Данные с гидролокатора и у них дин диапазон 10 бит, если выводить в 8 бит тот теряется мелкий рисунок
А что это за картинки ?
_pv
практически на С:

glfwWindowHint(): GLFW_RED_BITS, GLFW_GREEN_BITS, GLFW_BLUE_BITS
или GLFWvidmode в полноэкранном режиме так как у операционной системы тоже может быть своё мнение по поводу глубины цвета окон.

ну и WGL_ARB_pixel_format

а картинки - верхняя просто 16х16=256 серых квадратов. чтобы увидеть границы между соседями приходится под разными углами на монитор смотреть (бюджетная версия изменения динамического диапазона lcd монитора sm.gif ), да и то все не видно.

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

hdmi до каких-то недавних версий вроде имел 3 канала и 8b/10b и пиксельклок в 10 раз меньше, то есть даже в этом месте оно гвоздями к 8ми битам на цвет приколочено было.

хотя сейчас наверное маркетологи помимо разрешений в 4К, 60fps и до цвета добраться уже должны были.
whale_nik
У меня верхняя картина отлично все видно и монитор бюджетнее некуда.
в OpenGL не силен, а есть вариант поближе в винде и железу ?
Действительно надо попробовать какие вариацие серого еще заметны глазом на хорошем мониторе /телике
У меня счас формат PixelFormat=pf24bit все понятно три байта каждый отвечает за свой цвет а всякие стороние библиотеки ноги сломаешь пока чего нить получишь
_pv
если данные только с одной компонентой, то надо просто в разные цвета раскрасить.

whale_nik
В разных цветах очень плохо получается опознать что там вообще нарисовано кроме новогодней елки )
Самое лучшее - желтый, хуже серый, далее синий, цветной самое ужасное что можно сделать.
Данные - просто амплитуда отраженного сигнала в 10 битах
_pv
контурные линии добавте, может поможет.
ну а не видя картинки сложно что-то советовать.


Цитата
У меня верхняя картина отлично все видно и монитор бюджетнее некуда.

Вы ведь понимаете что там не 16 горизонтальных полос надо увидеть, а вертикальных. Различие между двумя соседними квадратами по горизонтали. Именно они на 1/256 по яркости отличаются, и увидеть и в тёмной и в светлой части картинки.

Ну правда у меня ещё десятый виндовс что-то с настройками яркости монитора нехорошее сделал.
whale_nik
Квадратики видно, 1/512 было бы наверно предел.
Картинка такая https://yadi.sk/d/wViaBAVG3LkeRh
_pv
raw бы 10ти битный, чтобы понять разницу.
jcxz
Цитата(whale_nik @ Aug 6 2017, 15:19) *
в OpenGL не силен, а есть вариант поближе в винде и железу ?

Откройте справочник по WinAPI, в нём поиск по BitBlt (и др.функции этого семейства), а также - функции рисования. Создёте плоскость в памяти, рисуете на ней, а потом при помощи BitBlt или PatBlt, ... копируете картинку в экранную плоскость.
whale_nik
Цитата(jcxz @ Aug 6 2017, 20:36) *
Откройте справочник по WinAPI, в нём поиск по BitBlt (и др.функции этого семейства), а также - функции рисования. Создёте плоскость в памяти, рисуете на ней, а потом при помощи BitBlt или PatBlt, ... копируете картинку в экранную плоскость.


Каким образом тут 10 бит на пиксель ?

Цитата(_pv @ Aug 6 2017, 19:00) *
raw бы 10ти битный, чтобы понять разницу.


Пардон ) raw нет в природе тк данные сразу пишутся в gBitmap->PixelFormat=pf24bit; и сохраняются в bmp
тк пока на пиксель 8 бит то приходиться вводить логарифмическую шкалу, те на "верхах" детализация почти отсутствует (
На картинке почти везде "низы" если появиться хорошо отражающий объект то теряется структура.

Короче, я так понял придется создавать свой gBitmap с двумя байтами на монохромный пиксель и выводить своей же программой которая сможет его причитать.
jcxz
Цитата(whale_nik @ Aug 7 2017, 00:10) *
Каким образом тут 10 бит на пиксель ?

Там можно и больше бит получить, не только 10. В цвете конечно.

Цитата(_pv @ Aug 6 2017, 02:54) *
во-первых обычные мониторы даже 8 бит нормально-то не отображают, а во-вторых далеко не каждый увидит разницу яркости в 0.5%, а уж тем более в градациях жёлтого цвета.

А нужны ли эти 10 бит на экране? Зачем реально нужно отображать одновременно и самые яркие и самые тёмные участки?
Т.е. - если на картинке есть яркие участки (как я понимаю - эхо от ближайших объектов), и при этом есть тёмные участки (от дальних объектов) - так ли реально нужно их отображать вместе?
У автора же интерактивное отображение, а не картинка сохраняемая в файл.
Сделать скажем отображение только 64 уровня яркости (или 32 - сколько удобно). Младшие биты отбросить - эти участки будут отображаться чёрным. Если пользователь хочет заглянуть вглубь этих чёрных участков - он жмёт кнопку "приблизить" - старшие биты яркости постепенно отбрасываются (яркие участки соответствующие им маскируются на экране каким-то специальным шаблоном/цветом), но проступают, становятся ярче тёмные участки - глубинные слои.
Как то так.
whale_nik
Так я и говорю придется делать свою программу на "приблизить".
10 бит еще нужны чтобы применять различные алгоритмы обработки а не только чтобы вывести на экран сразу все.

Вот допустим как сделать gBitmap c 16 монохромными битами на пиксель ? Кто его сможет прочитать , вывести на экран пусть даже с 8 битами ?
Вообще конечно подробно рассматривают уже потом, в записи.
jcxz
Цитата(whale_nik @ Aug 7 2017, 10:50) *
Так я и говорю придется делать свою программу на "приблизить".

И это правильно rolleyes.gif

Цитата(whale_nik @ Aug 7 2017, 10:50) *
Вот допустим как сделать gBitmap c 16 монохромными битами на пиксель ? Кто его сможет прочитать , вывести на экран пусть даже с 8 битами ?

Вот именно эта ваша программа и сможет.
Димыч
Цитата(whale_nik @ Aug 6 2017, 00:46) *
Всем привет!
Есть вопрос, имеется массив данных, каждое данное размером в два байта те 1024,
нужно вывести картинку из этих данных, и чтобы каждый пиксель отображал всю градацию 0-1024.
Как такое можно сделать ? Желательно в желтом цвете )
Знаю формат pf24bit но там на каждый цвет только то байту....
На крайний случай можно в сером.
Прогаю в Buildere


Со стороны "хардвера" Вам нужна такая видеокарта:
10/12-bit NVidia Graphic cards

и такой монитор:
10-bit NEC monitor

(и это ещё не самые дорогие решения).

16 бит grayscale - это вряд ли. Хотя, у Вас небольшая путаница в исходных данных: 2 байта - это же никак не 1024 sm.gif
_pv
сохраняйте например в PNG который 16бит на цвет поддерживает, а потом "приблизить" можно в любом просмотрщике картинок, irfanview например (или через imagemagic преобразовать), покрутив яркость/контраст.
однако на вашей картинке шумы такие, что отлогорифмированные 10 бит в 8 ничего там не испортят.
честно отображать 10бит далеко не каждый монитор умеет, не говоря про то что заметна эта разница только на картинках с очень плавными градиентами, без шумов.


Цитата(Димыч @ Aug 7 2017, 16:23) *
Со стороны "хардвера" Вам нужна такая видеокарта:
10/12-bit NVidia Graphic cards
и такой монитор:
10-bit NEC monitor
(и это ещё не самые дорогие решения).

вроде у nvidia все что после 9хх 10хх умеет в 10ти битный цвет, а не только квадры, у амд тоже есть карты по-проще, да даже встроенный интел что-то умеет.
и мониторы тоже есть попроще, не медицинские PA246Q, GW2765H.
только имхо ничем это для этой картинки не поможет.
whale_nik
Цитата(Димыч @ Aug 7 2017, 13:23) *
16 бит grayscale - это вряд ли. Хотя, у Вас небольшая путаница в исходных данных: 2 байта - это же никак не 1024 sm.gif


Что два байта что 1024 для сохранения уже не важно )


Цитата(_pv @ Aug 7 2017, 13:57) *


С шумами я борюсь еще не вечер.
А как составить gBitmap для сохранения в png чтобы он 16бит /цвет поддерживал ?
_pv
Цитата(whale_nik @ Aug 7 2017, 17:57) *
А как составить gBitmap для сохранения в png чтобы он 16бит /цвет поддерживал ?

взять libpng и просто писать в файл данные, png_write_image
без составления каких-либо gBitmapов, чтобы это не значило.
whale_nik
Цитата(_pv @ Aug 7 2017, 15:22) *
взять libpng и просто писать в файл данные, png_write_image
без составления каких-либо gBitmapов, чтобы это не значило.


Не могли бы вы привести пример как записывать массив данных в два байта в png ?
_pv
в гугле забанили?
http://zarb.org/~gc/html/libpng.html
http://www.labbookpages.co.uk/software/imgProc/libPNG.html

png_set_IHDR(png_ptr, info_ptr, width, height, 816, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
whale_nik
Спасибо.
Я так понимаю файл будет в два раза больше чем нужно для дела, те если сейчас он 7 мб то будет 14мб уже многовато.
А другой вариант если просто записывать двумерный массив в файл где на каждое измерение 2 байта, а потом написать прогу которая
считывает его и выводит в канву, можно сделать локальное увеличение выбранного участка, все будет прозрачно и занимать мало места.
Заодно можно написать любые фильтры по желанию, причем это будет быстро и легко )
_pv
для себя конечно можно хранить как угодно, хоть просто в 16ти битном raw, если размеры картинки сами знаете и они не меняются

а PNG это просто простой и распространённый формат, который все просмотрщики понимают, тогда можно просто тот же irfanview использовать, в нём можно и зумить и цветокоррекцию делать.

7МБ это bmp, который 1600*1600*3байта = 7.6МБ.
PNG можно и 16ти битный GRAYSCALE сделать, это два байта на пиксель, плюс сжатие, которое правда на таких картинках не очень работает, но всё же. прикреплённая картинка в png занимает 2МБ с 8*3 = 24х битным цветом.
whale_nik
Так и сделаю, буду сохранять данные в текстовом формате, а потом уже напишу или конвертатор в png или свое что то.
Всем спасибо.
whale_nik
Еще один быстрый вопрос,
есть массив short data[1600]
как его вывести в файл одной строкой типа

ofstream fout;
fout.write((char*) &data, sizeof data);

тут выводит но какую то фигню

whale_nik
Вопрос решился.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.