【C++】图像处理中的滤波算法(三)

简介: 总结一下图像处理中常用的几种滤波算法,包括中值、均值、高斯、双边、引导滤波这五种,主要用于图像平滑去噪方面。滤波算法的基本思路,就是采用周边像素,加权平均计算一个新的像素,来缓减噪声对当前像素的影响。

双边滤波

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。

495ca87634c144cf9094705c3e3adc86.png

空间距离:指的是当前点与中心点的欧式距离。

a5e8b78aeba8442694e0aa245658724a.png

灰度距离:指的是当前点灰度与中心点灰度的差的绝对值。

9fb9dfdffcb04a5ebc3a96b20d6f5840.png

6f6563e295ed4ecf9b1a07f020132674.png

ffb7551053af4585945bd8a4dca889e6.png

OpenCV提供bilateralFilter()函数,API的介绍如下:

CV_EXPORTS_WvoidbilateralFilter( InputArraysrc, OutputArraydst, intd,
doublesigmaColor, doublesigmaSpace,
intborderType=BORDER_DEFAULT );

C++实现:

#include <iostream>#include <opencv2/opencv.hpp>usingnamespacestd;
usingnamespacecv;
MataddSaltNoise(constMatsrc, intn);  // 添加椒盐噪声intmain(){
// 读取图像Matsrc=imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
cout<<"cloud not load image."<<endl;
return-1;
    }
// 增加椒盐噪声MatsrcSaltPepper=addSaltNoise(src, 100);
// 中值滤波MatdstMedian;
medianBlur(srcSaltPepper, dstMedian, 3);
MatdstGaussian;
GaussianBlur(srcSaltPepper, dstGaussian, Size(3, 3), 3, 3);
// 双边滤波MatdstBilateralFilter;
bilateralFilter(srcSaltPepper, dstBilateralFilter, 25, 25*2, 25/2);
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
namedWindow("srcSaltPepper", WINDOW_AUTOSIZE);
imshow("srcSaltPepper", srcSaltPepper);
namedWindow("medianBlur", WINDOW_AUTOSIZE);
imshow("medianBlur", dstMedian);
namedWindow("GaussianBlur", WINDOW_AUTOSIZE);
imshow("GaussianBlur", dstGaussian);
namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
imshow("bilateralFilter", dstBilateralFilter);
waitKey(0);
return0;
}
// 添加椒盐噪声MataddSaltNoise(constMatsrc, intn){
Matdst=src.clone();
for (intk=0; k<n; k++){
// 随机选择行列inti=rand() %dst.rows;
intj=rand() %dst.cols;
if (dst.channels() ==1){
dst.at<uchar>(i, j) =255;  // 盐噪声        } else{
dst.at<Vec3b>(i, j)[0] =255;
dst.at<Vec3b>(i, j)[1] =255;
dst.at<Vec3b>(i, j)[2] =255;
        }
    }
for (intk=0; k<n; k++)
    {
//随机取值行列inti=rand() %dst.rows;
intj=rand() %dst.cols;
//图像通道判定if (dst.channels() ==1)
        {
dst.at<uchar>(i, j) =0;  // 椒噪声        } else        {
dst.at<Vec3b>(i, j)[0] =0;
dst.at<Vec3b>(i, j)[1] =0;
dst.at<Vec3b>(i, j)[2] =0;
        }
    }
returndst;
}
目录
相关文章
|
1月前
|
算法 C++ 容器
C++标准库中copy算法的使用
C++标准库中copy算法的使用
17 1
|
2月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
|
1月前
|
算法 搜索推荐 C++
c++常见算法
C++中几种常见算法的示例代码,包括查找数组中的最大值、数组倒置以及冒泡排序算法。
17 0
|
1月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
2月前
|
搜索推荐 算法 C++
|
2月前
|
存储 算法 Serverless
|
2月前
|
存储 算法 搜索推荐
|
3月前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
|
3月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
71 10
|
3月前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
46 3