У меня небольшая проблема. Я хочу реализовать свертку по Гауссу в C #, но она (для некоторых целей) должна иметь тот же результат, что и размытие по Гауссу в EmguCV (что также означает то же самое, что OpenCV). Вычисление значения ядра всегда должно быть одинаковым при гауссовой свертке, единственное, что мне нужно знать, это то, как реализация OpenCV вычисляет размер ядра. Я ближе познакомился с исходным кодом OpenCV, но у меня мало опыта в C ++, поэтому я не нашел этого.
Возможно, кто-нибудь еще может помочь мне с этим.
И есть ли другие изменения в реализации OpenCV на «оригинал»?
Размытие по Гауссу — это свертка с гауссовым ядром определенного размера (это параметр).
Итак, шаги для свертки:
make Gaussian kernel
convolve image
Как я знаю, OpenCV использует некоторую оптимизацию, если размер ядра больше, чем предопределенный порог (я думаю, 7). Тогда свертка выполняется не в пространственной области, а в частотной области.
Шаги:
calculate result image size (needs to be power of 2 -> look at FFT)
transform image to frequency domain (e.g. FFT)
transform kernel to frequency domain (e.g. FFT)
multiply those matrices (element by element)
transform result matrix in spatial domain (e.g. inverse FFT)
clip matrix (convolution in frequency domain is cyclic convolution)
Если вы хотите просто базовую версию, посмотрите на:
Класс GaussianBlur.cs в библиотеке AForge.NET
(сначала попробуйте использовать класс, чтобы увидеть, что соответствует вашим потребностям)
документ:
http://www.aforgenet.com/framework/docs/html/f074e0dd-865c-fd5f-ba0a-80e336a0eaea.htm
Других решений пока нет …