图像卷积滤波的原理和均值滤波,盒型滤波,高斯滤波,中值滤波 ,双边滤波的Python程序实现

图像卷积滤波的基本原理:

一个二维的滤波器矩阵(也就是卷积核)和一个要处理的二维图像;对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值,这样就完成了滤波过程。

图像卷积滤波的原理和均值滤波,盒型滤波,高斯滤波,中值滤波 ,双边滤波的Python程序实现_第1张图片

不难发现,用3×3的核对一副6×6的图像进行卷积,得到的是4×4的图,图片缩小了!那怎么办呢?我们可以把原图扩充一圈,再卷积,这个操作叫padding。

事实上,原图为n×n,卷积核为f×f,最终结果图大小为(n-f+1) × (n-f+1)

图像卷积滤波的原理和均值滤波,盒型滤波,高斯滤波,中值滤波 ,双边滤波的Python程序实现_第2张图片

cv2.copyMakeBorder()用来给图片添加边框,它有下面几个参数:

  • src:要处理的原图
  • top, bottom, left, right:上下左右要扩展的像素数
  • borderType:边框类型,这个就是需要关注的填充方式,详情请参考:BorderTypes

常用的填充类型有:固定值填充,取镜像对称的像素填充等。

常见的图像平滑滤波算法

  • 均值滤波、盒型滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波

1、均值滤波、盒型滤波

均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。

函数:
cv2.blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

参数解释:

  • InputArray src: 输入图像,可以是Mat类型,图像深度是CV_8U、CV_16U、CV_16S、CV_32F以及CV_64F其中的某一个。
  • OutputArray dst: 输出图像,深度和类型与输入图像一致
  • Size ksize: 滤波模板kernel的尺寸,一般使用Size(w, h)来指定,如Size(3,3)
  • Point anchor=Point(-1, -1): 字面意思是锚点,也就是处理的像素位于kernel的什么位置,默认值为(-1, -1)即位于kernel中心点,如果没有特殊需要则不需要更改
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT

优点:使用简单,计算方便

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

2、高斯滤波

高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。

函数:
cv2.GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

参数解释:

  • InputArray src: 输入图像,可以是Mat类型,图像深度为CV_8U、CV_16U、CV_16S、CV_32F、CV_64F。
  • OutputArray dst: 输出图像,与输入图像有相同的类型和尺寸。
  • Size ksize: 高斯内核大小,这个尺寸与前面两个滤波kernel尺寸不同,ksize.width和ksize.height可以不相同但是这两个值必须为正奇数,如果这两个值为0,他们的值将由sigma计算。
  • double sigmaX: 高斯核函数在X方向上的标准偏差
  • double sigmaY: 高斯核函数在Y方向上的标准偏差,如果sigmaY是0,则函数会自动将sigmaY的值设置为与sigmaX相同的值,如果sigmaX和sigmaY都是0,这两个值将由ksize.width和ksize.height计算而来。具体可以参考getGaussianKernel()函数查看具体细节。建议将size、sigmaX和sigmaY都指定出来。
  • int borderType=BORDER_DEFAULT: 推断图像外部像素的某种便捷模式,有默认值BORDER_DEFAULT,如果没有特殊需要不用更改,具体可以参考borderInterpolate()函数。

优点:对于服从正太分布的噪声非常有效

特点:核中区域贡献率与距离中心成正比,权重与高斯分布相关

3、中值滤波

用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。

函数:
cv2.medianBlur(InputArray src, OutputArray dst, int ksize)

参数解释:

  • InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
  • OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst
  • int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……

优点:对于椒盐噪声有效

特点:中心点的像素值被核中的中位数的像素代替

4、双边滤波

结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。

函数:

cv2.bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

参数解释:

  • InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
  • OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
  • int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
  • double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
  • double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
  • int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

作用:可以很好的保存图像边缘细节而滤除掉低频分量的噪音

特点:双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长

以上算法的程序实现如下:

# -*- coding:utf-8 -*-
#本程序用于实现各种滤波算法
import cv2  #导入opencv模块
import numpy as np

print("Hellow word!")     #打印“Hello word!”,验证模块导入成功

img = cv2.imread("imag2.jpg")  #导入图片,图片放在程序所在目录
cv2.namedWindow("imagshow", 2)   #创建一个窗口
cv2.imshow('imagshow', img)    #显示原始图片

# 均值滤波
img_mean = cv2.blur(img, (3,3)) #参数1输入图像,参数2核大小
cv2.namedWindow("mean", 2)   #创建一个窗口
cv2.imshow('mean', img_mean)    #显示原始图片

# 高斯滤波
img_Guassian = cv2.GaussianBlur(img,(3,3),0)
cv2.namedWindow("Guassian", 2)   #创建一个窗口
cv2.imshow('Guassian', img_Guassian)    #显示原始图片

# 中值滤波
img_median = cv2.medianBlur(img, 5)
cv2.namedWindow("median", 2)   #创建一个窗口
cv2.imshow('median', img_median)    #显示原始图片

# 双边滤波
img_bilater = cv2.bilateralFilter(img,9,75,75)
cv2.namedWindow("bilater", 2)   #创建一个窗口
cv2.imshow('bilater', img_bilater)    #显示原始图片

cv2.waitKey()

效果图:
图像卷积滤波的原理和均值滤波,盒型滤波,高斯滤波,中值滤波 ,双边滤波的Python程序实现_第3张图片
下载完整代码请到: opencv常见滤波算法python 语言实现

从左到右分别为:原图、中值滤波、双边滤波、均值滤波、高斯滤波。

你可能感兴趣的:(机器学习&计算机视觉,图像卷积滤波,均值滤波,高斯滤波,中值滤波,双边滤波)