OpenCV学习笔记 - 图像滤波(一)

文章目录

  • 空间滤波
    • 低通滤波
      • 自定义卷积核
        • cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
      • 方盒滤波与均值滤波
        • cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
        • cv2.blur(src,ksize,anchor,borderType)
      • 高斯滤波与中值滤波
        • cv2.GaussianBlur(img,ksize,sigmaX,sigmaY)
        • cv2.medianBlur(img,ksize)
      • 双边滤波
        • cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
    • 高通滤波(未完待续)

空间滤波

滤波即一幅图像通过滤波器得到另一幅图像;其中滤波器又称为卷积核,滤波的过程成为卷积;
OpenCV学习笔记 - 图像滤波(一)_第1张图片

  • 给定一个卷积核 w w w 对图像逐一扫描,扫描的部分要进行一一点乘
    g ( x , y ) = ∑ s = − a a ∑ s = − b b w ( s , t ) f ( x + s , y + t ) g(x,y)=\sum_{s=-a}^{a}\sum_{s=-b}^{b}w(s,t)f(x+s,y+t) g(x,y)=s=aas=bbw(s,t)f(x+s,y+t)
    OpenCV学习笔记 - 图像滤波(一)_第2张图片

低通滤波

自定义卷积核

cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)

  • 代码功能:允许用户自定义卷积核实现卷积操作
  • 参数说明
    • src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
    • ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 1 表示与原始图像使用相同的图像深度
    • kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
    • anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (1,1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
    • delta: 表示修正值,是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果
    • borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
  • 代码实例
    import cv2
    import numpy as np
    
    # 加载图片
    img = cv2.imread('./img/fdu.jpg')
    
    # 自定义卷积核
    kernel = np.ones((5,5),np.float32) / 25
    
    # 输出经过滤波处理的图像并展示
    dst = cv2.filter2D(img, -1, kernel)
    cv2.imshow('dst',dst)
    cv2.imshow('img',img)
    
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

方盒滤波与均值滤波

cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)

  • 代码功能:实现对图像的方盒滤波处理;
  • 参数说明
    • src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
    • ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 1 表示与原始图像使用相同的图像深度
    • kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
    • anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (1,1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
    • normalize: 取值为 0 0 0 或者 1 1 1,去 0 0 0的时候采用的是对邻域点求和,反之求平均
    • borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
  • 代码实例
    import cv2
    import numpy as np
    
    # 加载图片
    img = cv2.imread('./img/fdu.jpg')
    
    # 经过方盒滤波后的图像(normalize=0表示对邻域值求和,normalize=1表示对邻域求平均)
    dst = cv2.boxFilter(img,-1,(2,2),normalize=0)
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('dst',dst)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.blur(src,ksize,anchor,borderType)

  • 代码功能:实现图像的均值滤波操作
  • 参数说明
    • src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
    • ddepth: 表示处理结果图像的深度,一般使用 − 1 -1 1 表示与原始图像使用相同的图像深度
    • kernel: 表示卷积核,是一个单通道的数组。若处理彩色图像,每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
    • anchor: 表示锚点,其默认值是 ( − 1 , − 1 ) (-1,-1) (1,1),表示当前计算均值的点位于和的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点做为锚点
    • borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
  • 代码实例
    import cv2
    import numpy as np
    
    # 读取图片
    img = cv2.imread('./img/fdu.jpg')
    
    # 输出经过均值滤波的图片
    dst = cv2.blur(img,(5,5))
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('dst',dst)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

高斯滤波与中值滤波

cv2.GaussianBlur(img,ksize,sigmaX,sigmaY)

OpenCV学习笔记 - 图像滤波(一)_第3张图片

  • 代码功能:对邻域内的像素点进行加权平均 (设置权重的依据-将中心点的权重加大,远离中心点的权重值减小)
  • 参数说明
    • img: 表示需要处理的图像
    • ksize: 表示滤波核的大小。卷积核大小指的是在滤波处理过程中其相邻图像的高度和宽度 (注意卷积核的尺寸值必须是奇数)
    • sigmaX: 表示卷积核在水平方向上的标准差,用来控制权重比例
    • sigmaY: 表示卷积核在垂直方向上的标准差,若将该值设置为0,则只采用sigmaX的值;若sigmaX和sigmaY都是0,则计算方式如下
      • s i g m a X = 0.3 × [ ( k s i z e . w i d t h − 1 ) × 0.5 − 1 ] + 0.8 sigmaX=0.3×[(ksize.width-1)×0.5-1]+0.8 sigmaX=0.3×[(ksize.width1)×0.51]+0.8
      • s i g m a Y = 0.3 × [ ( k s i z e . h e i g h t − 1 ) × 0.5 − 1 ] + 0.8 sigmaY=0.3×[(ksize.height-1)×0.5-1]+0.8 sigmaY=0.3×[(ksize.height1)×0.51]+0.8
  • 代码实例
    import cv2
    import numpy as np
    
    # 加载图片
    img = cv2.imread('./img/xdu.jpg')
    
    # 实现图像的高斯滤波(典型的应用-模糊化噪声点)
    new_img = cv2.GaussianBlur(img,(5,5),sigmaX=0,sigmaY=0)
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

cv2.medianBlur(img,ksize)

OpenCV学习笔记 - 图像滤波(一)_第4张图片

  • 代码功能:用邻域内所有像素值的中间值来替代当前像素点的像素值
  • 参数说明
    • img: 表示需要处理的图像
    • ksize: 表示滤波核的大小。卷积核大小指的是在滤波处理过程中其相邻图像的高度和宽度 (注意卷积核的尺寸值必须是比1大的奇数)
  • 代码实例
    import cv2
    import numpy as np
    
    # 加载图片
    img = cv2.imread('./img/xdu.jpg')
    
    # 实现中值滤波(典型的应用-模糊化椒盐噪声点)
    new_img = cv2.medianBlur(img,5)
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

双边滤波

cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

  • 代码功能:综合考虑信息和色彩信息,有效保护图像内的边缘信息 (典型应用-图像美颜)

  • 参数说明

    • src: 表示需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理
    • d: 表示当前像素点为中心点的直径;若该值为非正数,则会自动从参数 sigmaSpace计算得到
    • sigmaColor: 滤波处理时选取的颜色差值范围,该值决定了那些像素点能够参与到滤波来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的
      滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为 0 时,滤波失去意义;该值为 255 时,指定直径内的所有点都能够参与运算。
    • sigmaSpace: 表示坐标空间中的 sigma 值。它的值越大,说明有越多的点能够参与到滤波计算中来。当 d>0 时,无论 sigmaSpace 的值如何,d 都指定邻域大小;否则,d 与 sigmaSpace
      的值成比例。
    • borderType: 表示边界样式,该值决定了以何种情况处理边界,通常使用默认值即可
  • 代码实例

    import cv2
    import numpy as np
    
    # 加载图片
    img = cv2.imread('./img/Lena.jpg')
    
    # 实现双边滤波(典型的应用-图像美颜)
    new_img = cv2.bilateralFilter(img,25,100,100)
    
    # 展示图片
    cv2.imshow('img',img)
    cv2.imshow('new_img',new_img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    

    实验效果OpenCV学习笔记 - 图像滤波(一)_第5张图片


高通滤波(未完待续)

你可能感兴趣的:(Computer,Vison,1024程序员节)