3种线性滤波:方框滤波、均值滤波、高斯滤波
高斯滤波:
1.定义
图像滤波,即在尽量保留图像细节特征的条件下对噪声进行抑制,通过抑制高频段来减少噪音,同时会造成图像一定程度上的模糊,这也叫做平滑或者低通滤波器;进行平滑时,邻域内不同位置的像素被赋予不同的权值,对图像进行平滑的同时,同时能够更多的保留图像的总体灰度分布特征。
对于高斯核主要有两个参数:高斯核的大小、离散程度σ。
可以知道:为了尽可能的平滑,高斯核应该越大越好,但是对于3σ之外的值,其影响已经不是很大了,所以一般对于其边缘的值小于3σ,一般其大小是2*k+1,为奇数,此时中心点就是(k+1,k+1),然后代入上面公式,分别求得每个位置的值,可以看到因为不是无限大,所以其和应该是略小于1,所以有的时候,在计算的时候不是除以2xpixσ,而是分别求出来,再相加作为分母,这样其和就是1了,具体情况具体分析,效果差不多!
注:k+1是默认下标从1开始的。
2.高斯滤波手动实现代码:
# -*- coding: utf-8 -*- """ Created on Sat Jul 11 14:53:28 2020 @author: 陨星落云 """ import imageio import numpy as np def GaussianFilter(img): h,w,c = img.shape # 高斯滤波 K_size = 3 sigma = 1 # 零填充 pad = K_size//2 out = np.zeros((h + 2*pad,w + 2*pad,c),dtype=np.float) out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float) # 定义滤波核 K = np.zeros((K_size,K_size),dtype=np.float) for x in range(-pad,-pad+K_size): for y in range(-pad,-pad+K_size): K[y+pad,x+pad] = np.exp(-(x**2+y**2)/(2*(sigma**2))) K /= (sigma*np.sqrt(2*np.pi)) K /= K.sum() # 卷积的过程 tmp = out.copy() for y in range(h): for x in range(w): for ci in range(c): out[pad+y,pad+x,ci] = np.sum(K*tmp[y:y+K_size,x:x+K_size,ci]) out = out[pad:pad+h,pad:pad+w].astype(np.uint8) return out if __name__ == "__main__": # 读取图像 img = imageio.imread("lena.jpg") # 高斯滤波 imageio.imsave("GaussianFilter.jpg",GaussianFilter(img))
3.窗口大小以及标准差的影响
均值滤波:
均值滤波是空间域线性滤波器,其中所得到的图像中的每个像素具有的值等于其邻近的像素的输入图像中的平均值。它是低通(“模糊”)滤波器的一种形式。
方框滤波:
方框滤波所用到的核:
14
当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。
归一化就是将要处理的量缩放到一定范围,比如(0,1)。
(函数解析均在后文中统一提供)
注:一般就是均值滤波!!!我感觉
2种非线性滤波:中值滤波、双边滤波
中值滤波
中值滤波的基本思想是用像素点邻域灰度值的中值来代替该像素的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时还能保留图像的细节部分。
中值滤波花费的时间比均值滤波更久,但其在噪声的消除能力上更强。
注:直接看图就明白了。
双边滤波
双边滤波是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保留边缘且去除噪声的目的。
注:暂定!!!!!!!!!!!
Sobel算子
sobel算子的思想,Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。
sobel算子的原理,对传进来的图像像素做卷积,卷积的实质是在求梯度值,或者说给了一个加权平均,其中权值就是所谓的卷积核;然后对生成的新像素灰度值做阈值运算,以此来确定边缘信息。
若Gx是对原图x方向上的卷积,Gy是对原图y方向上的卷积;
另外,卷积核也可以旋转,用与查找不与x,y轴平行或垂直的方向上的边缘。