Изменение изображения с OpenGL?

У меня есть устройство для получения изображений Рентгеновского луча. Из-за некоторых технических ограничивает, детектор сделан из неоднородного размера пикселя и нескольких наклоненных и частично перекрывающихся мозаик. Изображение таким образом искажено. Геометрия детектора известна точно.

Мне нужна функция, преобразовывающая эти искаженные изображения в плоское изображение с гомогенным размером пикселя. Я уже сделал это ЦП, но я хотел бы дать попытку с OpenGL для использования GPU портативным способом.

У меня нет опыта с программированием OpenGL, и большая часть информации, которую я мог найти в сети, была бесполезна для этого использования. Как я должен продолжить двигаться? Как я делаю это?

Размер изображения составляет 560x860 пикселей, и у нас есть пакеты 720 изображений для обработки. Я нахожусь на Ubuntu.

5
задан chmike 28 April 2010 в 11:13
поделиться

5 ответов

Вы можете найти это руководство полезным (оно немного устарело, но обратите внимание, что оно содержит немного OpenGL 2.x GLSL после раздела Cg). Я не верю, что есть какие-либо ярлыки для обработки изображений в GLSL, если это то, что вы ищете ... вам нужно много понимать аспект 3D-растеризации и исторический багаж, чтобы использовать его эффективно, хотя как только вы это сделаете Если вы настроили структуру для входов и выходов, вы можете забыть об этом и сравнительно легко поиграть со своими собственными алгоритмами в коде шейдера.

Занимаясь подобными вещами в течение многих лет (сначала используя шейдеры Direct3D, но в последнее время с CUDA), я должен сказать, что полностью согласен с сообщениями здесь, рекомендующими CUDA / OpenCL. Это значительно упрощает жизнь и в целом работает быстрее. Мне бы очень хотелось сейчас вернуться к реализации графического API неграфических алгоритмов.

0
ответ дан 14 December 2019 в 04:33
поделиться

OpenGL предназначен для визуализации полигонов. Возможно, вы сможете выполнить несколько проходов и использовать шейдеры для получения желаемого, но лучше переписать алгоритм в Open C L. Бонусом будет то, что у вас есть что-то портативное, которое даже будет использовать многоядерные процессоры, если карта графического ускорителя недоступна.

4
ответ дан 14 December 2019 в 04:33
поделиться

Это звучит скорее как проблема CUDA или GPGPU, чем OpenGL.

Если у вас уже есть код C или C ++ для этого, CUDA должна быть не более чем выяснением типов, которые вы хотите использовать на GPU, и того, как алгоритм может быть выложен плиткой.

2
ответ дан 14 December 2019 в 04:33
поделиться

Если вы хотите сделать это с помощью OpengGL, вы обычно делаете это, предоставляя текущие данные в виде текстуры и записывая фрагментный шейдер, который обрабатывает эти data и настроить его для рендеринга в текстуру. Как только текстура вывода будет полностью отрисована, вы можете вернуть ее в ЦП и записать в виде файла.

Боюсь, что трудно сделать что-то большее, чем очень общий набросок общего потока, не зная больше о том, что вы делаете - но если (как вы сказали) вы уже сделали это с помощью CUDA, вы очевидно, уже имеют довольно четкое представление о большинстве деталей.

1
ответ дан 14 December 2019 в 04:33
поделиться

По сути, вы спрашиваете: «Как я могу использовать графический процессор для решения этой проблемы?»

Современные графические процессоры - это, по сути, механизмы линейной алгебры, поэтому первым шагом будет определение вашей проблемы как матрицы, которая преобразует от входной координаты к его выходным данным в однородном пространстве:

alt text

Например, вы могли бы представить преобразование масштабирования x на 1/2, масштабирования y на 1,2 и перемещения вверх и влево на две единицы как:

alt text

и вы можете разработать аналогичные преобразования для вращения , сдвига и т.д.

После того, как вы представили преобразование в виде умножения матрицы на вектор, все, что вам нужно сделать, это загрузить исходные данные в текстуру, указать преобразование как матрицу проекции и отрендерить его в результат. Графический процессор выполняет умножение на пиксель. (Вы также можете писать шейдеры и т. Д., Которые выполняют более сложную математику, множат несколько векторов и матриц и т. Д., Но это основная идея.)

Тем не менее, как только ваша проблема будет выражена как линейная transform, вы можете заставить его работать намного быстрее и на ЦП, используя, например, SIMD или одну из многих библиотек линейной алгебры . Если вам не нужна производительность в реальном времени или у вас есть действительно огромный объем данных для обработки, использование CUDA / GL / шейдеров и т. Д. Может быть больше проблем, чем оно того стоит, поскольку есть немного неуклюжего механизма, задействованного в инициализации библиотек, настройке рендеринга. цели, изучение деталей разработки графики и т. д.

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

1
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: