【OpenCV】—非线性滤波:中值滤波、双边滤波

简介: 【OpenCV】—非线性滤波:中值滤波、双边滤波
1、非线性滤波概述

 上节学到 线性滤波,即两个信号之和的响应和它们各自响应之后相等。也就是每个像素的输出值是一些输入像素的加权和。线性滤波器易于构造,并且易于从频率响应角度来进行分析。

 当噪声是散粒噪声而不是高斯噪声,或者图像偶尔会出现很大的值的时候,用高斯滤波对图像进行模糊的话,噪声像素是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒。

2、中值滤波

   中值滤波(Median filter) 是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像的边缘细节。

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中的一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。这对于斑点噪声(speckle noise)和椒盐噪声(salt-and-pepper noise)来说尤其有用。

 中值滤波在一定的条件下可以克服常见线性滤波器,如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

2.1 中值滤波与均值滤波比较

优势:在均值滤波中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响。但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会影响到输出。因此同样用3x3区域进行处理,中值滤波消除的噪声能力更胜一筹。中值滤波无论是在消除噪声还是保存边缘方面都是一个不错的方法。

劣势:中值滤波花费的时间是均值滤波的5倍以上。

顾名思义,中值滤波选择每一个像素的邻域像素中的中值作为输出,或者说中值滤波将每一个像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

例如:取3x3的函数窗,计算以点[i,j]为中心的函数窗像素中值,具体步骤如下:

(1)按强度值大小排列像素点

(2)选择排序像素集的中间值作为点[i,j]的新值

一般采用奇数点的邻域来计算中值,但像素点数为偶数时,中值就取排序像素中间两点的平均值。

中值滤波在一定条件下,可以克服线性滤波器(如均值滤波)所带来的图像细节模糊,对滤除脉冲干扰即图像扫描噪声最为有效,而且在实际运算过程中并不需要图像的统计特性,也给计算带来不少方便,但对一些细节多的图像不太合适。

3、双边滤波

   双边滤波(Bilateral filter) 是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部的特点。

双边滤波器的好处是可以做边缘保存(edge preserving)。以往常用维纳滤波或者高斯滤波降噪,但二者都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波顾名思义,比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附件,离得较远的像素不会对边缘上的像素值影响太多,这样就保证了边缘附件像素值的保存,但是,由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净地滤掉,只能对于低频信息进行较好的滤波。

在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合,公式如下:

而加权系数w(i,j,k,l)取决于定义域核和值域核的乘积。

其中定义域核表示如下:

值域核表示如下:

定义域滤波和值域滤波如下:

两者相乘后,就会产生依赖于数据的双边滤波权重函数,如下:

4、非线性滤波相关核心API函数
4.1 中值滤波:medianBlur函数

说明:medianBlur函数使用中值滤波器来平滑(模糊)处理一张图片,从src输入,结果从dst输出。对于多通道图片,它对每一个通道都单独进行处理,并且支持就地操作(In-placeoperation)。

void medianBlur(InputArray src,OutputArray dst,int kszie);

参数如下:

第一个参数:函数的输入参数,填1、3或者4通道的Mat类型的图像。当ksize为3或者5的时候,图像深度需为CV_8U、CV_16U、CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U

第二个参数:目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。我们可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

孔径的线性尺寸(aperture linear size),注意这个参数必须是大于1的奇数,比如:3,5,7,9…

调用范例如下:

Mat image=imread("1.jpg");
Mat out;
medianBlur(image,out,7);
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
  //载入图像
  Mat image = imread("E:\\tangsan.jpg");
  //创建窗口
  namedWindow("中值滤波【原图】");
  namedWindow("中值滤波【效果图】");
  //显示原图
  imshow("中值滤波【原图】", image);
  //进行中值滤波
  Mat out;
  medianBlur(image, out, 7);
  //显示效果图
  imshow("中值滤波【效果图】", out);
  waitKey(0);

}

4.2 双边滤波:bilateralFilter函数

说明:此函数的作用是用双边滤波器来模糊处理一张图片,由src输入,结果于dst输出

void bilateralFilter(InputArray src.OutputArray dst,int d,double sigmaColor,double sigmaSpace,
int boderType=BORDER_DEFAULT);

参数如下:

第一个参数:函数的输入参数,填1、3或者4通道的Mat类型的图像。当ksize为3或者5的时候,图像深度需为CV_8U、CV_16U、CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U

第二个参数:目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。我们可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

第三个参数:表示在过滤过程中每个像素邻域的直径。如果这个值被设为非正数,那么OpenCV 会从第五个参数sigmaSpace来计算出它。

第四个参数:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。

第五个参数:坐标空间中滤波器的sigma值,坐标空间的标准方差。它的值越大,意味着越远的像素会互相影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d >0时,d指定了邻域大小且sigmaSpace无关。否则,d正比于sigmaSpace.

第六个参数:int类型的boderType,用于推断图像外部像素的某种边界模式。默认值:BORDER_DEFAULT。

调用代码如下:

Mat image=imread("1.jpg");
Mat out;
bilateralFilter(image,out,25,25*2,25/2);
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
  //载入图像
  Mat image = imread("E:\\tangsan.jpg");
  //创建窗口
  namedWindow("双边滤波【原图】");
  namedWindow("双边滤波【效果图】");
  //显示原图
  imshow("双边滤波【原图】", image);
  //进行中值滤波
  Mat out;
  bilateralFilter(image, out, 25,25*2,25/2);
  //显示效果图
  imshow("双边滤波【效果图】", out);
  waitKey(0);

}

运行效果不得不说,边缘清晰了,但是细节有点消失了,确实清楚多了。


相关文章
|
7月前
|
计算机视觉
openCV的中值滤波
openCV的中值滤波
22 0
|
7月前
|
计算机视觉
openCV的高斯滤波
openCV的高斯滤波
23 0
|
13天前
|
存储 编解码 资源调度
【OpenCV】—线性滤波:方框滤波、均值滤波、高斯滤波
【OpenCV】—线性滤波:方框滤波、均值滤波、高斯滤波
|
13天前
|
Serverless 计算机视觉
【OpenCV】-图像的矩
【OpenCV】-图像的矩
|
5月前
|
算法 计算机视觉
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
38 0
|
5月前
|
Serverless 计算机视觉
OpenCV(二十二):均值滤波、方框滤波和高斯滤波
OpenCV(二十二):均值滤波、方框滤波和高斯滤波
82 1
|
7月前
|
C++ 计算机视觉
OpenCV-高斯低通&高通滤波器(C++)
OpenCV-高斯低通&高通滤波器(C++)
120 0
|
10月前
|
机器学习/深度学习 传感器 算法
【图像去噪】基于高斯滤波+均值滤波+中值滤波+双边滤波滤波实现图像去噪(含信噪比)附Matlab代码
【图像去噪】基于高斯滤波+均值滤波+中值滤波+双边滤波滤波实现图像去噪(含信噪比)附Matlab代码
|
11月前
常见滤波(高斯滤波、均值滤波等)的简单理解
常见滤波(高斯滤波、均值滤波等)的简单理解
78 0
|
资源调度 算法 API
OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
103 0