2016-03-23 1 views
0

Brad Larson,Как использовать GPUImageConvolution3x3 для ядер размером более 3x3?

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

Мой вопрос в том, как использовать сверление GPUImage 3x3 для больших ядер. У меня создалось впечатление, что любая свертка может быть выражена через ядро ​​3x3, но как ее реализовать? Я имею в виду ядро ​​gabor. Собирался попробовать свертку, а не создавать новый класс фильтра.

Спасибо.

ответ

2

Для большей свертки (5x5 и т. Д.) Вам необходимо создать новый тип фильтра, который выполняет эту свертку. Базовая свертка 3x3 предоставляется в рамках, потому что ее быстро и легко указать. Вы также получаете девять текстур, которые читаются почти бесплатно на большинстве устройств iOS.

Когда вы начинаете двигаться дальше, все становится намного дороже. Для свертки 5x5 требуется 25 текстурных надписей и т. Д. Это может привести к очень медленной обработке.

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

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

+0

Спасибо за ваш ответ. В моем случае ядро ​​21x21 (работает лучше всего), но изображение обычно очень мало, в среднем не больше 40x40 пикселей. Мне нужно сделать gabor в этой конфигурации 36-72 раза для каждой части 40x40 пикселей. Выполнение этого с opencv filter2D не занимает много времени, но, безусловно, далеко от реального времени, что было бы очень желательно. –

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