OpenCV图像滤波的数学原理

令输入图像对应的像素矩阵为F,在第x行y列的像素值为f(x,y);输出图像对应的像素矩阵为H,在第x行y列的像素值为h(x,y)。设图像滤波的核矩阵为K,在第xy列位置的元素为k(x,y)。则滤波后的图像H为原图像F与核K的卷积,满足以下关系式:


H=F*K

线性滤波

当锚点位于核的中心点时(anchor参数为默认的Point(-1,-1)),在第xy列的输出像素值h(x,y)满足以下公式:


\begin{aligned}
h(x,y)&=(f*k)(x,y)\\
&=\sum_{i=-r}^{r}\sum_{j=-c}^{c}f(x-i,y-j)k(r+i,c+j)
\end{aligned}

其中r,c分别是核K的行数和列数的一半向下取整。

方框滤波/均值滤波

表达式

方框滤波和均值滤波的核是一致的,主要区别是要不要归一化处理。均值滤波就是方框滤波归一化后的特殊情况,核表示如下:


K=\frac1{w_Kh_K}\begin{bmatrix}
1 & 1 & \cdots & 1\\
1 & 1 & \cdots & 1\\
\vdots & \vdots & \ddots & \vdots\\
1 & 1 & \cdots & 1
\end{bmatrix}

其中w_K、h_K分别是核K的宽和高。方框滤波的核为全1矩阵,没有前面的系数。

示例

举例说明,使用Size(3,1),即宽为3,高为1的核,核表示如下:


K=\frac13\begin{bmatrix}
1 & 1 & 1
\end{bmatrix}

假设边界模式为填0补充。输入矩阵F是宽为10,高为1的突变值矩阵:


F=\begin{bmatrix}
1&1&1&255&255&255&255&1&1&1
\end{bmatrix}

则输出矩阵H为:


\begin{aligned}
H&=\frac13\begin{bmatrix}\begin{bmatrix}
0&1&1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
1\\
1
\end{bmatrix} & \begin{bmatrix}
1&1&1
\end{bmatrix}\cdot\begin{bmatrix}
1\\
1\\
1
\end{bmatrix} & \begin{bmatrix}
1&1&255
\end{bmatrix}\cdot\begin{bmatrix}
1\\
1\\
1
\end{bmatrix} & \cdots & \begin{bmatrix}
1&1&0
\end{bmatrix}\cdot\begin{bmatrix}
1\\
1\\
1
\end{bmatrix}
\end{bmatrix}\\
&=\frac13\begin{bmatrix}
2&3&257&511&765&765&511&257&3&2
\end{bmatrix}\\
&\approx\begin{bmatrix}
1&1&86&170&255&255&170&86&1&1
\end{bmatrix}
\end{aligned}

由于opencv中的图像通常以uchar存储,因此最后的结果以四舍五入的整数表示。 从数据分布上来说,输入矩阵从1突变到255,输出矩阵将其过程变得更加平滑了。

高斯滤波

高斯滤波表达式

高斯滤波的核服从当\mu_1=\mu_2=0时的二维标准正态分布N(0,0,\sigma_1^2,\sigma_2^2,0)N(0,0,\sigma_1^2,\sigma_2^2,0)公式为


g(x,y)=\frac1{2\pi\sigma_1\sigma_2}e^{-(\frac{x^2}{2\sigma_1^2}+\frac{y^2}{2\sigma_2^2})}

由于最终需要归一化,因此我们可以直接忽略上式的常数项的影响,则高斯滤波的核k(x,y)可表示为


k(x,y)=e^{-(\frac{x^2}{2\sigma_1^2}+\frac{y^2}{2\sigma_2^2})}

高斯滤波的可乘性

特别的,当核的宽为1时,y=0,高斯滤波的核服从一维正态分布N(0,\sigma^2)。此时高斯滤波的核公式为


k(x,0)=k_X(x)=e^{-\frac{x^2}{2\sigma^2}}

此时高斯滤波的核展现为列向量:


K_X=\begin{bmatrix}
k_X(-\frac{h_K-1}2)\\
\vdots\\
K_X(-1)\\
k_X(0)\\
k_X(1)\\
\vdots\\
k_X(\frac{h_K-1}2)
\end{bmatrix}

同理,当核的高为1时,x=0,高斯滤波的核服从一维正态分布N(0,\sigma^2)。此时高斯滤波的核公式和核展现为


k(0,y)=k_Y(y)=e^{-\frac{y^2}{2\sigma^2}}


K_Y=\begin{bmatrix}
k_Y(-\frac{w_K-1}2) & \cdots & k_Y(-1) & k_Y(0) & k_Y(1) & \cdots & k_Y(\frac{w_K-1}2)
\end{bmatrix}

由于二维正态分布的独立性,二维高斯滤波的核可以视为其边缘分布,也就是在X方向和Y方向的核的乘积。即


k(x,y)=k_X(x)k_Y(y)


K=K_X*K_Y(乘号两边不可交换)

因此在实践中,我们可以通过分别计算出X方向和Y方向的核,然后进行矩阵乘法得到高斯滤波的核。

高斯滤波与均匀滤波的关系

由于高斯滤波的独立性,我们可以研究一维高斯滤波与均值滤波的关系,从而推出二维条件下的关系。 我们可以发现,当高斯滤波的标准差\sigma\rightarrow\infty,高斯滤波的核趋近于1,此时高斯滤波的结果就趋近于均值滤波的结果。在这个意义上,我们可以认为均值滤波是高斯滤波在标准差趋近于无穷大下的一个特例。

非线性滤波

非线性滤波没有统一公式,按具体滤波类型而定。

中值滤波

中值滤波比较简单,为在一定大小的核中取中间值。本文略过。

平方和滤波

平方和滤波的表达式

平方和滤波的表达式为


h(x,y)=\frac{\sum_{i=1}^{h_K}\sum_{j=1}^{w_K}f^2(i,j)}{h_Kw_K}

平方和滤波的非线性

平方和滤波在OpenCV中的接口为sqrBoxFilter,方框滤波在OpenCV中的接口为boxFilter,然而一个是非线性滤波,另一个是非线性滤波。平方和滤波在值域上没有叠加性,即对于任意两个同核区域的h_1(x,y)h_2(x,y)


h_1(x,y)+h_2(x,y)=\frac{\sum_{i=1}^{h_K}\sum_{j=1}^{w_K}(f_1^2(i,j)+f_2^2(i,j))}{h_Kw_K}\not=\frac{\sum_{i=1}^{h_K}\sum_{j=1}^{w_K}(f_1(i,j)+f_2(i,j))^2}{h_Kw_K}

所以平方和滤波是非线性滤波。

双边滤波

双边滤波的原理

双边滤波的原理见此篇文章:Bilateral Filtering for Gray and Color Images

基于高斯滤波的双边滤波

文章给出了基于高斯滤波的双边滤波情况(The Gaussian Case)。在该情况下,输出矩阵h(\mathbf{x})


h(\mathbf{x})=\frac{\int_{-\infty}^\infty\int_{-\infty}^\infty f(\mathbf\xi)\exp(-\frac{(\mathbf\xi-\mathbf x)^2}{2\sigma_d^2})\exp(-\frac{(f(\mathbf\xi)-f(\mathbf x))^2}{2\sigma_r^2})d\mathbf\xi}{\int_{-\infty}^\infty\int_{-\infty}^\infty\exp(-\frac{(\mathbf\xi-\mathbf x)^2}{2\sigma_d^2})\exp(-\frac{(f(\mathbf\xi)-f(\mathbf x))^2}{2\sigma_r^2})d\mathbf\xi}

需要注意的是,原文章和上式中的\mathbf x\mathbf\xi都是二维向量,且上述讨论均是在连续条件下。我们假设\mathbf\xi=(i,j),\mathbf x=(x,y),则在离散情况下,上式变为


h(x,y)=\frac{\sum_{i,j}f(i,j)\exp(-\frac{(i-x)^2+(j-y)^2}{2\sigma_d^2})\exp(-\frac{(f(i,j)-f(x,y))^2}{2\sigma_r^2})}{\sum_{i,j}\exp(-\frac{(i-x)^2+(j-y)^2}{2\sigma_d^2})\exp(-\frac{(f(i,j)-f(x,y))^2}{2\sigma_r^2})}

将上式中分母的两个\exp表达式分别用变量w_s,w_r表示,分别称为空间域核和值域核,则


\begin{aligned}
w_s(\mathbf\xi,\mathbf x)&=e^{-\frac{(\mathbf\xi-\mathbf x)^2}{2\sigma_d^2}}\\
w_r(\mathbf\xi,\mathbf x)&=e^{-\frac{(f(\mathbf\xi)-f(\mathbf x))^2}{2\sigma_r^2}}\\
w_s(i,j,x,y)&=e^{-\frac{(i-x)^2+(j-y)^2}{2\sigma_d^2}}\\
w_r(i,j,x,y)&=e^{-\frac{(f(i,j)-f(x,y))^2}{2\sigma_r^2}}
\end{aligned}

令双边滤波的核w=w_s\times w_r,则


h(\mathbf x)=\frac{\sum_{\mathbf\xi}f(\mathbf\xi)w(\mathbf\xi,\mathbf x)}{\sum_{\mathbf\xi}w(\mathbf\xi,\mathbf x)}=\frac{\sum_{\mathbf\xi}f(\mathbf\xi)w_s(\mathbf\xi,\mathbf x)w_r(\mathbf\xi,\mathbf x)}{\sum_{\mathbf\xi}w_s(\mathbf\xi,\mathbf x)w_r(\mathbf\xi,\mathbf x)}

双边滤波的核性质

观察双边滤波的空间域核w_s,可以发现其满足高斯滤波,因此图像有降噪的性质。值域核w_r,当选取点与原点的值越接近时,值域核趋近于1,该像素点的权重越大;当选取点与原点的值越远时,值域核趋近于0,该像素点的权重越小。因此双边滤波在保持图像边界上具有良好效果。需要注意的是,OpenCV提供的bilateralFilter函数中,有个入参d,表示邻域直径,这意味着对于上式中的任意\mathbf\xi(i,j)的选取,需要满足以下条件:


||\mathbf\xi-\mathbf x||=\sqrt{(i-x)^2-(j-y)^2}<\frac d2

也就是说,双边滤波的核是圆形。 问:为什么使用圆形核,而不是较为容易操作的方框核进行双边滤波?

双边滤波示例

我们令


F_1=\begin{bmatrix}
1&1&1&255&255&255&255&1&1&1
\end{bmatrix}


F_2=\begin{bmatrix}
1&1&1&255&255&255&255&1&1&1\\
1&1&1&255&255&255&255&1&1&1\\
1&1&1&255&255&255&255&1&1&1
\end{bmatrix}


F_3=\begin{bmatrix}
3 &10  & 6 &248 &254 &253& 245 &  3  & 5 &  9\\
4 &  3  & 3 &248 &246 &241& 253  & 2  & 8  & 2\\
10 &  5 & 10 &241& 245 &247& 240 &  5 &  8 &  2
\end{bmatrix}

选取直径d=5,标准差\sigma_d=\sigma_r=10,则


H_1=F_1=\begin{bmatrix}
1&1&1&255&255&255&255&1&1&1
\end{bmatrix}


H_2=F_2=\begin{bmatrix}
1&1&1&255&255&255&255&1&1&1\\
1&1&1&255&255&255&255&1&1&1\\
1&1&1&255&255&255&255&1&1&1
\end{bmatrix}


H_3=\begin{bmatrix}
5&   5&   6& 247& 248& 249& 246&   5&   5&   5\\
5&   5&   5& 247& 247& 245& 249&   4&   6&   5\\
5&   6&   6& 246& 246& 247& 244&   5&   5&   6
\end{bmatrix}

我们可以发现,对于非常均匀的图像,双边滤波后的图像与原图像非常接近,很好的保持了图像的边界,同时消除了边界内部的噪点。符合讨论的双边滤波的性质。

全部评论

相关推荐

ldyllic:飞神,985+美团+腾讯+京东,无敌飞飞神
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务