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. 双边滤波详解

  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8134395.html
Copyright © 2011-2022 走看看