Я хотел бы применить «стандартный фильтр» с фиксированным размером патча к изображению одного канала.
Это я хочу out[i,j]
чтобы равняться стандартному значению пикселей в окрестности img[i,j]
,
Для тех из вас, кто знаком с Matlab, я ищу эквивалент
>> out = nlfilter( img, [P P], @std );
Есть ли способ сделать это с помощью ippi
функции?
Я наткнулся ippiMean_StdDev
но, похоже, он работает для одного окна, а не для скользящего окна (возвращая скалярное значение, а не массив).
Я тоже видел ippiRectStdDev
но в руководстве говорится, что эта функция предназначена для интегральных изображений — и я не понимаю, как это применимо в моем случае.
У кого-нибудь есть рабочий пример или более подробное руководство для этого?
Наконец я понял это.
размеры массивов:
размер ввода 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 );
Других решений пока нет …