Как работает алгоритм гауссовского фильтра в OpenCV - PullRequest
5 голосов
/ 01 июня 2009

Я пишу свой собственный гауссов фильтр, но он очень медленный.

Алгоритм Гаусса в OpenCV намного быстрее, в 20 раз, чем мой фильтр Гаусса. Я хочу переписать алгоритм Гаусса OpenCV в моем проекте, и я не хочу включать opencv в мой проект.

Тем не менее,

Может кто-нибудь дать мне описание алгоритма, исходный код opencv кажется слишком сложным для понимания?

Ответы [ 5 ]

12 голосов
/ 01 июня 2009

Гауссов фильтр обладает свойством, которое позволяет очень легко ускорить: фильтр может применяться в обоих измерениях независимо. Вы определяете одномерный фильтр, который работает вертикально, и другой, который работает горизонтально, и применяете их оба; это дает тот же эффект, что и один фильтр, применяемый в двух измерениях.

Кроме того, вам, вероятно, придется взглянуть на инструкции SIMD , например. SSE3 доступно для вашего процессора.

4 голосов
/ 01 июня 2009

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

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(Обратите внимание, что это просто пример ядра, есть очень специфические уравнения, которые, в зависимости от ваших гауссовых переменных, вы получите разные результаты)

Чтобы ответить на вопрос о производительности вашего вопроса, общая скорость этого алгоритма будет зависеть от нескольких факторов, если предположить, что изображение постоянного размера. Допустим, изображение составляет NxM пикселей, а ядро ​​свертки - PxP пикселей. Вам нужно будет выполнить операции P P N * M. Чем больше P, тем больше операций вам придется выполнить для данного изображения. Вы можете стать хитрым с алгоритмом, который вы здесь используете, выполняя очень специфическую математику на основе строк или столбцов.

Реализация также очень важна. Если вы хотите быть чрезвычайно эффективным, вы, вероятно, захотите использовать самые продвинутые инструкции, которые предлагает ваша архитектура. Если вы используете чип Intel x86, вам, вероятно, захочется взглянуть на получение лицензии на примитивы производительности Intel (IPP) и непосредственный вызов этих инструкций. IIRC, OpenCV использует IPP, когда он доступен ...

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

2 голосов
/ 01 июня 2009

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

1 голос
/ 01 июня 2009

Если ваше ядро ​​свертки относительно велико и вы используете прямую свертку, разница в производительности может быть связана с тем, что OpenCV реализует свертку с использованием быстрого преобразования Фурье (БПФ).

0 голосов
/ 20 декабря 2012

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

Чтобы ответить на вопрос быстрее - вы хотите знать, как OpenCV оптимизирует свой код, что является очень технической и широкой темой. Я бы рискнул предположить, сказав, что он использует язык ассемблера и специфичные для GPU функции. Я бы начал с изучения ассемблера и изучения пакета CUDA, чтобы воспользоваться вашим графическим процессором.

...