Почему мое изображение iFFT выходит с зеркальной копией? - PullRequest
0 голосов
/ 29 января 2019

Так что я использую KissFFT (kiss_fftnd) для преобразования изображения в частотную область и обратно.Вещи, кажется, работают достаточно хорошо, однако мы получаем странные результаты.

ввод: https://imgur.com/a/yQJpjy9

результат: https://imgur.com/a/qSGsT72

Я, честно говоря, понятия не имею, что происходит, любая помощь будет принята с благодарностью.

Ниже приведен наш быстрый проход, преобразование из пространственной области в частотную область.

int M = input->width;
int N = input->height;
int width = input->width;
int height = input->height;

int mDim[2] = { N, M };
const int numDim = 2; //number of dimensions

kiss_fft_cpx *cinRed = new kiss_fft_cpx[width * height];
kiss_fft_cpx *cinGreen = new kiss_fft_cpx[width * height];
kiss_fft_cpx *cinBlue = new kiss_fft_cpx[width * height];

kiss_fft_cpx *coutRed = new kiss_fft_cpx[width * height];
kiss_fft_cpx *coutGreen = new kiss_fft_cpx[width * height];
kiss_fft_cpx *coutBlue = new kiss_fft_cpx[width * height];

kiss_fftnd_cfg state = kiss_fftnd_alloc (mDim, numDim, 0, 0, 0);

int k=0;
for (int i=0;i<M;++i)
{
    for(int j=0;j<N;j++)
    {
        PF_Pixel32 curPixel = *sampleIntegral128(*input, i, j);

        cinRed[k].r     = curPixel.red;
        cinGreen[k].r   = curPixel.green;
        cinBlue[k].r    = curPixel.blue;

        k++;
    }
}

kiss_fftnd(state,cinRed,coutRed);//coutRed contains 2D fft results for img1 (red channel)
kiss_fftnd(state,cinGreen,coutGreen);
kiss_fftnd(state,cinBlue,coutBlue);

for(unsigned int l=0; l<width; l++)
{
    for(unsigned int i=0; i<height; i++)
    {
        int index = l * height + i;

        PF_Pixel32 *outPix = sampleIntegral128(*output, l, i);

        outPix->alpha    = 1.0;
        outPix->red      = coutRed[index].r;
        outPix->green    = coutGreen[index].r;
        outPix->blue     = coutBlue[index].r;

    }
}

delete[] cinRed;
delete[] cinGreen;
delete[] cinBlue;
delete[] coutRed;
delete[] coutGreen;
delete[] coutBlue;

Ниже приведен наш второй проход, преобразование из частоты в пространственную область.

int mDim[2] = { N, M };
const int numDim = 2; //number of dimensions

kiss_fft_cpx *cinRed =  new kiss_fft_cpx[N * M];
kiss_fft_cpx *coutRed = new kiss_fft_cpx[N * M];
kiss_fft_cpx *cinGreen =  new kiss_fft_cpx[N * M];
kiss_fft_cpx *coutGreen = new kiss_fft_cpx[N * M];
kiss_fft_cpx *cinBlue =  new kiss_fft_cpx[N * M];
kiss_fft_cpx *coutBlue = new kiss_fft_cpx[N * M];

kiss_fftnd_cfg state = kiss_fftnd_alloc (mDim, numDim, 1, 0, 0);

int k=0;
for (int i=0;i<M;++i)
{
    for(int j=0;j<N;j++)
    {
        PF_Pixel32 curPixel = *sampleIntegral128(*input, i, j);

        cinRed[k].r = curPixel.red;
        cinRed[k].i = 0;
        cinGreen[k].r = curPixel.green;
        cinGreen[k].i = 0;
        cinBlue[k].r = curPixel.blue;
        cinBlue[k].i = 0;

        k++;
    }
}

kiss_fftnd(state,cinRed,coutRed);//coutRed contains 2D fft results for img1 (red channel)
kiss_fftnd(state,cinGreen,coutGreen);
kiss_fftnd(state,cinBlue,coutBlue);

for(unsigned int l=0; l<width; l++)
{
    for(unsigned int i=0; i<height; i++)
    {
        int index = i * height + l;

        PF_Pixel32 *outPix = sampleIntegral128(*output, l, i);

        outPix->alpha    = 1.0;
        outPix->red      = sqrt(pow(coutRed[index].r, 2.0) + pow(coutRed[index].i, 2.0));
        outPix->green    = sqrt(pow(coutGreen[index].r, 2.0) + pow(coutGreen[index].i, 2.0));
        outPix->blue     = sqrt(pow(coutBlue[index].r, 2.0) + pow(coutBlue[index].i, 2.0));

    }
}

delete[] cinRed;
delete[] cinGreen;
delete[] cinBlue;
delete[] coutRed;
delete[] coutGreen;
delete[] coutBlue;

1 Ответ

0 голосов
/ 29 января 2019

Вы отбрасываете мнимую составляющую БПФ.Вам необходимо сохранить как действительные, так и мнимые компоненты вывода БПФ, чтобы иметь возможность инвертировать операцию.

...