OpenCV——图像平滑

每一幅图像都包含某种程度的噪声,噪声可以理解为由一种或者多种原因造成的灰度值的随机变化,如由光子通量的随机性造成的噪声等,在大多数情况下,通过平滑技 术(也常称为滤波技术)进行抑制或者去除,其中具备保持边缘(Edge Preserving)作 用的平滑技术得到了更多的关注。

常用的平滑处理算法包括基于二维离散卷积的高斯平滑、均值平滑;

基于统计学方法的中值平滑;

具备保持边缘作用的平滑算法的双边滤波、导向滤波等;

5.1 二维离散卷积

在介绍基于二维离散卷积的平滑算法之前,有必要详细介绍一下二维离散卷积的定义及其性质。

\boldsymbol{I}=\left(\begin{array}{ll}{1} & {2} \\ {3} & {4}\end{array}\right)  ,\boldsymbol{K}=\left(\begin{array}{cc}{-1} & {-2} \\ {2} & {1}\end{array}\right)

那么I K 的二维离散卷积的计算步骤如下

第一步:K 逆时针翻转180 °:

\boldsymbol{K}_{\text { flip }}=\left(\begin{array}{cc}{1} & {2} \\ {-2} & {-1}\end{array}\right)

第二步:K f lip沿着I 按照先行后列的顺序移动,每移动到一个固定位置,对应位置就相乘,然后求和。为了方便演示整个过程,将矩阵I K f lip的数值依次放入栅格中, 过程如下:

OpenCV——图像平滑_第1张图片

在移动过程中,将对应位置积的和依次存入矩阵Cfull中,即

\left(\begin{array}{rrr}{-1} & {-4} & {-4} \\ {-1} & {-5} & {-6} \\ {6} & {11} & {4}\end{array}\right)

该矩阵就是I K“full卷积的结果,用符号★表示,记Cfull=IK,其中K 通常称为卷积核,或者卷积掩码,或者卷积算子。

1、计算full 卷积的矩阵形式

第一步:在IK的右侧与下侧填充零,将其尺寸扩展到H×W,其中H=H1+H2 -1,W=W1+W2 -1,扩展后的新矩阵记为I pK p,即

I_{p}(r, c)=\left\{\begin{array}{ll}{I(r, c),} & {0 \leqslant r<H_{1}, 0 \leqslant c<W_{1}} \\ {0,} & {\text { else }}\end{array}\right.K_{p}(r, c)=\left\{\begin{array}{ll}{K(r, c),} & {0 \leqslant r<H_{2}, 0 \leqslant c<W_{2}} \\ {0,} & {\text { else }}\end{array}\right.

利用矩阵的形式计算上面提到的示例,因为I K 的尺寸均是2×2,所以full卷积的尺

寸为(2+2-1×2+2-1=33)。

首先,按照第一步对两者进行补0,可得到:

I_{p}=\left(\begin{array}{lll}{1} & {2} & {0} \\ {3} & {4} & {0} \\ {0} & {0} & {0}\end{array}\right)K_{p}=\left(\begin{array}{ccc}{-1} & {-2} & {0} \\ {2} & {1} & {0} \\ {0} & {0} & {0}\end{array}\right)

第二步:I p按行堆叠,重构成一个(H*W×1的列向量ip。步骤是,将I p的第一行转置,使之成为ip的最上面的W 个元素,然后将其他行转置,依次放在下面。

                                                              \left(\begin{array}{l}{1} \\ {2} \\ {0} \\ {0} \\ {3} \\ {4} \\ {0} \\ {0} \\ {0} \\ {0}\end{array}\right)

第三步:构造循环矩阵

G_{r}=\left(\begin{array}{cccc}{K_{p}(r, 0)} & {K_{p}(r, W-1)} & {\dots} & {K_{p}(r, 1)} \\ {K_{p}(r, 1)} & {K_{p}(r, 0)} & {\dots} & {K_{p}(r, 2)} \\ {\vdots} & {\vdots} & {\vdots} & {\vdots} \\ {K_{p}(r, W-1)} & {K_{p}(r, W-2)} & {\cdots} & {K_{p}(r, 0)}\end{array}\right)

OpenCV——图像平滑_第2张图片

第四步:以第三步得到的H个循环矩阵为块矩阵,构造块循环矩阵G,即

G=\left(\begin{array}{cccc}{G_{0}} & {G_{H-1}} & {\cdots} & {G_{1}} \\ {G_{1}} & {G_{0}} & {\cdots} & {G_{2}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {G_{H-1}} & {G_{H-2}} & {\cdots} & {G_{0}}\end{array}\right),将Gr 按照第三步那样循环构造;

OpenCV——图像平滑_第3张图片

然后,根据第二、三、四步分别构造ipG,根据第五步计算C,可得到:

OpenCV——图像平滑_第4张图片

最后,根据第六步,将C 转换成一个33列的矩阵,即

\boldsymbol{C}_{\text { full }}=\left(\begin{array}{ccc}{-1} & {-4} & {-4} \\ {-1} & {-5} & {-6} \\ {6} & {11} & {4}\end{array}\right)

显然,得到的结果和按照full卷积的定义得到的结果是相同的。

2、valid卷积

full卷积的计算过程可知,如果K f lip靠近I 的边界,那么就会有部分延伸到I 之外而导致访问到未定义的值,忽略边界,只是考虑I 能完全覆盖K f lip内的值的情况,该过程称为valid卷积。还是上面提到的示例,满足情况的只有

OpenCV——图像平滑_第5张图片所以该示例中的I K valid卷积C valid=5 )。

3、same卷积

为了使得到的卷积结果和原图像的高、宽相等,所以通常在计算过程中给K f lip指定一个锚点,然后将锚点循环移至图像矩阵的(rc)处,其中0≤r<H10≤c<W1,接下来对应位置的元素逐个相乘,最后对所有的积进行求和作为输出图像矩阵在

rc)处的输出值。这个卷积过程称为same卷积,用符号★表示

OpenCV——图像平滑_第6张图片

将得到的每一个值按照行列的顺序存入矩阵中,即为same卷积的结果:C same=\left(\begin{array}{cc}{-5} & {-6} \\ {11} & {4}\end{array}\right)

same卷积是full卷积的一部分,而如果valid卷积存在,那么valid卷积是same卷积的一部分。

对于full卷积和same卷积,矩阵I 边界处的值由于缺乏完整的邻接值,因此卷积运算在这些区域需要特殊处理,方法是进行边界扩充,有如下几种常用方式。

1) 在矩阵 I 边界外填充常数,通常进行的是0扩充。

2) 通过重复 I 边界处的行和列,对输入矩阵进行扩充,使卷积在边界处可计算。

3) 卷绕输入矩阵,即矩阵的平铺。

4) 以矩阵边界为中心,令矩阵外某位置上未定义的灰度值等于图像内其镜像位置的灰度值,这种处理方式会令结果产生最小程度的干扰。

5.1.2 可分离卷积核

其中kernel i的尺寸均比Kernel小,1≤i≤n,则称该卷积核是可分离的。

可以看出卷积运算是非常耗时的,而且随着卷积核尺寸的增大耗时会越来越多。如果Ker nel可分离为一维水平方向上的1×W2的卷积核和一维垂直方向上的H2 ×1的卷积核,或者分离为一维垂直方向上的H2 ×1的卷积核和一维水平方向上的1×W2卷积核,则可使卷积运算量减少到(H1 *W1*H2+C2),这里就体现出了分离性卷积核的优势。

5.2高斯滤波

假设构造宽(列数)为W、高(行数)为H的高斯卷积算子gaussKernelH×W ,其中WH均为奇数,锚点的位置在\left(\frac{H-1}{2}, \frac{W-1}{2}\right) ,步骤如下。

OpenCV——图像平滑_第7张图片

由于高斯卷积算子是可分离的,所以真正对图像进行高斯平滑时,可根据same卷积的结合律和卷积核的分离性对图像先进行一维水平方向上的高斯平滑,然后再进行一维垂直方向上的高斯平滑,或者反过来,先垂直后水平。

因为一维的高斯卷积核的尺寸是奇数,那么对应二项式的指数n为偶数,如表示,只列出n是偶数的情况。

高斯卷积核的二项式近似

OpenCV——图像平滑_第8张图片

举例:

OpenCV——图像平滑_第9张图片

对于一维高斯算子的二项式近似是构建边缘检测Sobel算子的基础。

5.3、均值平滑

OpenCV——图像平滑_第10张图片

OpenCV——图像平滑_第11张图片

OpenCV——图像平滑_第12张图片

 即:\small 5+1+7+1+5+9+2+6+2=54+1-9-8

       均值平滑的原理本质上是计算任意一个点的邻域的平均值,而平均值是由该邻域的和除以邻域的面积得到的。这样无论怎样改变平滑窗口的大小,都可以利用图像的积分快速计算每个邻域的和。

5.4 中值平滑

中值平滑,类似于卷积,也是一种邻域运算,但计算的不是加权求和,而是对邻域中的像素点按灰度值进行排序,然后选择该组的中值作为输出的灰度值。 假设输入图像为I,高为R、宽为C,对于图像中的任意位置(rc),0≤r<R0≤c<C,取以(rc)为中心、宽为W、高为H的邻域,其中W H均为奇数,对邻域中的像素点灰度值进行排序,然后取中值,作为输出图像O的(rc)位置处的灰度值。以图像矩阵I 为例,取以位置(11)为中心的3×3邻域,对邻域中的像素点灰度值按从小到大进行排序:

OpenCV——图像平滑_第13张图片

可以看出141是该组灰度值的中值,那么输出图像O(11=141,依此类推,会得到输出图像的所有像素点的灰度值。当然,对边界处的处理和卷积运算一样,可采用多 种策略,而对边界进行镜像补充是较为理想的一种选择。 中值滤波最重要的能力是去除椒盐噪声。椒盐噪声是指在图像传输系统中由于解码 误差等原因,导致图像中出现孤立的白点或者黑点。高斯平滑、均值平滑在去除图像噪声时,会使图像的边缘信息变得模糊。

5.5 双边滤波

均值平滑和高斯平滑本质上是计算每个位置的邻域加权和作为该位置的输出,只是这种运算可以用卷积实现,加权系数模板是通过卷积核逆时针翻转180°得到的。双边滤则是根据每个位置的邻域,对该位置构建不同的权重模板,详细过程如下: 首先,构建winH×winW的空间距离权重模板,与构建高斯卷积核的过程类似,winH winW均为奇数。 且每个位置的空间距离权重模板是相同的。 然后,构建winH×winW的相似性权重模板,是通过(rc)处的值与其邻域值的差值的指数衡量的。 最后,将closenessWeight similarityWeight 的对应位置相乘(即点乘),然后进行归一化,便可得到该位置的权重模板。将所得到的权重模板和该位置邻域的对应位置相乘,然后求和就得到该位置的输出值,和卷积运算的第二步操作类似

5.6 联合双边滤波

联合双边滤波(Joint bilaterral Filter或称Cross Bilater Filter)与双边滤波类似,具体过程如下。

首先,对每个位置的邻域构建空间距离权重模板。与双边滤波构建空间距离权重模板一样。

然后,构建相似性权重模板。这是与双边滤波唯一的不同之处,双边滤波是根据原图,对于每一个位置,通过该位置和其邻域的灰度值的差的指数来估计相似性;而联合双边滤波是首先对原图进行高斯平滑,根据平滑的结果,用当前位置及其邻域的值的差

来估计相似性权重模板。

接下来,空间距离权重模板和相似性权重模板点乘,然后归一化,作为最后的权重模板。最后将权重模板与原图(注意不是高斯平滑的结果)在该位置的邻域对应位置积的和作为输出值。整个过程只在第二步计算相似性权重模板时和双边滤波不同,但是对 图像平滑的效果,特别是对纹理图像来说,却有很大的不同。

进行联合双边滤波处理后,方形纹理几乎完全消失了,而且同时对边缘的保留也非常的好,并没有感觉出边缘模糊的效果。

循环引导滤波(Guided ImageFiltering,双边滤波是根据原图计算相似性权重模板的,联合双边滤波对其进行了改 进,是根据图像的高斯平滑结果计算相似性权重模板的,而循环引导滤波,顾名思义, 是一种迭代的方法,本质上是一种多次迭代的联合双边滤波,只是每次计算相似性权重模板的依据不一样——利用本次计算的联合双边滤波结果作为下一次联合双边滤波计算相似性权重模板的依据。

5.7 导向滤波

一种不依赖于权重模板的保持边缘的滤波方法——导向滤波

导向滤波在平滑图像的基础上,有良好的保边作用,而且在细节增强等方面都有良好的表现,在执行时间上也比双边滤波快很多。虽然理论很深,但是利用OpenCV提供的基础函数,根据文中的伪码,就可以实现导向滤波。

输入:导向图像(Guidance ImageI,滤波输入图像(Filtering Input Imagep,均值平滑的窗口半径r,正则化参数。利用导向滤波进行图像的平滑处理时,通常令p=I

输出:导向滤波结果q

\begin{array}{l}{\operatorname{mean}_{I}=f_{\text { mean }}(\boldsymbol{I}, r)} \\ {\text { mean }_{p}=f_{\text { mean }}(\boldsymbol{p}, r)} \\ {\operatorname{corr}_{\boldsymbol{I}}=f_{\text { mean }}(\boldsymbol{I} * \boldsymbol{I}, r)} \\ {\operatorname{corr}_{\boldsymbol{I} p}=f_{\text { mean }}(\boldsymbol{I} * \boldsymbol{I}, r)} \\ {\operatorname{var}_{\boldsymbol{I}}=\operatorname{corr}_{\boldsymbol{I}}-\operatorname{mean}_{\boldsymbol{I}} * \text { mean }_{\boldsymbol{I}}}\end{array}\begin{array}{l}{\operatorname{cov}_{I p}=\operatorname{corr}_{I p}-\operatorname{mean}_{I} * \operatorname{mean}_{p}} \\ {a=\operatorname{cov}_{I p} J\left(\operatorname{var}_{I}+\epsilon\right)} \\ {b=\operatorname{mean}_{p}-a . * \operatorname{mean}_{I}} \\ {\text { mean }_{b}=f_{\text { mean }}(a, r)} \\ {\text { mean }_{b} * \boldsymbol{I}+\operatorname{mean}_{b}}\end{array}

快速导向滤波: 通过先缩小图像,然后再放大图像,加速了导向滤波的执行效率。

阈值分割、边缘检测等图像处理受图像噪声的影响比较大,所以图像平滑是这些图像处理方面的前提,对处理后的效果起着重要的作用。

你可能感兴趣的:(OpenCV,图像处理,OpenCV)