2013-03-18 35 views
2

CImg庫的get_convolve()函數正在使用哪種過濾器(用C語言編寫)?中值或高斯或雙邊或其他? 我試着理解這個函數,以便我可以在PIL openCV中使用類似的功能。在庫的頭文件CImg.h,它說:CImg庫中的get_convolve()函數正在使用哪個過濾器

/** 
    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 {} 

下面是一個代碼sniplet:

   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×7的掩碼和它內部的每個值都是'1'。 我從函數中得到的結果是,對於每個像素,圍繞它的是7乘7的窗口,像素位於中心,然後與單位矩陣相乘。它感覺像是一種平滑過濾器,但它是哪一種?我可以在openCV中使用哪個等效的過濾器?

我可以發佈整個功能,但它太長,我看不到這一點。我會非常感謝你的幫助。

回答

5

因此,我在實施pHash的人的論文中找到了答案。它說: 在計算pHash的過程中,對圖像應用平均濾波器。使用尺寸爲7x7的kel- 。要應用此內核,將使用CImg庫的函數。然後突出顯示爲:

對於圖像I和掩模M,它是: R(x,y,z)= SIGMA(i,j,k)I(x - i,y - j,z - k)M(i,j,k)

然後,當我看着openCV here提供的過濾功能的類型時,它與框過濾功能相匹配。

相關問題