#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.
Комментариев нет:
Отправить комментарий