图像滤波
尽量保留图像细节特征的条件下对目标图像的噪声进行抑制(即去除图像中一些不重要的细节)
实现方式:模板卷积
1. 卷积算子计算是线性(线性滤波)
2. kernel本质是固定大小的矩阵数组,其中心点称为锚点
3. 卷积过程:模板从左到右,从上到下,移动,把kernel覆盖的像素和kernel对应位置的值相乘再求和(包括锚点),赋值给锚点
步骤:
a. 将模板在图中沿一定方向逐点移动,并将模板中心与图中某个像素位置重合;
b. 将模板上系数与模板下对应像素相乘;
c. 将所有乘积相加;
d. 将和(模板的输出响应)赋给图中对应模板中心位置的像素。
注意:
宽高必须是奇数(即有中心像素),宽高可以不一致(即有模糊的方向)
4. 卷积越大,图像越模糊
5. 图像外围的边缘像素没办法卷积,需要扩充图像边界(邻近插值)
边缘处理
卷积的边界:边缘像素没有和锚点重合,当kernal为3x3,则边缘有1个像素没处理,当kernal为5x5,则边缘有2个像素没处理。因此在卷积处理前增加边缘像素,卷积处理后去掉边缘像素。
copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);
src:图像
dst:目标图像
top:上边缘填充长度
bottom:下边缘填充长度
left:左边缘填充长度
right:右边缘填充长度
borderType:边界填充类型(BORDER_DEFAULT 默认,BORDER_CONSTANT 指定像素值,BORDER_REPLICATE 用已知边缘像素值,BORDER_WRAP 用另一边的边缘像素值)
color:填充颜色
掩膜
void filter2D( InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor = Point(-1,-1), double delta = 0, int borderType = BORDER_DEFAULT );
src:图像
ds:目标图像
ddepth:图像深度(8/32),为-1时,目标图像和原图像深度保持一致
kernel:模板
anchor:锚点位置,Point(-1,-1)时为中心像素
delta:在储存目标图像前可选的添加到像素的值
borderType:边界填充类型
均值滤波
原理:模板的权重都是1,将模板覆盖的像素求均值替换掉模板中心的像素值。
void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );
src:图像
ds:目标图像
ksize:模板宽/高
anchor:锚点位置
borderType:边界填充类型
中值滤波
原理:将模板覆盖的像素排序找出中值(这样去掉了最小值,最大值,抑制椒盐噪声)
void medianBlur( InputArray src, OutputArray dst, int ksize );
src:图像
dst:目标图像
ksize:模板宽/高
高斯滤波
原理:以模板的中心位置为高斯函数坐标原点进行取样,越靠近模板中心权重越大
void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
src:图像
dst:目标图像
ksize:模板宽/高
sigmaX:高斯核函数在X方向的的标准偏差
sigmaY:高斯核函数在Y方向的的标准偏差
borderType:边界填充类型
高斯双边滤波
原理:高斯双边滤波保留了边缘,避免了图像轮廓失真。保留差异的部分,滤波值比较大的部分,值比较小的部分。均值滤波丢失了边缘像素,高斯滤波部分克服了该缺陷。
void bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT );
src:图像
dst:目标图像
d:计算半径
sigmaColor:颜色空间过滤器的sigma值
sigmaSpac:坐标空间中滤波器的sigma值
borderType:边界填充类型