B3955b60783de7035e7318229a644916
Learning OpenCV with iOS: 图像模糊--非线性滤波

一、前言

上一篇我们讲解了OpenCV图像模糊中的线性滤波。本篇主要向大家介绍下非线性滤波。按惯例,先来看下效果图。

给铠祛痘

给铠祛痘

阿珂美颜

阿珂美颜

二、线性与非线性

上一篇中使用“卷积算子计算都是线性操作,所以又叫线性滤波”简单描述了线性滤波概念。下面我们详细了解下线性滤波非线性滤波

数学角度

数学里,一般说的线性,是说的线性映射:
线性 = 齐次性 + 可加性
齐次性: f(ax)=af(x)
可加性: f(x+y)=f(x)+f(y)
非线性就是这两条至少之一不成立.

图像角度

线性滤波:两个信号之和的响应和他们各自响应之和相等(可加性)。换句话说,每个像素的输出值是一些输入像素的加权和
非线性滤波:原始数据与滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的。

线性滤波器易于构造,并且易于从频率响应角度来进行分析。但是,线性滤波在处理散粒噪声(即图像偶尔会出现很大的值)的时候,无法将噪声像素去除,只能转换为更为柔和但仍然可见的散粒。

这时非线性滤波就该登场了。

三、非线性滤波

1、中值滤波(Median filter)

中值滤波是一种典型的非线性滤波技术,原理是用邻域像素灰度值的中值来代替该像素点的灰度值。

滤波过程

滤波过程

中值滤波

中值滤波

滤波操作:在9 x 9上面有3 x 3的窗口,从左到右,从上到下移动。将3 x 3窗口内的灰度值按顺序排列,然后取中值代替中心的灰度值。

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

中值滤波与均值滤波比较

中值滤波优势

在均值滤波中,将噪声像素与非噪声像素一并放入平均计算中,影响了输出。在中值滤波中,噪声像素很难被选成中值,所以几乎不会影响到输出。因此,中值滤波消除噪声和边缘保护方便都更胜一筹。

中值滤波劣势

因为中值滤波要进行排序操作,所以处理的时间长,是均值滤波的5倍以上。

给铠祛痘

给铠祛痘

给铠祛痘

OpenCV提供了中值滤波的API

/** 
@param ksize aperture linear size; it must be odd and greater than 1, for example: 3, 5, 7 ...
 */
void medianBlur( InputArray src, OutputArray dst, int ksize );

注意:ksize必须是奇数

+ (UIImage *)medianBlur:(UIImage *)image size:(int)size {
    Mat src;
    UIImageToMat(image, src);

    int finalSize = size;
    if (size%2 == 0) {
        finalSize = size + 1;
    }
    Mat dst;
    medianBlur(src, dst, finalSize);

    UIImage* result = MatToUIImage(dst);

    return result;
}

class NolinearBlurViewController: UIViewController {

    @IBOutlet weak var resultImageView: UIImageView!
    let image = #imageLiteral(resourceName: "ddkai")

    @IBAction func onSliderValueChanged(_ sender: UISlider) {
        resultImageView.image = OpenCV.medianBlur(self.image, size: Int32(Int(sender.value)))
    }
}

一些思考

为何ksize必须是奇数?

因为如果ksize是偶数,那么将像素灰度值从小到大排列后,必然就没有唯一的中值。即使得出中值,那么又将那个作为中心像素呢?因此,中值滤波要求ksize必须是奇数。

ksize

ksize

中值滤波有什么不适合的场景?

对一些细节多,特别是线、尖顶等细节多的图像不宜采用中值滤波。因为中值滤波会将这些细节也模糊掉。

2、双边滤波(Bilateral filter)

空间域&像素值域

对于图像滤波来说,图像在空间中变化缓慢,因此相邻的像素点会更相近。但是这个假设在图像的边缘处变得不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘。因为边缘两侧的点的像素值差别很大,所以权重还需考虑像素值。

因此,滤波不但要考虑空间域(以下简称空域),还需要考虑像素值域(以下简称值域)。

滤波分析

  • 均值滤波无法克服边缘像素信息丢失。原因是均值滤波是基于平均权重,没有考虑空域值域
  • 高斯模糊部分克服了该缺陷(考虑了空域),但是无法完全避免,因为没有考虑像素值的不同,即没有考虑值域

双边滤波

双边滤波是一种非线性的滤波方法,具有保边去噪的效果。

双边滤波

双边滤波

双边滤波的基本思路是同时考虑像素点的空域值域
双边滤波在考虑值域时,利用像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。

top Created with Sketch.