我正在尝试对图像I执行反卷积,即nxm。用于对其进行卷积的内核是K,也是nxm。现在我想通过执行反卷积找到原始图像O 。我知道我可以通过对I和K执行傅立叶变换并划分:I / K来检索图像O,因为在傅立叶域中,卷积是一个乘积。(我从这里得到了这个信息)。
我在这里看到了关于如何使用 Eigen FFT 执行正向变换的另一篇文章。
我的正向傅里叶变换代码是:
I = 输入图像(时域)
O = 输出图像(频域)
tempFreq = 计算的临时矩阵(频域)
timevec1 = 浮点向量
freqvec1, freqvec2, freqvec3 = 复向量
for (Int32 i = 0; i < I->uRowsCount; ++i)
{
for (Int32 j = 0; j < I->uColumnsCount; ++j)
{
timevec1.push_back((*I)(i, j));
}
fft.fwd(freqvec1, timevec1);
for (Int32 j = 0; j < I->uColumnsCount; ++j)
{
(tempFreq)(i, j) = freqvec1[j];
}
freqvec1.clear();
timevec1.clear();
}
freqvec1.clear();
timevec1.clear();
for (Int32 j = 0; j < I->uColumnsCount; ++j)
{
for (Int32 i = 0; i < I->uRowsCount; ++i)
{
freqvec2.push_back((tempFreq)(i, j));
}
fft.fwd(freqvec1, freqvec2);
for (Int32 i = 0; i < I->uRowsCount; ++i)
{
(O)(i, j) = freqvec1[i];
}
freqvec2.clear();
freqvec1.clear();
}
我的傅里叶逆变换代码是:
I = 输入图像(频域)
O = 输出图像(时域)
tempTime = 计算的临时矩阵(时域)
timevec1, timevec2 = 浮点向量
freqvec1, freqvec2 = 复向量
for (Int32 j = 0; j < O->uColumnsCount; ++j)
{
for (Int32 i = 0; i < O->uRowsCount; ++i)
{
freqvec1.push_back((I)(i, j));
}
fft.inv(timevec1, freqvec1);
for (Int32 i = 0; i < O->uRowsCount; ++i)
{
(*tempTime)(i, j) = timevecCol[i];
}
freqvec1.clear();
timevec1.clear();
}
freqvec1.clear();
timevec1.clear();
for (Int32 i = 0; i < O->uRowsCount; ++i)
{
for (Int32 j = 0; j < O->uColumnsCount; ++j)
{
freqvec2.push_back((*tempTime)(i, j));
}
fft.inv(timevec2, freqvec2);
for (Int32 j = 0; j < O->uColumnsCount; ++j)
{
(*O)(i, j) = timevec2[j];
}
freqvec2.clear();
timevec2.clear();
}
对于反卷积,我将频域中的输入图像与频域中的内核相除:
freqDomainOutputImage = freqDomainInputImage.cwiseQuotient(freqDomainKernel);
为了得到原始图像,我对 freqDomainOutputImage 执行傅里叶逆变换。
我相信 FFT 将左上角镜像到另一边,但我不知道为什么?我没有使用 halfSpectrum。第二,为什么图像偏移?如果我通过用这个替换最后一个循环将输出图像移动到中心:
(*O)((i + O->uRowsCount/2)%O->uRowsCount, (j + O->uColumnsCount/2)%O->uColumnsCount) = timevec2[j];
(您可以看到图像是从左上象限镜像的)。
最后,为什么即使我自己添加了没有噪音的模糊,它似乎也有噪音?