江西做网站,wordpress源代码很乱,站内推广策略,网站制作资质1、前言 什么是噪声#xff1f; 该像素与周围像素的差别非常大#xff0c;导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息#xff0c;降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素 该像素与周围像素的差别非常大导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素这样的噪声也被称为“椒盐噪声”或“盐噪声”。
在图像处理中为了提升图像的整体质量通常我们需要对图像进行模糊处理即通过卷积运算对每个像素进行滤波或平滑减少图像的细节使得图像噪声削弱凸显特征明显的区域。图像的卷积运算上一章已介绍这里不再赘述。
2、均值滤波 把卷积核覆盖在原图上上依次滑过每个像素计算卷积核覆盖像素值的加权平均并赋值给被核中心覆盖的那个像素值。比如下图原图像是一个5x5图像现在有个3x3卷积核放在图像最开始的位置计算卷积核覆盖的像素值的加权平均 注意均值滤波卷积核上的每个权重默认为1 卷积核 原图像 加权平均计算
(102015501003520550)* 1 / (111111111) 33核中心像素值即原图像第二行第二列会被重新赋值为33 下图阴影区域为核中心滑过的区域 可以看到原图像5x5在经过卷积运算后图像变为了3x3如果想让核中心扫过图像边缘像素保持图像大小不变可以在原图像基础上拓展一层边缘如下图
opencv提供了均值滤波接口如下
void cv::blur(InputArray src, OutputArray dst, Size ksize, Point anchorPoint(-1,-1), int borderTypeBORDER_DEFAULT)src原图 dst滤波后图像 ksize卷积核大小注意卷积核只能是奇数这样才有核中心建议使用3x35x5和7x7卷积核越大图像越模糊卷积时间越长 anchor 表示锚点(anchor)的位置即被平滑的那个点。默认值Point(-1,-1)表示锚点位于核的中心。 borderType 边框模式用于推断图像外部的像素一般默认
我们现在用5x5卷积核对下列图像做均值滤波可以看到右边图像已模糊处理 由于均值模糊是对窗口中所有像素点求平均值在图像的边缘或者纹理丰富的地方也会变得模糊。为了尽可能的保留图像中的边缘信息可以给不同位置的像素点赋以不同的权值。距离中心点越近的像素权值越大而远离中心点的像素权值也逐渐减少这时候可以采用高斯滤波。
3、高斯滤波
在高斯滤波中卷积核的权重由高斯分布正态分布的取值来确定。 我们首先来介绍下高斯函数。
一维高斯函数 从下图中可以看到高斯分布正态分布是一种钟形曲线越接近中心取值越大越远离中心取值越小。我们给卷积核分配权重的时候以曲线中心点为原点分配给核中心核其他位置的权重按高斯曲线上递减趋势分配。 高斯函数中的参数σ表征着高斯滤波器宽度(决定着平滑程度)当σ越大高斯滤波器的频带就越宽平滑程度就越高(越接近均值滤波)通过调节平滑程度参数σ可调整图像的平滑程度。 概率密度函数也为高斯函数。因为该函数只有一个变量x所以我们也称该函数为一维高斯函数。 再回到一维高斯函数图中图中X轴的数值表示标准差的大小比如0.5表示0.5个标准差大小对应的高斯曲线上面的数值为0.5sigma在0-0.5sigma区间内占比为19.1%。当我们取-3sigma-3sigma区间占比达到99.8%默认该段分布包含了所有情况。
二维高斯函数 因为图像是二维空间涉及XY两个方向这时候用一维高斯函数进行处理显然不太合适这时引入二维高斯函数是一个很好的解决方案。
引入二维高斯函数进行模糊处理
假设一个高斯函数的卷积和模板是5*5那么他这25个点的xy具体取值为 此时只需要假定一个sigma值即可确定一个高斯核比如
但是这个高斯核不完整因为他求出的5*5的卷积核进行卷积操作时改变了图像原始的0-255的范围。为解决该问题只需要将卷积核归一化即可即需要保证权重之和等于1也就是卷积核中每一个值除以卷积的总和。 实际应用 有个3x3高斯核内部坐标如下 为了计算权重矩阵需要设定标准差σ的值。假定σ1.5带入二阶高斯函数计算结果如下 这9个点的权重总和等于0.479如果只计算这9个点的加权平均还必须让它们的权重之和等于1因此上面9个值还要分别除以0.479得到最终的权重矩阵。 现在有了高斯核可以进行图像模糊计算假设现有9个像素点灰度值0-255如下 将高斯核覆盖在图像上覆盖的每个像素点乘以对应的权重再除以权重之和即可得到高斯核中心覆盖的原图像像素最新的值
(1.326*14 1.775*15 1.516*16 2.84*24 3.694*25 3.076*26 3.221*34 4.141*35 3.41*36) / 1 3.694如果图像很大将高斯核依次在图像上的每个像素点滑动计算核中心的像素值最后就得到了高斯模糊后的图像。如果是彩色图像可对RGB三通道分别进行高斯模糊计算。
opencv高斯模糊函数调用
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY 0,
int borderType BORDER_DEFAULT
);src原图像 dst高斯滤波后的图像 ksize滤波核的大小宽、高必须是奇数例如3,3、5,5等。 sigmaX卷积核水平方向的标准差σ sigmaY卷积核垂直方向的标准差σ。修改 sigmaX 或 sigmaY 的值都可以改变卷积核中的权重比例。如果不知道如何设计这两个参数值就直接把这两个参数的值写成0方法就会根据滤波核的大小自动计算出合适的权重比例。 boderType可选参数边界样式建议使用默认值。 这里需要注意的是在二维高斯函数中标准差σ只有一种没有σ1和σ2如果我们设置sigmaX等于sigmaY,这样拿到的是一个圆形高斯核完全和二维高斯函数生成的一样如果sigmaX不等于sigmaY我们拿到的是一个椭圆形高斯核即在X和Y方向调用了分别调用二维高斯函数计算高斯核因为标准差σ不一样。 sigmaX和sigmaY该怎么取值 如果 sigmaX 和 sigmaY 都设置为相同的值那么高斯核将是一个圆形的产生各向同性的模糊。这通常在需要保持图像各向同性的情况下使用比如去除噪声或者平滑图像。 如果 sigmaX 和 sigmaY 设置为不同的值高斯核将呈椭圆形状产生各向异性的模糊。这可以在需要在图像的不同方向上应用不同程度的模糊时使用。 具体的 sigmaX 和 sigmaY 的值可以根据图像的特性来选择。如果图像中有较大的细节结构可能需要较小的标准差来保留这些细节。相反如果图像中的结构比较平坦可以使用较大的标准差进行更强烈的模糊。
高斯滤波后的图像如下
参考文章【图像处理】高斯模糊、高斯函数、高斯核、高斯卷积操作