whale_nik
Aug 5 2017, 21:46
Всем привет!
Есть вопрос, имеется массив данных, каждое данное размером в два байта те 1024,
нужно вывести картинку из этих данных, и чтобы каждый пиксель отображал всю градацию 0-1024.
Как такое можно сделать ? Желательно в желтом цвете )
Знаю формат pf24bit но там на каждый цвет только то байту....
На крайний случай можно в сером.
Прогаю в Buildere
куда вывести-то?
во-первых обычные мониторы даже 8 бит нормально-то не отображают, а во-вторых далеко не каждый увидит разницу яркости в 0.5%, а уж тем более в градациях жёлтого цвета.
увеличьте картинки да посмотрите, каждую ли ступеньку видно?
ну а чтобы отобразить 10 бит, делите на 4 или логарифмируйте.
whale_nik
Aug 6 2017, 07:00
Вывод на монитор, теоретически вывести возможно и как это практически на си ?
Поделить и логарифмировать всегда успеется, данные при этом теряются.
Данные с гидролокатора и у них дин диапазон 10 бит, если выводить в 8 бит тот теряется мелкий рисунок
А что это за картинки ?
практически на С:
glfwWindowHint(): GLFW_RED_BITS, GLFW_GREEN_BITS, GLFW_BLUE_BITS
или GLFWvidmode в полноэкранном режиме так как у операционной системы тоже может быть своё мнение по поводу глубины цвета окон.
ну и WGL_ARB_pixel_format
а картинки - верхняя просто 16х16=256 серых квадратов. чтобы увидеть границы между соседями приходится под разными углами на монитор смотреть (бюджетная версия изменения динамического диапазона lcd монитора
), да и то все не видно.
можно попробовать для начала разные графические редакторы которые больше 8ми бит на цвет поддерживают.
но вот отображают ли они их на самом деле хз.
hdmi до каких-то недавних версий вроде имел 3 канала и 8b/10b и пиксельклок в 10 раз меньше, то есть даже в этом месте оно гвоздями к 8ми битам на цвет приколочено было.
хотя сейчас наверное маркетологи помимо разрешений в 4К, 60fps и до цвета добраться уже должны были.
whale_nik
Aug 6 2017, 12:19
У меня верхняя картина отлично все видно и монитор бюджетнее некуда.
в OpenGL не силен, а есть вариант поближе в винде и железу ?
Действительно надо попробовать какие вариацие серого еще заметны глазом на хорошем мониторе /телике
У меня счас формат PixelFormat=pf24bit все понятно три байта каждый отвечает за свой цвет а всякие стороние библиотеки ноги сломаешь пока чего нить получишь
если данные только с одной компонентой, то надо просто в разные цвета раскрасить.
whale_nik
Aug 6 2017, 12:46
В разных цветах очень плохо получается опознать что там вообще нарисовано кроме новогодней елки )
Самое лучшее - желтый, хуже серый, далее синий, цветной самое ужасное что можно сделать.
Данные - просто амплитуда отраженного сигнала в 10 битах
контурные линии добавте, может поможет.
ну а не видя картинки сложно что-то советовать.
Цитата
У меня верхняя картина отлично все видно и монитор бюджетнее некуда.
Вы ведь понимаете что там не 16 горизонтальных полос надо увидеть, а вертикальных. Различие между двумя соседними квадратами по горизонтали. Именно они на 1/256 по яркости отличаются, и увидеть и в тёмной и в светлой части картинки.
Ну правда у меня ещё десятый виндовс что-то с настройками яркости монитора нехорошее сделал.
whale_nik
Aug 6 2017, 13:38
Квадратики видно, 1/512 было бы наверно предел.
Картинка такая
https://yadi.sk/d/wViaBAVG3LkeRh
raw бы 10ти битный, чтобы понять разницу.
Цитата(whale_nik @ Aug 6 2017, 15:19)
в OpenGL не силен, а есть вариант поближе в винде и железу ?
Откройте справочник по WinAPI, в нём поиск по BitBlt (и др.функции этого семейства), а также - функции рисования. Создёте плоскость в памяти, рисуете на ней, а потом при помощи BitBlt или PatBlt, ... копируете картинку в экранную плоскость.
whale_nik
Aug 6 2017, 21:10
Цитата(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 с двумя байтами на монохромный пиксель и выводить своей же программой которая сможет его причитать.
Цитата(whale_nik @ Aug 7 2017, 00:10)
Каким образом тут 10 бит на пиксель ?
Там можно и больше бит получить, не только 10. В цвете конечно.
Цитата(_pv @ Aug 6 2017, 02:54)
во-первых обычные мониторы даже 8 бит нормально-то не отображают, а во-вторых далеко не каждый увидит разницу яркости в 0.5%, а уж тем более в градациях жёлтого цвета.
А нужны ли эти 10 бит на экране? Зачем реально нужно отображать
одновременно и самые яркие и самые тёмные участки?
Т.е. - если на картинке есть яркие участки (как я понимаю - эхо от ближайших объектов), и при этом есть тёмные участки (от дальних объектов) - так ли реально нужно их отображать вместе?
У автора же интерактивное отображение, а не картинка сохраняемая в файл.
Сделать скажем отображение только 64 уровня яркости (или 32 - сколько удобно). Младшие биты отбросить - эти участки будут отображаться чёрным. Если пользователь хочет заглянуть вглубь этих чёрных участков - он жмёт кнопку "приблизить" - старшие биты яркости постепенно отбрасываются (яркие участки соответствующие им маскируются на экране каким-то специальным шаблоном/цветом), но проступают, становятся ярче тёмные участки - глубинные слои.
Как то так.
whale_nik
Aug 7 2017, 07:50
Так я и говорю придется делать свою программу на "приблизить".
10 бит еще нужны чтобы применять различные алгоритмы обработки а не только чтобы вывести на экран сразу все.
Вот допустим как сделать gBitmap c 16 монохромными битами на пиксель ? Кто его сможет прочитать , вывести на экран пусть даже с 8 битами ?
Вообще конечно подробно рассматривают уже потом, в записи.
Цитата(whale_nik @ Aug 7 2017, 10:50)
Так я и говорю придется делать свою программу на "приблизить".
И это правильно
Цитата(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
сохраняйте например в 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, 10:57
Цитата(Димыч @ Aug 7 2017, 13:23)
16 бит grayscale - это вряд ли. Хотя, у Вас небольшая путаница в исходных данных: 2 байта - это же никак не 1024
Что два байта что 1024 для сохранения уже не важно )
Цитата(_pv @ Aug 7 2017, 13:57)
С шумами я борюсь еще не вечер.
А как составить gBitmap для сохранения в png чтобы он 16бит /цвет поддерживал ?
Цитата(whale_nik @ Aug 7 2017, 17:57)
А как составить gBitmap для сохранения в png чтобы он 16бит /цвет поддерживал ?
взять libpng и просто писать в файл данные, png_write_image
без составления каких-либо gBitmapов, чтобы это не значило.
whale_nik
Aug 7 2017, 14:27
Цитата(_pv @ Aug 7 2017, 15:22)
взять libpng и просто писать в файл данные, png_write_image
без составления каких-либо gBitmapов, чтобы это не значило.
Не могли бы вы привести пример как записывать массив данных в два байта в png ?
в гугле забанили?
http://zarb.org/~gc/html/libpng.htmlhttp://www.labbookpages.co.uk/software/imgProc/libPNG.htmlpng_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
Aug 7 2017, 14:59
Спасибо.
Я так понимаю файл будет в два раза больше чем нужно для дела, те если сейчас он 7 мб то будет 14мб уже многовато.
А другой вариант если просто записывать двумерный массив в файл где на каждое измерение 2 байта, а потом написать прогу которая
считывает его и выводит в канву, можно сделать локальное увеличение выбранного участка, все будет прозрачно и занимать мало места.
Заодно можно написать любые фильтры по желанию, причем это будет быстро и легко )
для себя конечно можно хранить как угодно, хоть просто в 16ти битном raw, если размеры картинки сами знаете и они не меняются
а PNG это просто простой и распространённый формат, который все просмотрщики понимают, тогда можно просто тот же irfanview использовать, в нём можно и зумить и цветокоррекцию делать.
7МБ это bmp, который 1600*1600*3байта = 7.6МБ.
PNG можно и 16ти битный GRAYSCALE сделать, это два байта на пиксель, плюс сжатие, которое правда на таких картинках не очень работает, но всё же. прикреплённая картинка в png занимает 2МБ с 8*3 = 24х битным цветом.
whale_nik
Aug 7 2017, 16:19
Так и сделаю, буду сохранять данные в текстовом формате, а потом уже напишу или конвертатор в png или свое что то.
Всем спасибо.
whale_nik
Aug 8 2017, 10:24
Еще один быстрый вопрос,
есть массив short data[1600]
как его вывести в файл одной строкой типа
ofstream fout;
fout.write((char*) &data, sizeof data);
тут выводит но какую то фигню
whale_nik
Aug 8 2017, 12:41
Вопрос решился.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.