Функция свертки графического процессора OpenCV и отсутствующая граница

У меня есть вопрос о функции Convolve в OpenCV с использованием ускорения графического процессора. Скорость сверток примерно в 3,5 раза выше при использовании графического процессора.

при запуске:

convolve(src_32F, kernel, cresult, false, cbuffer);

Однако границы изображения отсутствуют (в результате)

В остальном результат отличный (размер ядра 60x60)

Благодарность


person jeffrico el exotico    schedule 18.12.2011    source источник


Ответы (1)


Так работает свертка.

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

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

Что вы можете сделать, так это вручную дополнить матрицу нужными значениями в большей матрице, отфильтровать большую, а затем обрезать ее обратно. Для этого вы можете использовать функцию gpu::copyMakeBorder().

person Sam    schedule 19.12.2011
comment
Привет; Есть ли какой-то способ того, что значения немного завышаются. ручное добавление не вариант для меня. Например, при обработке изображения 320-240 я добавляю 30 к каждому размеру, и результат получается 321-241 (я вручную вычел один сверху и справа. Что я имею в виду под методом, например, если сторона kerel четная, то исправить, если нечетная нет (или что-то в этом роде) - person jeffrico el exotico; 19.12.2011
comment
Размер ядра должен быть нечетным. потому что он применяется симметрично слева и справа: n значений слева, n справа + центр. Таким образом, размер ядра должен быть (2n+1). Если вы отправите четное ядро ​​(60/60), возможно, оно просто добавит один столбец и одну строку в ядро, и сделает то же самое для изображения. - person Sam; 19.12.2011
comment
Но позвольте дать вам дружеский совет: прежде чем приступить к работе над такими вещами, как оптимизация CUDA и сложные задачи обработки изображений, прочтите, поймите и примените основы. Потому что вы не сможете идти вперед таким путем. Итак, поищите в Google wiki convolution и внимательно прочитайте. - person Sam; 19.12.2011
comment
:) Спасибо за совет. Я согласен с тем, что вы говорите, и это было бы так, как это делается обычно. Моя задача состоит не в том, чтобы на самом деле понять работу, а в том, чтобы объединить различные компоненты ОО и объединить их, чтобы они соответствовали существующему дизайну. Но не обманывай меня, дела идут хорошо, несмотря на мое невежество :) В любом случае, Василе, спасибо тебе огромное. - person jeffrico el exotico; 19.12.2011
comment
Кстати: я только что проверил, и в руководстве OpenCV convolve явно указано, что выходной размер имеет тот же размер, что и оригинал, или я, возможно, пропускаю компонент - person jeffrico el exotico; 19.12.2011
comment
Хорошо, я рад, что это работает :) И документ OpenCV не всегда идеален. - person Sam; 19.12.2011