2011-12-30 3 views
1

Вот что у меня есть:Самый быстрый способ расчета сходства/расстояния OpenGL?

  1. я загрузить текстуру с диска, скажем, 256x256, скажем, картина пингвина
  2. создать другую текстуру с такими же размерами, и я сделать некоторые вещи на нем

Я хочу найти расстояние между двумя текстурами openGL AS FAST AS ВОЗМОЖНО (точность функции расстояния относится к LEAST).

На самом деле, они могут быть не текстурами в первую очередь. Я мог бы также сравнить область фреймбуфера с загруженной текстурой или сделать еще одну «магию».

Как это сделать супер-быстро?

+2

Как вы определяете «расстояние» между двумя изображениями? –

+0

Скажите примерно так: distance = (sR-dR) * (sR-dR) + (sG-dG) * (sG-dG) + (sB-dB) * (sB-dB) – JBeurer

ответ

5

Это не имеет никакого отношения к OpenGL. OpenGL - это просто «драйвер» 3D-растеризации.

Основная идея - получить алгоритм расстояния/подобия, что является сложной задачей. Для начала вы можете сделать алгоритм Root Mean Square Deviation. Это даст вам ряд значений пикселей.

Когда вы реализуете его на CPU, вы можете сравнить его для своих нужд и, возможно, конвертировать в OpenCL. Я не думаю, что загружать «пингвин» на GPU, чтобы сравнить его с другими фигурами, которые вы готовите, сам по себе является супер-быстрым процессом.

Постарайтесь уточнить свой следующий вопрос и избегать отношения «У меня очень хороший микроскоп, как я могу нанести гвоздь с ним очень быстро?»

+1

+1 хотя это должно быть отметил, что RMSD отлично работает для _технической фигуры «шумовых» различий, но не настолько хорошо подходит для, например, два одинаковых друг друга изображения, которые смещены на несколько пикселей, и иногда они могут давать неоправданно плохие значения для _visually_ совершенно одинаковых изображений.Тем не менее, это, вероятно, лучшее, самое простое и быстрое решение (кроме создания mipmaps и выполнения суммы различий на уровне mip-уровня 3 или 4). Это действительно зависит от того, что нужно. – Damon

+1

Я бы сказал, что он должен делать много с OpenGL, потому что наибольший удар по производительности исходит от glReadPixels и сравнения пикселя на пиксель с исходным изображением на процессоре. Я уверен, что если это сходство будет сделано на GPU каким-то образом, производительность будет как минимум в 10 раз лучше. – JBeurer

+0

Это зависит от вашего приложения. Мы не знаем, что вы делаете, что нужно сравнить с изображениями «пингвинов». – Kromster

2

Вы можете использовать Pearson-Product для соответствия различным изображениям. Вы можете найти его на моем answer. Вместо того, чтобы сопоставлять шаблон, меньший, чем исходное изображение, вы можете напрямую сопоставить два изображения.

Вскоре вы получите отклонение каждого текста от среднего, что даст вам коэффициент корреляции.

Но улучшение этого алгоритма с помощью шейдеров может быть немного сложным. Во-первых, вам нужно вычислить среднее значение textel: возможно, некоторое расширение OpenGL (например, гистограмма) может помочь вам в этой задаче.

Затем вы можете использовать фрагментарные шейдеры для выполнения однокомпонентного вычисления (разница между каждым текстуром с усредненным, вычисленным ранее). Средний текст должен быть передан как единый, и результат должен храниться в плавающей запятой текстуры (вы можете сделать это на объекте фреймбуфера).

Затем вы должны суммировать все textel результирующей текстуры, чтобы получить корреляцию между двумя Souce текстурами.

Это может стоит в том случае, изображения очень большие, в противном случае я думаю, что лучше всего выполнить алгоритм на процессоре, используя набор команд SIMD (например, MMX, SSE, AVX).

Смежные вопросы