代码之家  ›  专栏  ›  技术社区  ›  Royi

图像卷积核逆滤波器的推导

  •  4
  • Royi  · 技术社区  · 15 年前

    有人知道如何计算二维滤波器的倒数吗?

    假设我有一个3x3过滤器:
    0 1 1
    1 1 1
    0 1 1
    我想知道它是反的。 使用DFT很容易。 但假设我想通过卷积来实现。 这就是问题所在,Matlab符号不是我的专长。 假设有3x3反向滤波器,这意味着这两个滤波器的卷积将导致:
    0 0 0
    0 1 1
    0 0 0
    问题是要为它创建一组正确的方程组并解决它。 用符号来做是很容易想到的,但我做不到。

    有什么想法吗? 谢谢。

    附笔。 我不确定这个滤波器是否有反滤波器,因为它的DTFT中有零。

    此外,有人应该像MathOverflow一样允许在这个论坛使用乳胶。

    5 回复  |  直到 6 年前
        1
  •  5
  •   Steve Tjoa    15 年前

    设h[n]为一维滤波器的有限脉冲响应。它的逆滤波器意味着什么?倒数不可能是fir。

    证明:假设h(ω)g(ω)=1表示所有ω,其中h是h[n]的dtft,g是g[n]的dtft。如果h[n]是fir,那么g[n]必须是iir。

    当然,有办法 近似 带FIR滤波器的逆IIR滤波器。一种基本方法是自适应滤波,例如最小均方(LMS)算法。或者只是截断IIR过滤器。不过,你仍然需要担心稳定性。

    出于实际目的,可能没有合适的解决方案来解决您的具体问题。例如,如果这是在图像处理中,而您正试图用FIR锐化滤镜反转FIR模糊滤镜。最终的图像看起来不会那么好,周期,除非你的锐化滤镜真的,真的很大。

    编辑:设y[n]=b0 x[n-0]+b1 x[n-1]+…+BN x[N-n]。让这个方程描述正向系统,其中y是输出,x是输入。根据定义,脉冲响应是输入为脉冲时的输出:h[n]=b0 d[n-0]+b1 d[n-1]+…+BND[N-N]。这种脉冲响应的长度是有限的n+1。

    现在,考虑一个逆系统,其中x是输出,y是输入。然后用递推方程d[n]=b0 h[n]+b1 h[n-1]+…+BN-H[N-N]。等效地,b0 h[n]=d[n]-b1 h[n-1]-…-BNH[N-N]。

    在不失去一般性的情况下,假设b0和bn都是非零的。对于任何m,如果h[m]不为零,则h[m+n]也不为零。因为这个系统有反馈,所以它的脉冲响应是无限长的。QED。

    因果关系无关紧要。延迟的倒数是提前,反之亦然。延迟或提前都不会改变脉冲响应的有限性。将无限脉冲响应向左或向右移动;它仍然是无限的。

    编辑2:为了澄清,此证明与我的原始“证明”无关。一个在频域,另一个在时间域。

        2
  •  3
  •   DarenW    15 年前

    在实践中,一个有用的解决方案是维纳反褶积。 http://en.wikipedia.org/wiki/Wiener_deconvolution 基本上,在傅立叶空间中,除以给定滤波器的频谱。零是通过添加一个混合项来处理的:而不是1/h(w),使用h(w)/(abs(h(w))^2+c),其中h(w)是滤波器h(x)的离散傅立叶变换(根据需要添加第二个维),“w”应该是ω。根据信号或图像的噪声级选择常数。

        3
  •  1
  •   metal    15 年前

    对于一个可分离的过滤器(即,你可以拉出一个水平和垂直的过滤器,它可以以任何顺序应用,并给出与复合二维过滤器相同的结果),你可以尝试单独计算每个过滤器的倒数。

    滤波器h(w)的倒数是g(w)=1/h(w),因此,一种方法是获取脉冲响应(h[n]时域系数)并对其进行反DFT。要得到这样一个滤波器的解析表达式并不总是容易的,所以你可以用数值计算(近似于所需的精度)或者像史蒂夫建议的那样做自适应逆滤波。见威德罗和斯登的 Adaptive Signal Processing 有关后一种方法的更多信息。

        4
  •  1
  •   mathreadler    6 年前

    一种方法是用你的滤波器写一个卷积的矩阵表示,然后尝试找到这个矩阵的一些(正则化的)逆矩阵。

    例如,1d[1,-1]滤波器可能是存在的最简单的离散微分近似。

    它的矩阵在主对角线上有两条对角线1,在第一条对角线上有-1。

    它的反方向是积分滤波器。一个无限轨迹为1s的IIR滤波器。由于我们的矩阵的大小有限,这实际上意味着在对角线的一侧用1s填充矩阵。

        5
  •  0
  •   Royi    6 年前

    求给定二维卷积核的逆核

    这基本上是这个问题的概括。- Deriving the Inverse Filter of Image Convolution Kernel .

    问题的形成

    给定卷积核$f\in\mathbb r m\times n$find其逆核$g\in\mathbb r p\times q$f\ast g=h=\delta$。

    解决方案I

    我们可以建立卷积算子的矩阵形式。
    矩阵形式可以复制各种模式的图像过滤(不包括):

    • 边界条件(用于填充图像并在有效模式下应用卷积)。
      • 零填充 用零填充图像。
      • 圆形的
        使用图像的循环/周期延续。 匹配频域卷积。
      • 复制
        复制边缘值(最近的邻居)。
        通常在现实世界中创建最少的工件。
      • 对称的
        沿边缘镜像图像。
    • 卷积形状
      • 满 输出大小完全为-$\Left(M+P-1\ Right)\Times\Left(N+Q-1\ Right)$。
      • 同样
        输出大小与输入大小相同(“图像”)。
      • 有效的
        输出大小是图像和内核完全重叠的大小。

    当使用图像过滤时,输出大小与输入大小匹配,因此矩阵形式是方形的,并且定义了逆矩阵。
    使用卷积矩阵,矩阵可能不是方形的(除非选择“相同的”),因此应导出伪逆矩阵。

    应该注意的是,虽然输入矩阵应该是稀疏的,但逆矩阵却不是。
    此外,虽然卷积矩阵将具有特殊形式(托普里茨忽略边界条件),但逆矩阵将不会。
    因此,该解决方案比下一个解决方案更准确,但它也使用更高的自由度(该解决方案不一定是Toeplitz形式)。

    解决方案二

    在此解决方案中,使用以下成本函数的最小化来推导逆函数:

    $$\arg\min g \ frac 1 2 \ left \ f \ ast g-h \ right \ 2 2$$

    导数由以下公式给出:

    $$\frac \部分\部分1 2 \左F \ ast g-h \右2 \部分g=f \星\左(f \ ast g-h \右)$$

    其中,$\star$是相关操作。

    在实践中,目标函数的卷积是在 full 模式(matlab习语)。
    实际上是这样做的:

    hObjFun     = @(mG) 0.5 * sum((conv2(mF, mG, 'full') - mH) .^ 2, 'all');
    mObjFunGrad = conv2(conv2(mF, mG, 'full') - mH, mF(end:-1:1, end:-1:1), 'valid');
    

    代码翻转的位置 mF 对于腐蚀和使用有效(矩阵形式为伴随/转置->输出较小)。

    优化问题是严格凸的,使用梯度下降很容易解决:

    for ii = 1:numIteraions
        mObjFunGrad = conv2(conv2(mF, mG, 'full') - mH, mF(end:-1:1, end:-1:1), 'valid');
        mG          = mG - (stepSize * mObjFunGrad);
    end
    

    我的 StackOverflow Q2080835 GitHub Repository .