Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Фильтр Винера и FFTW

#fft #qt #cpp


Идея реализовать фильтр Винера для восстановления изображений.
Формула здесь.
На сколько понимаю, то необходимо сделать дискретное преобразование фурье ядра и
самого изображения, которое необходимо восстановать, а затем уже с ними работать.
Ниже код, как я думаю, который должен реализовать DFT для входного изображения.
Однако полученные результаты не совпадают с примерами из сети.
Должно было получиться link text, а получилось link text.
//fftw_complex *inputImageFFT;     
//fftw_complex *outputImageFFT;
//fftw_plan plan;  
int N;
width = this->inImg.width();
height = this->inImg.height();
N=width*height;

inputImageFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N);
outputImageFFT = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N);
plan = fftw_plan_dft_2d(width,height,inputImageFFT,outputImageFFT,
FFTW_FORWARD,FFTW_ESTIMATE);

   for (int i = 0, k = 0; i < height; i++)
   {
       for (int j = 0; j < width; j++, k++)
       {
           inputImageFFT[k][0] = (uint)inImg.pixel(j,i);
           inputImageFFT[k][1] =  0.0;
        }

   }

   fftw_execute(plan);

   float max=0;
   float mag=0;
   for (int i = 1, k = 1; i < height; i++)
   {
       for (int j = 1; j < width; j++, k++)
       {
            mag = qSqrt(qPow(outputImageFFT[k][0],2) + pow(outputImageFFT[k][1],2));
            if (max < mag)
            max = mag;
       }

  }

   outImg = new QImage(width,height, QImage::Format_RGB32);

   for (int i = 0, k = 0; i < height; i++)
   {
       for (int j = 0; j < width; j++, k++)
       {
           float mag = sqrt(pow(outputImageFFT[k][0],2) + pow(outputImageFFT[k][1],2));
           mag = 255*(mag/max);
           outImg->setPixel(j,i,qRgb(mag,mag,mag));
       }
   }
//вывод outImg

Подскажите, в том ли направлении реализации фильтра я двигаюсь и в какую сторону
рыть?    


Ответы

Ответ 1



Есть отличный набор статей по теме на хабре: Восстановление расфокусированных и смазанных изображений и Восстановление расфокусированных и смазанных изображений. Практика и есть ещё одна из серии, в статье найдёте ссылку. Там всё расписано как и что делать. В качестве примера приводится программа, написанная автором под названием smart deblur.

Комментариев нет:

Отправить комментарий