Roy*_*oyi 4 signal-processing image-processing filter
有没有人知道如何计算二维滤波器的逆?
假设我有一个3x3过滤器:
0 1 0
1 1 1
0 1 0
我想发现它是反向的.使用DFT很容易.但是,我想说我想通过卷积来做到这一点.现在,这就是问题,Matlab象征性不是我的专长.假设存在3X3反向滤波器,则意味着两者的卷积将导致:
0 0 0
0 1 0
0 0 0
问题是为此创建正确的方程组并求解它.使用符号进行操作很容易思考,但我无法做到.
有任何想法吗?谢谢.
PS我不确定这个有反向滤波器,因为它的DTFT中有零.
此外,有人应该像MathOverflow一样在这个论坛中允许Latex.
设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 [nN].让这个等式表征前向系统,其中y是输出,x是输入.根据定义,当输入是脉冲时,脉冲响应是输出:h [n] = b0 d [n-0] + b1 d [n-1] + ... + bN d [nN].该脉冲响应具有有限长度N + 1.
现在,考虑逆系统,其中x是输出,y是输入.然后通过递推方程d [n] = b0 h [n] + b1 h [n-1] + ... + bN h [nN]来描述脉冲响应.等价地,b0 h [n] = d [n] - b1 h [n-1] - ... - bN h [nN].
不失一般性,假设b0和bN都是非零的.对于任何m,如果h [m]非零,则h [m + N]也非零.由于该系统具有反馈,因此其脉冲响应无限长.QED.
因果关系并不重要.延迟的倒数是提前,反之亦然.延迟或提前都不会改变脉冲响应的有限性.向左或向右移动无限脉冲响应; 它仍然是无限的.
编辑2:为了澄清,这个证明与我原来的"证据"无关.一个是频域,另一个是时域.
这基本上是问题的概括 -推导图像卷积核的逆滤波器。
给定一个卷积核 $ f \in \mathbb{R}^{m \times n} $ 找到其逆核 $ g \in \mathbb{R}^{p \times q} $ 使得 $ f \ast g = h = δ$。
人们可以构建卷积算子的矩阵形式。
矩阵形式可以复制多种图像过滤模式(独家):
使用图像过滤时,输出大小与输入大小匹配,因此矩阵形式是方阵,并且定义了逆矩阵。
使用卷积矩阵,矩阵可能不是方阵(除非选择“相同”),因此应导出伪逆矩阵。
人们应该注意到,虽然输入矩阵应该是稀疏的,但逆矩阵却不是。
此外,虽然卷积矩阵将具有特殊形式(托普利茨忽略边界条件),但其逆矩阵却不会。
因此,该解决方案比下一个解决方案更准确,但它也使用更高的自由度(该解决方案不一定是托普利茨形式)。
在此解决方案中,使用以下成本函数的最小化导出逆函数:
$$ \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 $ 是相关运算。
实际上,目标函数中的卷积是在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');
Run Code Online (Sandbox Code Playgroud)
其中代码翻转mF
为 Correaltion 并使用有效(以矩阵形式,它是伴随/转置 -> 输出更小)。
优化问题是严格凸的,可以使用梯度下降轻松解决:
for ii = 1:numIteraions
mObjFunGrad = conv2(conv2(mF, mG, 'full') - mH, mF(end:-1:1, end:-1:1), 'valid');
mG = mG - (stepSize * mObjFunGrad);
end
Run Code Online (Sandbox Code Playgroud)
完整代码可在我的StackExchnage Code StackOverflow Q2080835 GitHub 存储库中找到(查看StackOverflow\Q2080835
文件夹)。
归档时间: |
|
查看次数: |
9633 次 |
最近记录: |