zoukankan      html  css  js  c++  java
  • opencv-python教程学习系列13-图像平滑

    前言

    opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像平滑,坚持学习,共同进步。

    系列教程参照OpenCV-Python中文教程

    系统环境

    系统:win7_x64;

    python版本:python3.5.2;

    opencv版本:opencv3.3.1;

    内容安排

    1.知识点介绍;

    2.测试代码;

    具体内容

    1.知识点介绍;

     本文主要基于cv2包介绍几种常见的平滑滤波方法,比如2D卷积、均值滤波、高斯模糊、中值滤波、双边滤波。

    对于图像的平滑与滤波,但从滤波角度来讲,一般主要目的都是为了实现对图像噪声的消除,增强图像的效果。 图像的滤波可以看成是滤波模板与原始图像对应部分的的卷积运算。

    1.1 2D卷积;

    对于2D图像可以进行低通或者高通滤波操作,低通滤波(LPF)有利于去噪,模糊图像,高通滤波(HPF)有利于找到图像边界。

    Opencv提供的一个通用的2D滤波函数为cv2.filter2D(),滤波函数的使用需要一个核模板,对图像的滤波操作过程为:将核模板放在图像的某个像素上,求与之对应的图像上的每个像素点的和,核不同,得到的结果不同,而滤波的使用核心也是对于这个核模板的使用,需要注意的是,该滤波函数是单通道运算的,也就是说对于彩色图像的滤波,需要将彩色图像的各个通道提取出来,对各个通道分别滤波才行。

    kernel = np.ones((5,5),np.float32)/25
    dst = cv2.filter2D(img,-1,kernel)
    

    1.2 均值滤波;

    这是由一个归一化卷积框完成的,他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用cv2.blur()和cv2.boxFilter()来实现, 我们需要设定卷积框的宽和高。同样是一个矩阵。

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

    1.3 高斯模糊

     高斯模糊即是将卷积核换成高斯核,核区域中的数值符合高斯分布,实现的函数是cv2.GaussianBlur(),需要指定高斯核的宽和高(必须是奇数),以及高斯函数沿X,Y方向的标准差。高斯滤波可以有效的从图像中去除高斯噪音,也可以使用cv2.getGaussianKernel()自己构建一个高斯核。

    # 0是指根据窗口大小(5,5)来计算高斯函数标准差
    blur = cv2.GaussianBlur(img,(5,5),0)

    1.4 中值滤波;

    中值滤波是使用区域的中值来代替中心像素的值,用来去除椒盐噪声,卷积核的大小是奇数。

    blur = cv2.medianBlur(img,5)

    1.5 双边滤波;

    双边滤波函数为cv2.bilateralFilter()。该滤波器可以在保证边界清晰的情况下有效的去掉噪声即保边去噪。它的构造比较复杂,既考虑了图像的空间关系,也考虑图像的灰度关系。双边滤波同时使用了空间高斯权重和灰度相似性高斯权重,确保了边界不会被模糊掉。具体原理可参考女神博客here

    #cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
    #d – Diameter of each pixel neighborhood that is used during filtering. # If it is non-positive, it is computed from sigmaSpace 
    # 9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差 
    blur = cv2.bilateralFilter(img,9,75,75)

    2. 测试代码;

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    img = cv2.imread('test.jpg',0) #直接读为灰度图像
    for i in range(2000): #添加点噪声
        temp_x = np.random.randint(0,img.shape[0])
        temp_y = np.random.randint(0,img.shape[1])
        img[temp_x][temp_y] = 255
    
    #9---滤波领域直径
    #后面两个数字:空间高斯函数标准差,灰度值相似性标准差
    blur = cv2.bilateralFilter(img,9,75,75)
    plt.subplot(1,2,1),plt.imshow(img,'gray')#默认彩色,另一种彩色bgr
    plt.subplot(1,2,2),plt.imshow(blur,'gray')

    参考

    1. 图像平滑

    2. 图像平滑与滤波

    3. 双边滤波详解

  • 相关阅读:
    XtraForm中OfficeSkins以及BonusSkin皮肤的设置
    XtraForm中更换皮肤
    XtraForm默认皮肤的显示
    wcf异常汇总
    使用JS意识到自己主动提交表单
    怎么样sourceforge开源项目发现,centos安装-同htop安装案例
    战国评论(三)---一起
    Mesos-error
    iOS 执行ScrollView在空白空间-解
    【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8134395.html
Copyright © 2011-2022 走看看