6.4双边滤波

2024-09-09 08:04
文章标签 滤波 6.4 双边

本文主要是介绍6.4双边滤波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

实验原理

示例代码1

运行结果1

实验代码2

运行结果2


实验原理

双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在OpenCV中,可以使用bilateralFilter()函数来实现双边滤波。

函数原型

在OpenCV中,用于实现双边滤波的函数是cv::bilateralFilter。
其原型如下:
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT );参数说明
•src:输入图像。
•dst:输出图像,与输入图像具有相同的大小和类型。
•d:直径,即滤波器的直径(即卷积核的直径)。如果设置为负数(例如-1),则根据sigmaSpace计算直径。
•sigmaColor:颜色空间的标准差,用于控制像素值的相似程度。较大的sigmaColor值会使得距离较远的像素也被考虑进来。(在颜色空间中的变化量,较大的值意味着更大的颜色差异也能被包括进来)。
•sigmaSpace:空间域的标准差,用于控制距离中心像素的距离。较大的sigmaSpace值会使得更大的邻域像素被考虑进来。(在空间域中的变化量,较大的值意味着远处的像素也会影响当前像素的值)。
•borderType:边界处理类型,默认为BORDER_DEFAULT,可以选择不同的边界处理方式,如BORDER_CONSTANT、BORDER_REFLECT等。边界处理borderType参数决定了如何处理图像边缘的像素。
常见的边界处理方式包括:
•BORDER_CONSTANT:用指定的常数值填充边界。
•BORDER_REPLICATE:边界像素值向外扩展。
•BORDER_REFLECT:反射边界,如12345反射为45454。
•BORDER_WRAP:循环边界,如12345循环为34512。

工作原理

双边滤波器在每个像素点上应用一个卷积核(Kernel),该核根据两个因素来确定每个邻域像素的权重:

1. 颜色相似性:越接近的颜色,权重越高。

2. 空间距离:越接近的像素,权重越高。双边滤波器通过结合这两个因素来计算每个像素的新值,从而达到既能平滑图像又能保持边缘的效果。

优点

1. 去噪能力强:特别适合去除随机噪声。

2. 边缘保持:由于双边滤波是非线性滤波,它在平滑图像的同时能较好地保持图像的边缘和细节。

不足

1. 计算复杂度较高:相比于简单的线性滤波器(如均值滤波或高斯滤波),双边滤波涉及更多的计算量。

2. 参数选择:需要仔细调整d、sigmaColor和sigmaSpace参数以获得最佳效果。

示例代码1

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 读取图像cv::Mat src = cv::imread("010.png", cv::IMREAD_COLOR);if (!src.data){std::cout << "Error loading image" << std::endl;return -1;}// 定义输出图像cv::Mat dst;// 设置双边滤波参数int diameter = 9; // 直径大小double sigmaColor = 75; // 颜色空间标准差double sigmaSpace = 75; // 坐标空间标准差// 应用双边滤波cv::bilateralFilter(src, dst, diameter, sigmaColor, sigmaSpace);// 显示原始图像和滤波后的图像cv::namedWindow("Original Image", cv::WINDOW_NORMAL);cv::imshow("Original Image", src);cv::namedWindow("Bilateral Filtered Image", cv::WINDOW_NORMAL);cv::imshow("Bilateral Filtered Image", dst);// 等待按键cv::waitKey(0);return 0;
}//在这个例子中,我们加载了一张图片,并对其应用了双边滤波。
//你可以根据需要调整diameter, sigmaColor, 和 sigmaSpace 参数来获得不同的滤波效果。
代码解释
1. 读取图像:使用cv::imread读取输入图像,并确保它是彩色图像。
2. 创建输出图像:创建一个新的cv::Mat对象来存储滤波后的结果。
3. 定义双边滤波参数:定义滤波器直径、颜色空间的标准差和空间域的标准差。
4. 应用双边滤波:使用cv::bilateralFilter函数对图像进行双边滤波。
5. 显示结果:使用cv::imshow函数显示原始图像和双边模糊后的图像,并等待用户按键退出。

运行结果1

图片中模糊椒盐点会消失

参数调整

•d:直径(Diameter)参数决定了滤波器的大小。较大的直径可以产生更强烈的平滑效果,但可能会丢失更多的细节;较小的直径则可以保留更多细节,但平滑效果较弱。

•sigmaColor:颜色空间的标准差,用于控制像素值的相似程度。较大的sigmaColor值会使得距离较远的像素也被考虑进来。

•sigmaSpace:空间域的标准差,用于控制距离中心像素的距离。较大的sigmaSpace值会使得更大的邻域像素被考虑进来。

总结

双边滤波是一种有效的图像平滑技术,通过结合颜色相似性和空间距离来选择权重,从而既能去除噪声又能保持边缘和细节。通过调整直径、颜色空间的标准差和空间域的标准差,可以控制滤波器的效果。cv::bilateralFilter函数提供了方便的接口来实现双边滤波,并且允许用户指定边界处理方式。

实验代码2

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;
char window_name[] = "Smoothing Demo";
int display_caption(const char* caption);
int display_dst(int delay);
int main(int argc, char ** argv)
{namedWindow(window_name, WINDOW_NORMAL);//const char* filename = argc >= 2 ? argv[1] : "lena.png";//src = imread(samples::findFile(filename), IMREAD_COLOR);//src = imread("00.jpeg", IMREAD_COLOR);if (src.empty()){printf(" Error opening image\n");printf(" Usage:\n %s [image_name-- default lena.jpg] \n", argv[0]);return EXIT_FAILURE;}if (display_caption("Original Image") != 0){return 0;}dst = src.clone();if (display_dst(DELAY_CAPTION) != 0){return 0;}if (display_caption("Homogeneous Blur") != 0){return 0;}for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){blur(src, dst, Size(i, i), Point(-1, -1));if (display_dst(DELAY_BLUR) != 0){return 0;}}if (display_caption("Gaussian Blur") != 0){return 0;}for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){GaussianBlur(src, dst, Size(i, i), 0, 0);if (display_dst(DELAY_BLUR) != 0){return 0;}}if (display_caption("Median Blur") != 0){return 0;}for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){medianBlur(src, dst, i);if (display_dst(DELAY_BLUR) != 0){return 0;}}if (display_caption("Bilateral Blur") != 0){return 0;}for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2){bilateralFilter(src, dst, i, i * 2, i / 2);if (display_dst(DELAY_BLUR) != 0){return 0;}}display_caption("Done!");return 0;
}
int display_caption(const char* caption)
{dst = Mat::zeros(src.size(), src.type());putText(dst, caption,Point(src.cols / 4, src.rows / 2),FONT_HERSHEY_COMPLEX, 1,Scalar(255, 255, 255));return display_dst(DELAY_CAPTION);
}
int display_dst(int delay)
{imshow(window_name, dst);int c = waitKey(delay);if (c >= 0) { return -1; }return 0;
}

运行结果2

脸上痣会消失!

​​​​​​​

这篇关于6.4双边滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150603

相关文章

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

6.3中值滤波

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验原理 中值滤波(Median Filtering)是一种非线性滤波技术,常用于图像处理中去除噪声,特别是在保留边缘的同时减少椒盐噪声(salt-and-pepper noise)。OpenCV中的cv::medianBlur函数可以实现中值滤波。 函数原型 void medianBlur( InputAr

通信工程学习:什么是SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制

SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制        SSB单边带调制、VSB残留边带调制、DSB抑制载波双边带调制是三种不同的调制方式,它们在通信系统中各有其独特的应用和特点。以下是对这三种调制方式的详细解释: 一、SSB单边带调制 1、SSB单边带调制的定义:        单边带调制(Single Sideband Modulation,SSB)是

【控制算法 数据处理】一阶滤波算法

简单介绍: 一阶滤波算法是比较常用的滤波算法,它的滤波结果=a*本次采样值+(1-a)*上次滤波结果,其中,a为0~1之间的数。一阶滤波相当于是将新的采样值与上次的滤波结果计算一个加权平均值。a的取值决定了算法的灵敏度,a越大,新采集的值占的权重越大,算法越灵敏,但平顺性差;相反,a越小,新采集的值占的权重越小,灵敏度差,但平顺性好。优点是对周期干扰有良好的抑制作用,适用于波动频率比较高的场合,它

RSSI滤波方法

文章目录 一、均值滤波二、递推平均滤波三、中位值滤波四、狄克逊检验法滤波五、高斯滤波六、速度滤波七、卡尔曼滤波 一、均值滤波 均值滤波是指节点接收到另一节点的多个RSSI值之后,求其算式平均值,作为测试结果 R S S I ‾ = 1 n ∙ ∑ i = 1 n R S S I i \overline{RSSI} = \frac {1}{n} \bullet \sum_{i=1

总结之:CentOS 6.4系统裁减详解及装载网卡步骤

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://tanxw.blog.51cto.com/4309543/1368801 前言    随着接触Linux的慢慢深入、对Linux也有了一个基本认识了吧,慢慢的接触系统内核、系统配置文件、在了解Linux的系统启动流程后,现在来总结一下一个简单的Linux系统的裁减方法和

CUDAPCL ROR点云滤波

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 该方法的具体原理为输入的点云中每一个点设定一个范围(半径为r的圆),如果在该范围内没有达到某一个设定的点数值,则该数据点将会被删除,重复上述此过程直到最后一个数据点,即完成该滤波过程。 二、实现代码 ROR.cuh #ifndef ROR_GPU_CUH#define ROR_GPU_CU

matlab频域滤波

步骤: (1)计算原图像f(x,y)的DFT, (2) 讲频谱的零频点移动到频谱图的中心位置; (3)计算滤波器函数H(U,V)与F(U,V)的乘积G(U,V); (4)讲频谱G(U,V)的零频点移回到频谱图的坐上角。 (5)计算(4)的结果的傅立叶反变换g(x,y); (6)取g(x,y)的实部作为最终的滤波后的结果图像。   代码: 大家别激动的啦   代

工控常用滤波方法(限幅+中值+算术平均+滑动平均)

工控常用滤波方法 简介限幅滤波法中值滤波法算术平均滤波法滑动平均滤波 简介 在实际的工程应用中,实际反馈的信号由于是通过电压及电流转换而来的数字量信号,在现场可能会受到比较大的干扰问题,这样的扰动会影响控制系统的输出精度,也会使其产生比较大的偏差。 故在实际应用中,通常不会直接将反馈的信号作为信号输入,会在之前加一个滤波器以使数据更平滑,在此,非常有必要引入数字滤波的概念。

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务         1.实现单帧降噪         2.实现多帧投影         3.实现多帧累积         Bonus:使用À-Trous Wavelet 加速单帧降噪 实现         单帧降噪         这里实现比较简单,直接根据给出的联合双边滤波核的公式就能实现          Buffer2D<Float3> Denoiser::Fil