【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;
}
目录
相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
570 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
29 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)