用于单通道图像的滑动窗口标准过滤器

时间:2013-10-29 15:55:10

标签: c++ image-processing intel-ipp

我想将具有固定色标尺寸的“标准过滤器”应用于单个通道图像 这就是我希望out[i,j]等于img[i,j]附近区域的像素值的标准。

对于那些熟悉Matlab的人,我正在寻找相当于

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

有没有办法使用ippi函数执行此操作?

我遇到了ippiMean_StdDev,但它似乎适用于单个窗口,而不是滑动窗口(返回标量值而不是数组)。
我也看到ippiRectStdDev,但是手册说明这个功能是用于整体图像 - 我不知道这在我的情况下是如何适用的。

有没有人有这方面的工作实例或更详细的手册?

1 个答案:

答案 0 :(得分:1)

最后我明白了。

  1. 输入图片必须采用uint8格式
  2. 需要分配2个缓冲区(在我的情况下为32位浮点数和64位浮点数)
  3. 数组大小:
    输入尺寸H x W
    过滤器尺寸,P x P
    结果大小H-P+1 x W-P+1
    中间缓冲区(32f和64f)大小H+1 x 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 );