OpenCV-Python系列之线性滤波

分享到:

本次教程将介绍几种OpenCV常用的滤波器,将介绍它们详细的原理,图像滤波对于OpenCV图像处理来说是至关重要的一环,它在整个OpenCV中的分量是举足轻重的,我们必须完全掌握它。

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
  消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

图像滤波的目的有两个:

一是抽出对象的特征作为图像识别的特征模式;

另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
而对滤波处理的要求也有两条:

一是不能损坏图像的轮廓及边缘等重要信息;

二是使图像清晰视觉效果好。
平滑滤波是低频增强的空间域滤波技术。它的目的有两类:

一类是模糊;

一类是消除噪音。
  空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。
  关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

原理

邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于输入像素的加权和,具体过程如下图:

射频, RF, 滤波

左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。

邻域算子除了用于局部色调调整以外,还可以用于图像滤波,实现图像的平滑和锐化,图像边缘增强或者图像噪声的去除。本篇文章,我们介绍的主角是线性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。

线性滤波处理的输出像素值射频, RF, 滤波是输入像素值<img alt="射频," rf,="" 滤波"="" data-cke-saved-src="https://upload.semidata.info/sns.eefocus.com/rf/article/media/2022/08/05/360411.png" src="https://upload.semidata.info/sns.eefocus.com/rf/article/media/2022/08/05/360411.png">的加权和 :

射频, RF, 滤波

其中的加权和我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。

上面的式子可以简单写作:

射频, RF, 滤波

其中f表示输入像素值,h表示加权系数“核“,g表示输出像素值

在新版本的OpenCV中,提供了如下三种常用的线性滤波操作,他们分别被封装在单独的函数中,使用起来非常方便: 

1     均值滤波——blur函数

2     方框滤波——boxblur函数

3     高斯滤波——GaussianBlur函数

均值滤波器

均值滤波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知道其像素值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我们以3*3为例:

射频, RF, 滤波

中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将整个图像的像素用这个均值像素代替:

射频, RF, 滤波

函数原型:
       dst=cv.blur(src,ksize [,dst [,anchor [,borderType]]])

其中第一个参数为输入的图像,第二个参数为卷积核的大小,后面的我们都采用默认值就可以。

给出示例代码:

 

view plaincopy to clipboardprint?

import cv2  

 

import matplotlib.pyplot as plt  

import numpy as np  

  

img = cv2.imread("cat.jpg")  

blur = cv2.blur(img,(5,5))  

cv2.imshow("org",img)  

cv2.imshow("result", blur)  

cv2.waitKey(0)  

cv2.destroyAllWindows()  

射频, RF, 滤波

缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声

方框滤波器

事实上,方框滤波器与均值滤波器是基本上一样的,我们直接看源码:

 

view plaincopy to clipboardprint?

import cv2  

 

import matplotlib.pyplot as plt  

import numpy as np  

  

img = cv2.imread("shu.jpg")  

blur = cv2.boxFilter(img,-1,(3,3),normalize=False)  

cv2.imshow("org",img)  

cv2.imshow("result", blur)  

cv2.waitKey(0)  

cv2.destroyAllWindows()  

 

boxFilter则为i方框滤波函数,当

 

view plaincopy to clipboardprint?

normalize=True  

 

它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如图:

射频, RF, 滤波

但是当

 

view plaincopy to clipboardprint?

normalize=False  

 

其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255的值,它会全取255进行代替,如图:

射频, RF, 滤波

高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

先来了解一下高斯函数,高斯分布函数指的就是概率论中的正态分布的概率密度函数,均值μ=0时的一维形式和二维形式如下。 其中σ为正态分布的标准偏差,其值决定了函数的衰减快慢。

射频, RF, 滤波

射频, RF, 滤波

从这两个公式不难看出,二维公式其实等于两个一维函数相乘。从概率论角度看,因为随机变量X,Y是相互独立的,那么他们的联合概率密度就等于边缘概率密度之积。这个特性是非常重要的,现在让我们先看一下高斯函数的图像分布与二维高斯卷积核的样子:

射频, RF, 滤波

射频, RF, 滤波

图像上,靠近原点的位置地势高,距离原点越远则地势越低。相应地,卷积核也是中心数值最大,并向四周减小,减小的幅度并不是随意的,而是要求整个卷积核近似高斯函数的图像。由于高斯滤波实质是一种加权平均滤波,为了实现平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一,这些系数等于矩阵中所有数值之和的倒数。

可能有人看不太懂,我简单解释一下高斯滤波的原理,以下面那个数字图为例:

射频, RF, 滤波

假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数越大,就类似这样一个图:

射频, RF, 滤波

那么距离204越近则其权重系数越大,它跟均值滤波还是有很大不同的,均值滤波对于204周围的75和24这两个较小值非常的不友好,会导致误差较大。但是高斯滤波表示,离我近的,吃嘛嘛香,离我远的,说话分量就没有那么重了,不管你值有多大或者多小。我们看一下函数原型:

GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> dst

——src输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

——dst输出图像的大小和类型与src相同。

——ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。

——sigmaX X方向上的高斯核标准偏差。

——sigmaY Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

我们来看代码:

 

view plaincopy to clipboardprint?

import cv2  

 

import matplotlib.pyplot as plt  

import numpy as np  

  

img = cv2.imread("shu.jpg")  

blur =  cv2.GaussianBlur(img,(3,3),0)  

cv2.imshow("org",img)  

cv2.imshow("result", blur)  

cv2.waitKey(0)  

cv2.destroyAllWindows()  

射频, RF, 滤波

我们可以看到,三种线性滤波器都无法很好的去除图片中的椒盐噪声,而要想去除椒盐噪声,我们需要用非线性滤波器,这将在下次介绍。现在我们来总结一下这三种滤波器:

射频, RF, 滤波

 

继续阅读
电源缓启动原理

现在大多数电子系统都要支持热插拔功能,所谓热插拔,也就是在系统正常工作时,带电对系统的某个单元进行插拔操作,且不对系统产生任何影响。 热插拔对系统的影响主要有两方面: 其一,热插拔时,连接器的机械触点在接触瞬间会出现弹跳,引起电源振荡,如下图所示:

原来SPI并没有我想的那么简单

UART,通用串行异步通讯协议,因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。

信号带宽和示波器带宽(模拟带宽)关系?

信号带宽是信号频谱的宽度,也就是信号的最高频率分量与最低频率分量之差,譬如,一个由数个正弦波叠加成的方波信号,其最低频率分量是其基频,假定为f=2kHz,其最高频率分量是其7次谐波频率,即7f=7×2=14kHz,因此该信号带宽为7f-f=14-2=12kHz。信道带宽则限定了允许通过该信道的信号下限频率和上限频率,也就是限定了一个频率通带。

时域反射计 (TDR)实用技术

高性能通讯系统需要具备优质的电信号传输路径。为获取高效信号流和出色的信号完整性,传输路径阻抗应尽可能保持理想恒定值。时域反射计(TDR)是一项成熟的技术,可用于验证元件、互连与传输线路的阻抗和信号路径质量。

一文看懂国产射频滤波器

滤波器是射频关键器件,负责对通信通道中的信号频率进行滤波,解决不同频段和通信系统之间产生的信号干扰问题