卷积、去卷积

目录

一,线性卷积

1,连续卷积

2, 离散卷积

3,卷积的性质

(1)交换律

(2)结合律

(3)分配律

(4)数乘

(5)微分

二,周期卷积

三,循环卷积

1,二维连续循环卷积

2,二维离散循环卷积

3,二维离散循环卷积的各种表示法

(1)小卷积核表示法

(2)大矩阵表示法

(3)超大矩阵表示法

(4)超大矩阵互为转置的2个卷积核

(5)超大矩阵互为转置的2个卷积核的傅里叶变换

(6)三种运算方式

四,高斯卷积

五,滤波器

六,去卷积

1,最优化问题

2,矩阵分析

3,函数形态分析

4,Chambolle-Pock算法

5,prox求解

6,矩阵运算优化

7,去傅里叶变换


一,线性卷积

1,连续卷积

设: f(x),g(x)是R1上的两个可积函数,作积分

f(t)*g(t)=\int_{-\infty}^{+\infty}f(x)g(t-x)dx

可以证明,关于几乎所有的实数x,上述积分是存在的。这样,随着x的不同取值,这个积分就定义了一个新函数h(x),称为函数fg的卷积,记为h(x)=(f*g)(x)

对于二维甚至多维空间的积分卷积,定义同理。

2, 离散卷积

和连续积分类似的,离散卷积也是两个序列所有和为固定值的元素乘积之和。

f(n)*g(n) = \sum_{i=-\infty}^{+\infty}f(i)g(n-i)

实际上,离散卷积和积分卷积的本质是一样的,可以轻松互相转化。

3,卷积的性质

(1)交换律

f * g = g * f

(2)结合律

(f*g)*h = f*(g*h)

(3)分配律

f*(g+h) = f*g+f*h

(4)数乘

a(f*g)=(af)*g=f*(ag)

(5)微分

D(f*g)=Df*g=f*Dg

对于离散卷积,D就是差分

二,周期卷积

如果2个周期函数可积,那么它的线性卷积:

f(t)*g(t)=\int_{-\infty}^{+\infty}f(x)g(t-x)dx

然而,周期函数只要都不是恒为0,上式的反常积分都是不存在的。

PS:这个反常积分的柯西主值有可能为0,但是不代表反常积分收敛。

高等数学_csuzhucong的博客-CSDN博客

而实际上,周期函数也没有必要在无穷区间上卷积,只需要在一个周期内即可。

周期函数的周期卷积:

f(t)*g(t)=\int_{0}^{T}f(x)g(t-x)dx

离散的:

f(n)*g(n) = \sum_{i=0}^{T-1}f(i)g(n-i)

三,循环卷积

对于定义域是有限区间的函数,循环卷积就是函数做周期延展之后的周期卷积。

1,二维连续循环卷积

f(t)*g(t)=\int_{0}^{t}f(x)g(t-x)dx+\int_{t}^{T}f(x)g(t-x+T)dx

从这个式子看,其实也相当于从任意位置分割成2段,分段卷积之和。

2,二维离散循环卷积

3,二维离散循环卷积的各种表示法

以卷积 \begin{pmatrix} 1 &2 &0 \\ 3 & 4& 0\\ 0& 0 & 0 \end {pmatrix} \bigotimes \begin{pmatrix} 1 &1 &0 \\ 1 & 2& 0\\ 0& 0 & 0 \end{pmatrix}= \begin{pmatrix} 1 &3 &2 \\ 4 & 11& 8\\ 3& 10 & 8 \end{pmatrix}  为例

(1)小卷积核表示法

\begin{pmatrix} 1 &2 \\ 3 & 4\end {pmatrix} \bigotimes \begin{pmatrix} a &b&c\\ d & e& f\\ g& h & i \end{pmatrix}= \begin{pmatrix} a+2c+3g+4i &b+2a+3h+4g &c+2b+3i+4h \\ d+2f+3a+4c & e+2d+3b+4a& f+2e+3c+4b\\ g+2i+3d+3f& h+2g+3e+4d & i+2h+3f+4e \end{pmatrix}

(2)大矩阵表示法

\begin{pmatrix} 1 &2 &0 \\ 3 & 4& 0\\ 0& 0 & 0 \end {pmatrix} \bigotimes \begin{pmatrix} a &b&c\\ d & e& f\\ g& h & i \end{pmatrix}= \begin{pmatrix} a+2c+3g+4i &b+2a+3h+4g &c+2b+3i+4h \\ d+2f+3a+4c & e+2d+3b+4a& f+2e+3c+4b\\ g+2i+3d+3f& h+2g+3e+4d & i+2h+3f+4e \end{pmatrix}

当我们用卷积定理,用傅里叶变换实现卷积运算,使用的就是大矩阵表示法。

(3)超大矩阵表示法

用矩阵表示:

\begin{pmatrix} 1 &0 & 2 &0 & 0 &0 & 3 & 0 &4 \\ 2 &1 & 0 &0 & 0 &0 & 4 & 3 &0 \\ 0 &2 & 1 &0 & 0 &0 & 0 & 4 &3 \\ 3 & 0 &4 &1 &0 & 2 & 0 & 0 &0 \\ 4 & 3 &0 &2 &1 & 0 & 0 & 0 &0 \\ 0 & 4 &3 &0 &2 & 1 & 0 & 0 &0 \\ 0 &0 & 0 &3 & 0 &4 &1 &0 & 2 \\ 0 &0 & 0 &4 & 3 &0 &2 &1 & 0 \\ 0 &0 & 0 &0 & 4 &3 &0 &2 & 1 \end{pmatrix}\begin{pmatrix} a\\b \\ c \\ d \\ e \\ f \\ g \\ h \\ i \end{pmatrix}=\begin{pmatrix} a+2c+3g+4i \\b+2a+3h+4g \\c+2b+3i+4h \\ d+2f+3a+4c \\ e+2d+3b+4a\\ f+2e+3c+4b\\ g+2i+3d+3f\\ h+2g+3e+4d \\ i+2h+3f+4e \end{pmatrix}

显然,矩阵的第1列是卷积结果中的a的系数,所以第1列的(1 2 0 3 4 0 0 0 0 )就是卷积核

(4)超大矩阵互为转置的2个卷积核

\begin{pmatrix} 1 &0 & 2 &0 & 0 &0 & 3 & 0 &4 \\ 2 &1 & 0 &0 & 0 &0 & 4 & 3 &0 \\ 0 &2 & 1 &0 & 0 &0 & 0 & 4 &3 \\ 3 & 0 &4 &1 &0 & 2 & 0 & 0 &0 \\ 4 & 3 &0 &2 &1 & 0 & 0 & 0 &0 \\ 0 & 4 &3 &0 &2 & 1 & 0 & 0 &0 \\ 0 &0 & 0 &3 & 0 &4 &1 &0 & 2 \\ 0 &0 & 0 &4 & 3 &0 &2 &1 & 0 \\ 0 &0 & 0 &0 & 4 &3 &0 &2 & 1 \end{pmatrix}

这个矩阵的转置的第1列是(1 0 2 0 0 0 3 0 4)​​​​​​​

所以,大矩阵表示法\begin{pmatrix} 1 &2 &0 \\ 3 & 4 & 0\\ 0 &0 &0 \end{pmatrix}和大矩阵表示法\begin{pmatrix} 1 &0&2 \\ 0 &0 &0\\3 & 0 & 4 \end{pmatrix}所对应的超大矩阵表示法互为转置。

考虑到这是循环卷积,我们可以说2个大矩阵关于原点对称。

(5)超大矩阵互为转置的2个卷积核的傅里叶变换

\begin{pmatrix} 1 &2 &0 \\ 3 & 4 & 0\\ 0 &0 &0 \end{pmatrix}\begin{pmatrix} 1 &0&2 \\ 0 &0 &0\\3 & 0 & 4 \end{pmatrix}

把他们用fftshift 变成:

\begin{pmatrix} 0 &0 &0 \\ 0 & 1 & 2\\ 0 &3 &4 \end{pmatrix}\begin{pmatrix} 4 &3&0\\ 2 &1&0\\0 & 0 & 0 \end{pmatrix},就是互为中心对称的关系。

所以,超大矩阵表示法互为转置的2个卷积核,他们的傅里叶变换互为共轭复数。

(6)三种运算方式

小卷积核对应的是卷积运算,大矩阵表示法对应的是傅里叶变换,超大矩阵表示法对应的是矩阵乘法。

显然超大矩阵表示法的矩阵乘法是最慢的。

卷积运算和傅里叶变换的速度差不多,傅里叶变换的时间复杂度为O(N^2 logN),所以哪个快取决于卷积核的大小。小的卷积核卷积运算快,大的卷积核傅里叶变换运算快。

四,高斯卷积

 如果指定g为高斯函数,那么卷积f*g就是f的高斯卷积。

常见的就是一维和二维的高斯函数,即一维和二维的正态分布。

如5*5的高斯卷积

五,滤波器

用卷积作为滤波器,也称核函数。

空间滤波器_csuzhucong的博客-CSDN博客

六,去卷积

1,最优化问题

考虑到噪声的影响,去卷积可以表示成最优化问题:

argmin_i(||Bi-j||_2^2+\lambda\sum_{a=1}^5||H_ai||_1)

其中B是卷积核,i是原图,j是模糊图,卷积矩阵H{1,2}表示一阶导数,而H{3...5}表示二阶导数。

即,H是常数矩阵,λ是超参,B和j是输入,i是求解的输出项。

表达式变形:

argmin_x(||Sx||_1+||Bx-j||_2^2),其中S=\begin{bmatrix} \lambda_1H_1\\ \lambda_2H_2 \\ \lambda_3H_3 \\ \lambda_4H_4 \\ \lambda_5H_5 \end{bmatrix}是一个常数矩阵。

2,矩阵分析

假设x和j是n行m列的图像转化而来的列向量,即n*m行1列的矩阵,那么B是一个n*m行n*m列的方阵,H1到H5也是如此。

所以,S是一个n*m*5行n*m列的常数矩阵。

3,函数形态分析

argmin_x(||Sx||_1+||Bx-j||_2^2)可以表示成argmin_x(f(x))+g(Ax))

其中g(x)=||x||_1是凸函数,f(x)=||Bx-j||_2^2也是凸函数,A=S是常数矩阵

这样,我们就可以用一阶原始对偶Chambolle-Pock算法来求解了。

4,Chambolle-Pock算法

参考Chambolle-Pock算法

solve min f(x)+g(Ax)
solve min h(x) max h(z) , which h(x,z)=f(x)-g_conjugate(z)+z^T * A * x

其中g_conjugate就是g的共轭函数g*

求解方法:

先输入初始值x和z,然后初始化y=x,然后反复调用迭代公式:

所以,主要运算量在4个部分:Ay、ATz、prox g*内部、prox f内部。

5,prox求解

这里,g(x)=||x||_1,所以prox_{t,g^*}(x)=\frac{x}{max\{1,|x|\}}

同样的,f(x)=||Bx-j||_2^2,所以 (2aB^TB+E)prox_{a,f}(x)=2aBj+x

所以,主要运算量在3个部分:Ay、ATz、prox f内部,

而prox f内部又包括 分子Bj、分母BTB、分母逆、分子乘以分母逆。

6,矩阵运算优化

如果采用通用的Chambolle-Pock算法去求解,时间复杂度是非常大的,因为A和B都是超大矩阵。

假如j是1000*1000的图片,100万像素,那么仅仅是Bj这个乘法运算,就需要1万亿次运算。

而prox f内部则更复杂。

解决办法:把超大矩阵表示法换成大矩阵表示法,再用卷积定理。

(1)prox f内部

B是n*m行n*m列的矩阵,j是n*m行1列的矩阵(列向量),由于B本身就是卷积转化而来,所以Bj可以表示成2个n行m列的矩阵的卷积,从而利用卷积定理(傅里叶变换)来完成计算。

同样的,2aB^TB + E也是某个矩阵对应的卷积,所以(2aB^TB+E)prox_{a,f}(x)=2aBj+x可以表示成F(prox_{a,f}(x))=\frac{F(2aBj+x)}{F(2aB^TB+E)}

其中F是傅里叶变换。

(2)Ay、ATz

首先是Ay,和Bj是一样的,用卷积定理(傅里叶变换)来完成计算。

其次是求AT,矩阵的转置固然好求,但是A太大了。

由于AT出现的唯一的地方就是AT和z的乘法,所以我们把问题转化成在求Ay的方法的基础上,略改一下就变成了求ATz,直接省掉AT的求解。

在《二维离散循环卷积的各种表示法》中我们已经有了结论,A和AT的傅里叶变换互为共轭复数。

7,去傅里叶变换

傅里叶变换的时间复杂度为O(N^2 logN)

在卷积核远远小于图片尺寸的情况下,卷积运算比傅里叶运算快。

这里涉及的卷积核有2种,一是模糊核,稍微大一点,二是微分,一阶是1*2,二阶是2*2

所以,把微分卷积涉及傅里叶变换的运算,换成卷积运算,理论上更快。

那么,如果Ay这个卷积直接运算而不用傅里叶变换,ATz又该怎么表示呢?

在《二维离散循环卷积的各种表示法》中我们同样已经有了结论,A和AT关于原点对称。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值