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 に答える