一个二维的滤波器矩阵(也就是卷积核)和一个要处理的二维图像;对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值,这样就完成了滤波过程。
不难发现,用3×3的核对一副6×6的图像进行卷积,得到的是4×4的图,图片缩小了!那怎么办呢?我们可以把原图扩充一圈,再卷积,这个操作叫padding。
事实上,原图为n×n,卷积核为f×f,最终结果图大小为(n-f+1) × (n-f+1)
cv2.copyMakeBorder()
用来给图片添加边框,它有下面几个参数:
常用的填充类型有:固定值填充,取镜像对称的像素填充等。
均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。
函数:
cv2.blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
参数解释:
优点:使用简单,计算方便
特点:核中区域贡献率相同
高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。
函数:
cv2.GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
参数解释:
优点:对于服从正太分布的噪声非常有效
特点:核中区域贡献率与距离中心成正比,权重与高斯分布相关
用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。
函数:
cv2.medianBlur(InputArray src, OutputArray dst, int ksize)
参数解释:
优点:对于椒盐噪声有效
特点:中心点的像素值被核中的中位数的像素代替
结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。
函数:
cv2.bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=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()
效果图:
下载完整代码请到: opencv常见滤波算法python 语言实现
从左到右分别为:原图、中值滤波、双边滤波、均值滤波、高斯滤波。