3

CImg 库的 get_convolve() 函数(用 C 编写)使用了哪种过滤器?中位数或高斯或双边或其他?我试图了解该功能,以便可以在 PIL openCV 中使用类似的功能。在库的头文件 CImg.h 中,它说:

/**
   Compute the convolution of the image by a mask.
   The result \p res of the convolution of an image \p img by a mask \p mask is defined to be :

   res(x,y,z) = sum_{i,j,k} img(x-i,y-j,z-k)*mask(i,j,k)

   param mask = the correlation kernel.
   param cond = the border condition type (0=zero, 1=dirichlet)
   param weighted_convol = enable local normalization.
**/

声明是这样的:

 template<typename t> CImg<typename cimg::superset2<T,t,float>::type>
  get_convolve(const CImg<t>& mask, const unsigned int cond=1, const bool weighted_convol=false) const {}

这是一个代码片段:

                for (int z = mz1; z<mze; ++z) 
                for (int y = my1; y<mye; ++y) 
                for (int x = mx1; x<mxe; ++x) {// For each pixel
                  Ttfloat val = 0;
                  for (int zm = -mz1; zm<=mz2; ++zm) 
                  for (int ym = -my1; ym<=my2; ++ym) 
                      for (int xm = -mx1; xm<=mx2; ++xm)
                            val+=(*this)(x+xm,y+ym,z+zm,v)*mask(mx1+xm,my1+ym,mz1+zm);
                  dest(x,y,z,v) = (Ttfloat)val;
                }
                if (cond)
                  cimg_forYZV(*this,y,z,v)
                    for (int x = 0; x<dimx(); (y<my1 || y>=mye || z<mz1 || z>=mze)?++x:((x<mx1-1 || x>=mxe)?++x:(x=mxe))) {
                      Ttfloat val = 0;
                      for (int zm = -mz1; zm<=mz2; ++zm) for (int ym = -my1; ym<=my2; ++ym) for (int xm = -mx1; xm<=mx2; ++xm)
                        val+=at3(x+xm,y+ym,z+zm,v)*mask(mx1+xm,my1+ym,mz1+zm);
                      dest(x,y,z,v) = (Ttfloat)val;
                 }else
                    cimg_forYZV(*this,y,z,v)

我正在使用 7 x 7 的掩码,其中的每个值都是“1”。我从函数中得到的是,对于每个像素,它在其周围占据一个 7 x 7 的窗口,像素位于中心,然后与单位矩阵相乘。感觉就像某种平滑过滤器,但它是哪一个?我可以在 openCV 中使用哪个等效过滤器?

我可以发布整个功能,但它太长了,我不明白这一点。我会非常感谢你的帮助。

4

1 回答 1

6

所以,我在实现pHash的人的论文中找到了答案。它说:在计算pHash的过程中,对图像应用了一个均值滤波器。使用尺寸为 7x7 的内核。为了应用这个内核,使用了 CImg 库的get_convolve() 函数。然后突出显示为:

对于图像 I 和掩码 M,它是: R(x,y,z) = SIGMA(i,j,k) I(x - i, y - j, z - k)M (i, j, k)

然后,当我在这里查看openCV 提供的过滤功能类型时,它与框过滤器功能相匹配。

于 2013-03-18T19:52:09.117 回答