gpt4 book ai didi

c# - FFT卷积后重新缩放复杂数据

转载 作者:太空狗 更新时间:2023-10-29 21:52:48 26 4
gpt4 key购买 nike

我已经通过将它们应用到FFT卷积输出上来测试了两个重缩放功能。

第一个是从this link收集的。

    public static void RescaleComplex(Complex[,] convolve)
{
int imageWidth = convolve.GetLength(0);
int imageHeight = convolve.GetLength(1);

double maxAmp = 0.0;
for (int i = 0; i < imageWidth; i++)
{
for (int j = 0; j < imageHeight; j++)
{
maxAmp = Math.Max(maxAmp, convolve[i, j].Magnitude);
}
}
double scale = 1.0 / maxAmp;
for (int i = 0; i < imageWidth; i++)
{
for (int j = 0; j < imageHeight; j++)
{
convolve[i, j] = new Complex(convolve[i, j].Real * scale,
convolve[i, j].Imaginary * scale);
}
}
}

enter image description here

这里的问题是对比度不正确。

第二个是从 this link收集的。
    public static void RescaleComplex(Complex[,] convolve)
{
int imageWidth = convolve.GetLength(0);
int imageHeight = convolve.GetLength(1);

double scale = imageWidth * imageHeight;

for (int j = 0; j < imageHeight; j++)
{
for (int i = 0; i < imageWidth; i++)
{
double re = Math.Max(0.0, Math.Min(convolve[i, j].Real * scale, 1.0));
double im = Math.Max(0.0, Math.Min(convolve[i, j].Imaginary * scale, 1.0));
convolve[i, j] = new Complex(re, im);
}
}
}

enter image description here

这里的输出是完全白色的。

因此,您可以看到其中两个版本给出了一个正确的输出而另一个给出了不正确的输出。

如何解决这个难题?



注意。 Matrix是以下内核:
 0  -1   0 
-1 5 -1
0 -1 0

源代码。 这是我的FFT卷积函数。
    private static Complex[,] ConvolutionFft(Complex[,] image, Complex[,] kernel)
{
Complex[,] imageCopy = (Complex[,])image.Clone();
Complex[,] kernelCopy = (Complex[,])kernel.Clone();
Complex[,] convolve = null;

int imageWidth = imageCopy.GetLength(0);
int imageHeight = imageCopy.GetLength(1);

int kernelWidth = kernelCopy.GetLength(0);
int kernelHeight = kernelCopy.GetLength(1);

if (imageWidth == kernelWidth && imageHeight == kernelHeight)
{
Complex[,] fftConvolved = new Complex[imageWidth, imageHeight];

Complex[,] fftImage = FourierTransform.ForwardFFT(imageCopy);
Complex[,] fftKernel = FourierTransform.ForwardFFT(kernelCopy);

for (int j = 0; j < imageHeight; j++)
{
for (int i = 0; i < imageWidth; i++)
{
fftConvolved[i, j] = fftImage[i, j] * fftKernel[i, j];
}
}

convolve = FourierTransform.InverseFFT(fftConvolved);

RescaleComplex(convolve);

convolve = FourierShifter.ShiftFft(convolve);
}
else
{
throw new Exception("Padded image and kernel dimensions must be same.");
}

return convolve;
}

最佳答案

这并不是真正的难题。这只是显示范围有限和您的期望的问题,这在两种情况下是不同的。

  • (顶部):这是一个归一化的内核(其元素总计为1)。它不会改变图像的对比度。但是由于其中包含负值,它可能会生成超出原始范围的值。
  • (底部):这不是规范化的内核。它将更改输出的对比度。

  • 例如,玩转内核
     0, -1,  0
    -1, 6, -1
    0, -1, 0

    (注意中间的6)。总计为2。图像对比度将加倍。也就是说,在输入全为0的区域中,输出也为0,但是在输入全为1的区域中,输出将为2。

    通常,如果不打算改变图像对比度,则对卷积滤波器进行归一化。如果应用此类过滤器,则无需重新缩放输出以进行显示(尽管您可能希望裁剪超出范围的值(如果出现)。但是,超出范围的值可能是相关的,在这种情况下,您需要重新缩放输出以匹配显示范围。

    在您的情况2(图像内核)中,您可以对内核进行规范化,以避免重新缩放输出。但这通常不是解决方案。一些过滤器的总和为0(例如Sobel内核或Laplace内核,这两个都是基于去除DC分量的导数)。这些无法归一化,您将始终必须重新缩放输出图像以进行显示(尽管您不必重新缩放其输出以进行分析,因为它们的输出值具有在重新缩放后会被破坏的物理含义)。

    也就是说,卷积有时意味着生成与输入图像具有相同对比度(在大约相同范围内)的输出图像,有时则不是。您需要知道要为输出使用有意义的过滤器,并能够在期望图像在特定范围内的屏幕上显示输出。

    编辑:说明您的图中所发生的情况。

    第一张图:在这里您要重新缩放比例,以便可以看到整个图像强度范围。从逻辑上讲,您不会得到任何饱和像素。但是,因为矩阵内核增强了高频,所以输出图像的值超出了原始范围。重新缩放以适合显示器范围内的整个范围会降低图像的对比度。

    第二个数字:您正在通过 N = imageWidth * imageHeight重新缩放频域卷积结果。这样会产生正确的输出。您需要应用此缩放比例,这表明您的正向FFT通过 1/N进行缩放,而逆FFT不会进行缩放。

    对于 IFFT(FFT(img))==img,必须通过 1/N缩放FFT或IFFT。通常,是按比例缩放的IFFT。原因是卷积然后按预期进行,而没有任何进一步的缩放。要看到这一点,请想象一张所有像素都具有相同值的图像。 FFT(img)在所有地方都为零,除了0频率分量(DC分量)为 sum(img)。归一化内核的总和为1,因此其DC分量为 sum(kernel)==1。将这两者相乘,我们再次获得一个像输入频谱一样的频谱,其直流分量为 sum(img)。它的逆变换将等于 img。这正是我们对此卷积的期望。

    现在,使用另一种形式的规范化(即您可以访问的FFT所使用的一种)。 FFT(img)的DC组件将为 sum(img)/N。内核的DC组件将为 1/N。将这两者相乘,得到 sum(img)/(N*N)的DC分量。它的逆变换将等于 img/N。因此,您需要乘以 N以获得预期的结果。这正是在归一化的“矩阵内核”的频域卷积中所看到的。

    正如我上面提到的,“图像内核”未规范化。 FFT(kernel)的DC分量是 sum(img)/N,它与 FFT(img)的乘积有一个DC分量 sum(img)*sum(img)/(N*N),因此逆变换的对比度是 sum(img)/N的乘积,再乘以 N仍然会给您带来一个太大的 sum(img)系数。如果要标准化内核,则将其除以 sum(img),这会将您的输出带入预期的范围内。

    关于c# - FFT卷积后重新缩放复杂数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51505732/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com