фильтр скользящего окна для одноканального изображения

Я хотел бы применить «стандартный фильтр» с фиксированным размером патча к изображению одного канала.
Это я хочу out[i,j] чтобы равняться стандартному значению пикселей в окрестности img[i,j],

Для тех из вас, кто знаком с Matlab, я ищу эквивалент

>> out = nlfilter( img, [P P], @std );

Есть ли способ сделать это с помощью ippi функции?

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

У кого-нибудь есть рабочий пример или более подробное руководство для этого?

1

Решение

Наконец я понял это.

  1. входное изображение должно быть в формате uint8
  2. нужно выделить 2 буфера (32-битные и 64-битные в моем случае)
  3. размеры массивов:
    размер ввода HИксW
    размер фильтра, PИксP
    размер результата H-P+1ИксW-P+1
    размер промежуточных буферов (32f и 64f) H+1ИксW+1 (обратите внимание на плюс для границы целого изображения!)

    // first, compute integral and sqIntegral image
    IppiSize sz; sz.width = W; sz.height = H;
    ippiSqrIntegral_8u32f64f_C1R( uint8ImgPtr, W*sizeof(unsigned char),
    d32ImgPtr, (W+1)*sizeof(float),
    d64ImgPtr, (W+1)*sizeof(double),
    sz, 0, 0 );
    // using the integral images compute the std filter result
    IppiRect rect = { 0, 0, P, P };
    IppiSize dsz; dsz.width = W-P+1; dsz.height = H-P+1;
    ippiRectStdDev_32f_C1R( d32ImgPtr, (W+1)*sizeof(float),
    d64ImgPtr, (W+1)*sizeof(double),
    dstPtr, (W-P+1)*sizeof(float), dsz, rect );
    
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]