Модифицировать изображение с помощью OpenGL? - PullRequest
5 голосов
/ 28 апреля 2010

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 28 апреля 2010

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

2 голосов
/ 28 апреля 2010

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

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

1 голос
/ 29 апреля 2010

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

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

alt text

Например, вы бы представляли преобразование масштабирования x на & frac12 ;, масштабирование y на 1,2 и перевод вверх и влево на две единицы в виде:

alt text

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

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

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

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

1 голос
/ 28 апреля 2010

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

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

0 голосов
/ 29 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...