由于种种原因,图像中难免会存在噪声,需要对其去除。噪声可以理解为灰度值的随机变化,即拍照过程中引入的一些不想要的像素点。噪声可分为椒盐噪声,高斯噪声,加性噪声和乘性噪声等,参见:https://zhuanlan.zhihu.com/p/52889476
噪声主要通过平滑进行抑制和去除,包括基于二维离散卷积的高斯平滑,均值平滑,基于统计学的中值平滑,以及能够保持图像边缘的双边滤波,导向滤波算法等。下面介绍其具体使用
1. 二维离散卷积
理解卷积:https://www.zhihu.com/question/22298352/answer/637156871
https://www.zhihu.com/question/22298352/answer/228543288
学习图像平滑前,有必要了解下卷积的知识,看完上述连接,对于图像处理中卷积应该了解几个关键词:卷积核,锚点,步长,内积,卷积模式
卷积核(kernel):用来对图像矩阵进行平滑的矩阵,也称为过滤器(filter)
锚点:卷积核和图像矩阵重叠,进行内积运算后,锚点位置的像素点会被计算值取代。一般选取奇数卷积核,其中心点作为锚点
步长:卷积核沿着图像矩阵每次移动的长度
内积:卷积核和图像矩阵对应像素点相乘,然后相加得到一个总和,如下图所示。(不要和矩阵乘法混淆)
卷积模式:卷积有三种模式,FULL, SAME,VALID,实际使用注意区分使用的那种模式。(参考:https://zhuanlan.zhihu.com/p/62760780)
Full:全卷积,full模式的意思是,从filter和image刚相交开始做卷积,白色部分为填0,橙色部分为image, 蓝色部分为filter,filter的运动范围如图所示。
Same卷积:当filter的锚点(K)与image的边角重合时,开始做卷积运算,可见filter的运动范围比full模式小了一圈,same mode为full mode 的子集,即full mode的卷积结果包括same mode。
valid卷积:当filter全部在image里面的时候,进行卷积运算,可见filter的移动范围较same更小了,同样valid mode为same mode的子集。valid mode的卷积计算,填充边界中的像素值不会参与计算,即无效的填充边界不影响卷积,所以称为valid mode。
python的scipy包中提供了convolve2d()函数来实现卷积运算,其参数如下:
fromscipy import signal
signal.convolve2d(src,kernel,mode,boundary,fillvalue)
src: 输入的图像矩阵,只支持单通的(即二维矩阵)
kernel:卷积核
mode:卷积类型:full, same, valid
boundary:边界填充方式:fill,wrap, symm
fillvalue: 当boundary为fill时,边界填充的值,默认为0
opencv中提供了flip()函数翻转卷积核,filter2D进行same 卷积, 其参数如下:
dst =cv2.flip(src,flipCode)
src: 输入矩阵
flipCode:0表示沿着x轴翻转,1表示沿着y轴翻转,-1表示分别沿着x轴,y轴翻转
dst:输出矩阵(和src的shape一样)
cv2.filter2D(src,dst,ddepth,kernel,anchor=(-1,-1),delta=0,borderType=cv2.BORDER_DEFAULT)
src: 输入图像对象矩阵
dst:输出图像矩阵
ddepth:输出矩阵的数值类型
kernel:卷积核
anchor:卷积核锚点,默认(-1,-1)表示卷积核的中心位置
delat:卷积完后相加的常数
borderType:填充边界类型
2 图像平滑
2.1 高斯平滑
高斯平滑即采用高斯卷积核对图像矩阵进行卷积操作。高斯卷积核是一个近似服从高斯分布的矩阵,随着距离中心点的距离增加,其值变小。这样进行平滑处理时,图像矩阵中锚点处像素值权重大,边缘处像素值权重小,下为一个3*3的高斯卷积核:
opencv中提供了GaussianBlur()函数来进行高斯平滑,其对应参数如下:
dst =cv2.GaussianBlur(src,ksize,sigmaX,sigm