1、图像滤波的分类和基本概念
概念
图像滤波,即图像平滑处理,在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,使图像变得平滑、锐化、边界增强。
图像滤波的目的有两个:
1、抽出对象的特征作为图像识别的特征模式;
2、为适应图像处理的要求,消除图像数字化时所混入的噪声。
滤波处理的要求是不能损坏图像的轮廓及边缘等重要信息,且使图像清晰视觉效果好。
分类
图像滤波分为线性滤波和非线性滤波
线性滤波:对邻域中的像素的计算为线性运算时,如利用窗口函数进行平滑加权求和的运算,或者某种卷积运算,都可以称为线性滤波。
举例:均值滤波、高斯滤波、盒子滤波、拉普拉斯滤波等等,通常线性滤波器之间只是模版系数不同。
非线性滤波:非线性滤波利用原始图像跟模版之间的一种逻辑关系得到结果,
举例:最值滤波器,中值滤波器、双边滤波器。
均值滤波/方框滤波、高斯滤波的原理
方框滤波:采用一个卷积核与图像进行卷积
均值滤波:方框滤波归一化的特殊情况,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等)
均值滤波的缺陷: 均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。
高斯滤波:对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
OpenCV框架下滤波API的代码
def img_filter(img):
'''
task04 图像滤波
:param img:
:return:
'''
# 方框滤波
box_filter = cv2.boxFilter(
img, # 表示输入图像
-1 ,
(2,2) , # # 滤波的方框大小
normalize = True # normalize=True时,与均值滤波结果相同,False,表示对加和后的结果不进行平均操作,大于255的使用255表示
)
# 均值滤波
blur_filter = cv2.blur(
img, # 表示输入图像
(2,2), # 滤波的方框大小
)
# 高斯滤波
aussian_filter = cv2.GaussianBlur(
img, # 表示输入图像
(21,21), # 滤波的方框大小
1 # σ 标准方差
)
# 中值滤波
median=cv2.medianBlur(
img, # 表示输入图像
5 # 滤波的方框大小
)
print("shape1 : ",box_filter.shape)
print("shape2 : ",blur_filter.shape)
print("shape3 : ",aussian_filter.shape)
cv2.imshow('box_filter', box_filter)
cv2.imshow('blur_filter', blur_filter)
cv2.imshow('aussian_filter', aussian_filter)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
img = cv2.imread('./xiabang.jpg', cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
img_filter(img)