首页 > 技术文章 > Opencv笔记(十一)——图像模糊(平滑)

longwhite 2018-07-13 21:26 原文

学习目标:

  • 使用自定义的滤波器对图像进行卷积(2D 卷积)

  • 学习使用不同的低通滤波器对图像进行模糊

一、2D卷积

        卷积不是很了解的可以看我上一篇博客,与语音信号一样,我们也可以对 2D 图像实施低通滤波(LPF),高通滤波(HPF)等。低通滤波器就是允许低频信号通过,在图像中边缘和噪点都相当于高频部分,所以低通滤波器用于去除噪点、平滑和模糊图像。高通滤波器则反之,用来增强图像边缘,进行锐化处理。

        2D卷积其本质上也是一个加权平均的过程,openCV提供cv2.filter2D(src ,deepth,kernel)函数进行2D卷积,其中kernel是我们需要提供的卷积核,卷积核一般为一个奇数级的矩阵,其中所有元素的和为1deepth一般为-1.

import cv2
import numpy as np
img = cv2.imread('/home/wl/le.jpeg',1)
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
while(1):
    cv2.imshow('opencv',dst)
    k = cv2.waitKey(1)& 0XFF
    if k == ord('q'):
        break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()

原图:

卷积图:

二、图像模糊

        OpenCV 提供了四种模糊技术,但其本质上还是在卷积


(1)平均

        Cv2.blur(src ,size)可以用于实现最简单的平均卷积操作,原理和上面2D卷积一样,只需要提供一个size数组,该数组包含卷积核的长度和宽度即可。

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.blur(img,(5,5))
while(1):
    cv2.imshow('opencv',dst)
    k = cv2.waitKey(1)& 0XFF
    if k == ord('q'):
        break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()

(2)高斯模糊

        现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里的值)。实现的函数是 cv2.GaussianBlur(src ,size ,标准差)。我们需要指定高斯核的宽和高(必须是奇数)。以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。如果你愿意的话,你也可以使用函数 cv2.getGaussianKernel() 自己构建一个高斯核。

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.GaussianBlur(img,(5,5),2)
while(1):
    cv2.imshow('opencv',dst)
    k = cv2.waitKey(1)& 0XFF
    if k == ord('q'):
        break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()

(3)中值模糊

        中值模糊非常简单,其使用卷积核对应的像素阵列的中值去代替卷积核最中心位置像素的像素值,注意,此处的中值是统计意义上的中值,要先对像素阵列中的值进行排序再取的中值。这个滤波器经常用来去除椒盐噪声。使用cv2.medianBlur(img,size)即可实现中值模糊

import cv2
img = cv2.imread('/home/wl/le.jpeg',1)
dst = cv2.medianBlur(img,7)
while(1):
    cv2.imshow('opencv',dst)
    k = cv2.waitKey(1)& 0XFF
    if k == ord('q'):
        break
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.destroyAllWindows()



(4)双边滤波

        使用高斯模糊等方式,只考虑了像素的空间关系,但不会考虑像素之间的大小关系,其结果有可能会导致图像边缘失真,而双边滤波则会考虑像素的大小关系,双边滤波同时使用了空间高斯权重以及灰度值的相似性权重(边界处的灰度值变化比较大),空间高斯函数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算,所以使用双边滤波则可以较好的保留图像边缘。使用cv2.bilateralFilter(src ,size,空间标准差,度值标准差)可以实现双边滤波。



推荐阅读