python图像滤波

3 篇文章 0 订阅
1 篇文章 0 订阅

python图像滤波

预备知识

  • 滤波器

    1. 低通滤波器的主要作用可以消除噪声,
    2. 高通滤波器的作用可以提取边缘
  • 核函数

    如果我们想要将这两类数据进行分类,那么分类的边界将会是一个椭圆:

    \small \frac{x_12}{a_1}+\frac{x_22}{a_2}=1

    但是如果我们可以通过一个映射,将数据的特征\small (x_1,x_2)通过某个非线性映射img\small \phi映射到三维空间,其特征表示为\small (z_1,z_2,z_3),并且映射关系为\small (z_1,z_2,z_3)==\phi (x_1,x_2)=(x_12,2{1/2}x_1y_1,x_2^2)),那么我们是不是就可以用一个平面来将其分类,也即是将上述椭圆的x特征换成z特征

    这个映射,就是将一个空间中的特征转换到另外一个空间,这就是空间转换(映射)的意义,即可以将原来线性不好分的数据转换到另外一个空间,在这个空间中可以用一个超平面线性可分

    我们就不需要知道那个映射\small \phi到底是个什么鬼,我们就可以直接通过核函数,就可以求导高维空间的内积了,从而可以计算出高维空间中两个数据点之间的距离和角度。

  • 表示二维矩阵,核不同的值表示不同的算法

滤波算法

  • ​ 应用于图像预处理

    以下源图像为
    在这里插入图片描述

  • 滤波算法:

    均值滤波【线性滤波:】

    • 作用:对胡椒盐噪声的滤除比较好

    • 缺点:它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

    • 特点:核中间区域贡献率相同

    • 语法调用:cv2.blur(输入源图像,核的大小)

      1. 源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
      2. 内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
    • 代码展示:

      import cv2 
      
      path = 'D://picture//pig.jpg'
      img = img  = cv2.imread(path)
      img_blur = cv2.blur(img,(15,15))
      cv2.imshow('blur',img_blur)
      cv2.waitKey(0)
      

      效果图:在这里插入图片描述

    高斯滤波【线性滤波】

    • 操作说明:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

    • 作用:对高斯噪音的滤除比较好

    • 特征:核中区域贡献率与距离区域中心成正比,权重与高斯分布相关。高斯滤波最有用的滤波操作,虽然效率往往不是最高的。

    • 语法调用:

      cv2.GaussianBlur(源图像,核大小,x方向的标准差,y方向的标准差)

      大小:正数,奇数

      标准差:‘(数值越大越模糊),若为0则根据图片尺寸自动计算

      如果只给一个标准差,则默认两个方向的标准差一致

      import cv2
      img_GaussianBlur = cv2.GaussianBlur(img, (15,15), 1, 0.1)
      cv2.imshow('GaussianBlur',img_GaussianBlur)
      cv2.waitKey(0)
      

      效果图:

在这里插入图片描述

中值滤波【非线性滤波技术】

  • 基本思想:中心点的像素值用核中像素点的中值来代替该像素点的灰度值

  • 特征:去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节

  • 一般采用奇数点的邻域来计算中值,但如果像素点数为偶数时,中值就取排序像素中间两点的平均值

  • 语法调用:

    cv2.medianBlur(源图像,核大小)

    核大小为一个数字

    import cv2
    img_medianBlur = cv2.medianBlur(img,15)
    cv2.imshow('medianBlur',img_medianBlur)
    cv2.waitKey(0)
    
  • 效果图

    在这里插入图片描述

双边滤波【非线性滤波】

  • 基本思想:主要是针对Gauss 滤波中将Gauss 权系数直接与图像信息作卷积运算进行图像滤波的原理,将滤波权系数优化成Gauss 函数和图像亮度信息的乘积,优化后的权系数再与图像信息作卷积运算

  • 作用:能在滤波的同时考虑到图像信息中的图像边缘信息,使图像在正常Gauss 滤波后很模糊的边缘信息得以保持清晰,并且图像边缘更加平滑。

  • 特征:运行时间长

  • 语法调用:

    cv2.bliateralFilter(源图像,核的大小(用中心点的直径表达,如果该值为非正数,则会自动从参数sigmaSpace中计算得到),color filter,space filter)

    • 说明:

      • color filter:基于像素差的高斯滤波器,使临近的像素点被用于滤波

      • space filter:空间上的高斯滤波器,使临近的像素点被用于滤波

    img_bilateralFilter = cv2.bilateralFilter(img, d=15, sigmaColor = 120, sigmaSpace =180 )
    cv2.imshow('bilateralFilter',img_bilateralFilter)
    

    效果图:

    在这里插入图片描述

方框滤波【线性滤波:】

  • 说明:每一个输出像素的是内核邻域像素值的平均值得到

    这里是一个长宽分别为Kwidth和Kheight的窗口函数,在此区域内邻域中像素值叠加求平均即可求出位于kernel中心点像素的像素值。

    在这里插入图片描述

​ boxFilter()函数方框滤波所用的核为:

在这里插入图片描述

在这里插入图片描述

当normalize=true的时候,方框滤波就变成了均值滤波。

均值滤波是方框滤波归一化后的特殊情况。其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。

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

  • src是需要处理的图像,即源图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者CV_64F中的一种。

  • ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度

  • ksize是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以3×3大小的邻域均值作为图像滤波处理的结果

  • 当参数normalize=0时,表示不需要进行归一化处理,直接使用邻域像素值的和。

  • borderType是边界样式,该值决定了以何种方式处理边界。

    对于参数anchor、normalize和 borderType,直接采用其默认值即可

import cv2
img_boxFilter = cv2.boxFilter(img,-1,(15,15)) 
cv2.imshow('img_boxFilter',img_boxFilter)
cv2.waitKey(0)

效果图:

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值