目录
数字图像处理的配套视频教程:
1.【冈萨雷斯-数字图像处理】开始安排续数字图像处理的教程_哔哩哔哩_bilibili
2. 数字图像处理通俗教程-冈萨雷斯_哔哩哔哩_bilibili
一 基本概念
平滑空间滤波器都包括什么?
- 1.平滑线性滤波器
- 2.中值滤波器
- 3.高斯滤波器
平滑空间滤波器的作用是什么?(低通滤波)
- 1.模糊处理:大目标提取之前先去掉图像中的琐碎细节
- 2.降低噪声:典型的噪声是由于灰度级的急剧变化引起的
滤波原理:滤波就是将核与图像做卷积,得到的卷积结果就是滤波结果
二 平滑线性滤波器
定义:所有系数都相等的滤波器
下图是几个不同kernel size 对应的平滑结果
结论:核的尺寸越大越模糊,且当目标的灰度与其相邻像素的灰度相近时,会有模糊目标的混合效应【模糊处理示例】
那么平滑线性滤波器(盒装滤波器)的作用是什么?
答:为了对感兴趣的物体得到一个粗略的描述而模糊一幅 图像,示例如下:
说明:模糊之后,小目标被拉得跟背景接近,或融于背景,因此再根据大目标的灰度值选一个阈值,便能很好的提取目标(目前项目中大量用到这个原理)
三 中值滤波器
什么是统计排序(非线性)滤波器(中值滤波器)?
像素邻域内灰度的中值来替换目标像素
中值滤波器有哪些应用?
用于去除椒盐噪声
为什么中值滤波器对椒盐噪声比较有效?
由于椒盐噪声是由黑点或白点叠加到图像上的,且黑白点相当于极大值和极小值 ,而中值滤波是用中值替代这些极大值或极小值,因此效果比较明显。
示例如下:
说明:不同的应用选择不同的滤波器,前提是要熟悉滤波器的原理
四 空间域高斯滤波
什么是空间域高斯滤波?
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。 其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出
高斯滤波核怎么算?
将各个位置的坐标带入到高斯函数中,得 到的值就是模板的系数。 对于窗口模板的大小 为 (2k+1)×(2k+1),模板中各个元素值的
计算公式如下:
高斯核标准差如何确定?
标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显
σ越大,则图形越宽,尖峰越小,图形较为平缓;σ越小,则图形越窄,越集中,中间部分也就越尖,图形变化比较剧烈
结论:
- (1)σ越大,分布越分散,各部分比重差别不大,类似于平均模板;
- (2)σ越小,分布越集中,中间部分所占比重远远高于其他部分,就相当于取中间值的运算。
示例代码如下:
五 示例代码
空间域平滑的几个OpenCV函数示例如下
bool CImageProcess::Blur(Mat &img, Mat &out, Filter_Type eType, int nSize, float fSigmaX, float fSigmaY)
{
if (img.empty() || nSize == 0)
{
return false;
}
switch (eType)
{
case TYPE_MEAN:
blur(img, out, Size(nSize, nSize));
break;
case TYPE_GUSSIAN:
//fSigmaX: 高斯函数X方向的标准差
//fSigmaY: 高斯函数Y方向的标准差
GaussianBlur(img, out, Size(nSize, nSize), fSigmaX, fSigmaY);
break;
case TYPE_MEDIAN:
medianBlur(img, out, nSize);
break;
case TYPE_bILATERAL:
{
float fSigmaColor = fSigmaX;
float fSigmaSpace = fSigmaY;
//nSize : 扫描过程中每个邻域的半径大小
//fSigmaColor:: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域
//fSigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色
bilateralFilter(img, out, nSize, fSigmaColor, fSigmaSpace);
}
break;
default:
break;
}
return true;
}
bool CImageProcess::BlurH(Mat &img, Mat&out, int nSize)
{
if (img.empty() || nSize == 0)
{
return false;
}
blur(img, out, Size(nSize, 1));
return true;
}
bool CImageProcess::BlurV(Mat &img, Mat&out, int nSize)
{
if (img.empty() || nSize == 0)
{
return false;
}
blur(img, out, Size(1, nSize));
return true;
}