文章目录
- 一、平滑处理
- 二、图像滤波
- 三、邻域算子与线性邻域滤波
- 四、方框滤波
- 代码演示
一、平滑处理
平滑处理也称为模糊处理,是一种简单且使用频率很高的图像处理方法,平滑处理的用途有很多,最常见的是用来减少图像上的噪点或者失真。在涉及到降低图像分辨率时,平滑处理是非常好用的方法。
二、图像滤波
图像滤波指的是在尽量保留图像细节特征的条件下对图像的噪音进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将会直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫做图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频或中频段,而在高频段,有用的信息经常会被噪声淹没,因此一个能降低高频成分幅度的滤波器就能减弱噪声的影响。
图像滤波有两个目的: 一是抽出对象的特征作为图像识别的特征模式;另一个是为了适应图像处理的要求,消除图像数字化时所混入的噪声。
对滤波处理的两个要求:一是不能损坏图像边缘及轮廓等重要信息;二是使得图像清晰视觉效果好。
三、邻域算子与线性邻域滤波
邻域算子是利用给定像素周围的像素值来决定此像素的最终输出值的一种算子。线性邻域滤波就是一种常用的邻域算子,像素的输出值取决于输入像素的加权和。邻域算子除了用于局部色调调整之外,还可以用于图像滤波,实现图像的平滑和锐化,图像边缘增强或图像噪声的去除。线性邻域算子,用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。
邻域算子值利用给定像素周围像素的值决定此像素的最终输出。如图左边图像与中间图像卷积生成右边图像。目标图像中绿色的像素由原图像中蓝色标记的像素计算得到。
线性滤波处理的输出像素值是输入像素值的加权和,其中的 h 为加权系数也就是滤波系数。
在 OpenCV 中提供了常见的三种线性滤波操作分别是方框滤波,均值滤波,高斯滤波,接下来我们分别了解一下。
四、方框滤波
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1, -1), boolnormalize=true, int borderType=BORDEX_DEFAULT)
其中,第一个参数表示输入的原图像,第二个参数表示目标图像,需要和原图像一样尺寸和类型,第三个参数表示输出图像的深度,-1代表使用原深度,即src.depth(),第四个参数表示 Size 类型的 ksize ,内核的大小。一般用 Size(w, h) 表示内核的大小,其中 w 为像素宽度,h 为像素的高度。Size(3, 3)的核大小。第五个参数表示锚点(平滑的那个点)。默认是 Point(-1, -1)。如果这个点的坐标是负值的话,就取核的中心为锚点。第六个参数六表示内核是否被其区域归一化了,第七个参数表示用于推断图像外部像素的某种边界模式。
代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
// 读取输入图像
Mat src = imread("D://cc.jpg", IMREAD_COLOR);
if (src.empty())
{
std::cout << "无法读取图像" << std::endl;
return -1;
}
// 创建输出矩阵
Mat dst;
// 应用方框滤波器
int ddepth = -1; // 使用与输入图像相同的深度
Size ksize(3, 3); // 内核的大小
Point anchor(-1, -1); // 内核中的锚点
bool normalize = true; // 归一化内核
int borderType = BORDER_DEFAULT; // 边界类型
boxFilter(src, dst, ddepth, ksize, anchor, normalize, borderType);
// 显示结果
imshow("输入", src);
imshow("输出", dst);
waitKey(0);
return 0;
}
- 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
- 💟 作 者:锡兰_CC ❣️
- 📝 专 栏:【OpenCV • c++】计算机视觉
- 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪
其他:
更多专栏订阅推荐:
- 👍 【开卷数据结构】
- 💛 【备战蓝桥,冲击省一】
- 💕 从零开始的 c++ 之旅
- 💖 【OpenCV • c++】计算机视觉