在 DFT 之后如何在图像上应用过滤器?

信息处理 图像处理 傅里叶变换 卷积
2022-02-23 17:40:45

假设图像大小为 100 x 100,内核矩阵为 5x5。我对图像和内核都进行了 DFT。但是我如何将这两个矩阵相乘呢?这些乘法涉及哪些部分?真实的、想象的还是量级的?谢谢

这是我应该做的吗?我在哪些位置放置了 0 以使内核成为 100x100?

    for i to 102
            for j to 102
            {
                newReal = realImage * realKernel - imaginaryImage * imaginaryKernel
                newImaginary = realImage * imaginaryKernel + imaginaryImage * realKernel
            }

        and do InverseFourierTransform(newReal, newImaginary)
2个回答

根据您的 C++ 剪辑,在 DFT 序列样本之间进行复数乘法的正确方法应如下所示:

Z[k]=X[k]Y[k]=(a+jb)(c+jd)=(acbd)+j(ad+bc)

结果的实部是,虚部是acbdad+bc

然后你可以采取逆 2D-DFT。

请注意,对于无别名循环卷积实现,您的 DFT 长度应至少为点。然后在个点的逆 DFT 之后,丢弃前行和前 2 列,并重新获得剩余的部分,它们是过滤后的图像的样本。100+(51)/2=102×102102×1022100×100

您正在尝试通过频域中的乘法来实现卷积。

这意味着

  1. 你需要做复数乘法。不是“实数或虚数或量级”,而是复数乘法;你的信号和你的滤波器是复值的,实部和虚部一样多的信息,你不能放弃这些信息。
  2. 您的图像和内核转换必须具有相同的大小。所以,将你的内核零填充到 100×100,或者实现分段卷积(从这里开始这是一件非常复杂的事情)
  3. 你要做的是循环卷积,因为对于离散傅里叶变换,频域的乘法相当于时域的循环卷积;这与通常所说的“卷积”不同。同样,如果您需要非循环卷积,则必须实现分段卷积(寻找“重叠添加”和“重叠保存”方法。您会在任何地方找到它们用于 1D 信号,也可能用于 2D,但首先要了解一维案例!);如果您随后通过 FFT 实现 DFT,您将得到我们所说的“快速卷积”;也许这就是你想用谷歌搜索的词。