为了消除外界环境对图像采集的干扰,增强图像的边缘及灰度跳变的部分,使图像变得清晰以及提高图像处理速度需要对图像进行预处理操作,主要是对图像进行滤波和增强操作。
使用的方法可以分为空间域处理和频率域处理两类。
空间域指图像平面本身,这类图像处理方法用各种模板直接与图像进行卷积运算,实现对图像的处理。
频率域是指从函数的频率角度出发分析函数,对图像进行傅里叶变换可以将图像由图像空间转换到频域空间,然后在频率域中对图像的频谱作分析处理,以改变图像的频率特征。
空间域与频率域是两种不同的技术,都可以实现对图像的滤波、增强,只是有些处理方式更适合在空间域完成,而有些则更适合在频率域中完成。
频率域的理解、使用还是很很困难的,需要深厚的数学功底,我也不是特别明白,以后的示例主要是图像在空间域的处理。
图像滤波(模糊)
滤波也叫模糊,下面是opencv中常见的五种滤波方法,先看一下滤波前后的效果。
# -*- coding: utf-8 -*-
"""
运行环境 python==3.6 opencv-contrib-python== 4.1 win10系统
第一行 “ # -*- coding: utf-8 -*- ” 告诉Python解释器,按照UTF-8编码读取源代码
"""
dir1="lena.jpg"
img1=cv2.imread(dir1) #读入图片
#
#2D滤波 ,2D卷积就是自定义构造一个核
#构建一个卷积核5*5
kernel=np.ones((5,5),np.float32)/25 # 除以25是防止数值溢出
filter2D=cv2.filter2D(img1,-1,kernel)
cv2.imshow("filter2D", filter2D)
#
#中值模糊
#中值滤波法是一种非线性平滑技术,对椒盐噪声有很好的去燥效果
medianBlur=cv2.medianBlur(img1,5)
cv2.imshow("medianBlur", medianBlur)
#
#均值模糊
#均值滤波是典型的线性滤波算法,去随机噪声有很好的去噪效果
#dst=cv2.blur(img1, (1, 5)) #(1, 15)是垂直方向模糊,(15, 1)还水平方向模糊
#dst=cv2.blur(img1, (5, 1)) #(1, 15)是垂直方向模糊,(15, 1)还水平方向模糊
blur=cv2.blur(dst,(5,5)) #两个方向模糊
cv2.imshow("blur", blur)
#
#高斯模糊
#保留图像的主要特征 轮廓 高斯模糊比均值模糊去噪效果好
GaussianBlur=cv2.GaussianBlur(img1,(5,5),0)
cv2.imshow("GaussianBlur", GaussianBlur)
#
#双边滤波 ,保留边缘
# Python: cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst
#src:输入图像
#d:过滤时周围每个像素领域的直径
#sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
#sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。
bilateralFilter = cv2.bilateralFilter(img1,13,75,75)
cv2.imshow("bilateralFilter", bilateralFilter)
#
cv2.waitKey(0)
cv2.destroyAllWindows()
滤波方法还有很多,具体选择哪种方法要根据实际图像确定,参数需要不断的调整,滤波效果好的图像,有利于后续的图像处理。