有没有人知道如何计算二维滤波器的逆?
假设我有一个3x3过滤器:
0 1 0
1 1 1
0 1 0
我想发现它是相反的。
使用DFT很容易。
但是,我想说我想通过卷积来做到这一点。
现在,这就是问题,Matlab象征性不是我的专长。
假设有一个3X3反向滤波器,则意味着两者的卷积将导致:
0 0 0
0 1 0
0 0 0
问题是为此创建正确的方程组并解决它。
使用符号进行操作很容易思考,但我无法做到。
有什么想法吗? 感谢。
P.S。 我不确定是否有一个反向过滤器,因为它的DTFT中有零。
此外,有人应该像MathOverflow一样在这个论坛中使用Latex。
答案 0 :(得分:5)
令h [n]为1D滤波器的有限脉冲响应。这意味着它的逆滤波器意味着什么?反转不可能是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] + ... + bN d [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] - ... - bN h [n-N]。
不失一般性,假设b0和bN都是非零的。对于任何m,如果h [m]非零,则h [m + N]也非零。由于该系统具有反馈,因此其脉冲响应无限长。 QED。
因果关系并不重要。延迟的倒数是提前,反之亦然。延迟或提前都不会改变脉冲响应的有限性。向左或向右移动无限脉冲响应;它仍然是无限的。
编辑2:为了澄清,此证明与我原来的“证据”无关。一个是频域,另一个是时域。
答案 1 :(得分:3)
在实践中,一个有用的解决方案是Wiener deconvolution http://en.wikipedia.org/wiki/Wiener_deconvolution,它基本上在傅立叶空间中除以给定滤波器的频谱。通过添加软糖项来处理零:代替1 / H(w),使用H(w)/(abs(H(w))^ 2 + c)其中H(w)是滤波器的离散傅立叶变换h(x)(根据需要添加第二维),“w”应该是欧米茄。基于信号或图像的噪声水平选择常数。
答案 2 :(得分:1)
对于可分离滤波器(即,您可以拉出水平和垂直滤波器,可以按任何顺序应用并提供与复合2-D滤波器相同的结果),您可以尝试计算逆每个人都是单独的。
滤波器H(w)的倒数是G(w)= 1 / H(w),所以一种方法是采用脉冲响应(h [n]时域系数)和逆-DFT他们。获得这样一个滤波器的解析表达式并不总是那么容易,所以你可以用数字计算它(近似于所需的精度)或者做自适应逆滤波,正如史蒂夫建议的那样。有关后一种方法的更多信息,请参阅Widrow和Stearn的Adaptive Signal Processing。
答案 3 :(得分:1)
一种方法是使用过滤器编写卷积的矩阵表示,然后尝试查找该矩阵的一些(正规化)逆。
例如1D [1,-1]滤波器可能是存在的最简单的离散微分逼近。
其矩阵将在主对角线上有两个对角线1,在第一个对角线上有-1。
相反的是积分滤波器。无限尾迹为1s的IIR滤波器。由于矩阵的大小有限,因此实际上意味着在对角线的一侧到处都用1s填充矩阵。
答案 4 :(得分:0)
这基本上是问题的概括-Deriving the Inverse Filter of Image Convolution Kernel。
给出一个卷积核$ f \ in \ mathbb {R} ^ {m \ timesn} $找到其逆内核,$ g \ in \ mathbb {R} ^ {p \ times q} $这样$ f \ ast g = h = \ delta $。
可以构建卷积运算符的矩阵形式。
矩阵表单可以复制各种模式的图像过滤(独家):
使用“图像过滤”时,输出大小与输入大小匹配,因此矩阵形式为正方形,并且定义了逆。
使用卷积矩阵,矩阵可能不是正方形(除非选择“相同”),因此应推导伪逆。
请注意,虽然输入矩阵应该是稀疏的,但逆矩阵不是。
而且,尽管卷积矩阵将具有特殊形式(Toeplitz忽略边界条件),但反之不会。
因此,此解决方案比下一个解决方案更准确,但同时也使用了更高的自由度(该解决方案不一定是Toeplitz形式)。
在此解决方案中,通过最小化以下成本函数得出逆:
$$ \ arg \ min_ {g} \ frac {1} {2} {\ left \ | f \ ast g-h \ right \ |} _ {2} ^ {2} $$
导数由:
$$ \ frac {\ partial \ frac {1} {2} {\ left \ | f \ ast g-h \ right \ |} _ {2} ^ {2}} {\ partial g} = f \ star \ left(f \ ast g-h \ right)$$
其中$ \ star $是Correlation操作。
实际上,目标函数中的卷积是在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
处翻转以进行校正并使用有效(矩阵形式为Adjoint / Transpose->输出较小)。
优化问题是严格凸的,可以使用Gradient Descent轻松解决:
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中提供了完整的代码。