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