какой фильтр используется функцией get_convolve() в библиотеке CImg

Какой тип фильтра используется функцией get_convolve() библиотеки CImg (написанной на 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 на 7 вокруг него, с пикселем в центре, а затем умножает на матрицу идентичности. Похоже на какой-то сглаживающий фильтр, но какой? Какой эквивалентный фильтр я могу использовать в openCV?

Я могу выложить всю функцию, но она слишком длинная и не вижу смысла. Я был бы очень благодарен за вашу помощь.


person Shobhit Puri    schedule 18.03.2013    source источник


Ответы (1)


Итак, я нашел ответ в диссертации человека, внедрившего pHash. В нем говорилось: «В процессе расчета pHash к изображению применяется средний фильтр. Используется ядро ​​размером 7x7. Для применения этого ядра используется функция get_convolve() библиотеки CImg. Затем он выделяется как:

Для изображения I и маски M это: R(x,y,z) = SIGMA(i,j,k) I(x − i, y − j, z − k)M (i, j, k)

Затем, когда я посмотрел на тип функций фильтрации, предлагаемых openCV здесь, она соответствует функции фильтра ящиков.

person Shobhit Puri    schedule 18.03.2013