- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
应用双边滤波到图像。
该函数对输入图像应用双边滤波,如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 所描述的那样。bilateralFilter 可以很好地减少不需要的噪声,同时保持边缘相当锐利。然而,与大多数滤波器相比,它的速度非常慢。
Sigma值:为了简单起见,你可以将两个sigma值设置为相同。如果它们较小(< 10),滤波器不会有太大效果;而如果它们较大(> 150),则会产生很强的效果,使图像看起来"卡通化"。
滤波器大小:大的滤波器(d > 5)非常慢,因此建议在实时应用中使用 d=5,在需要大量噪声过滤的离线应用中可以考虑使用 d=9。
此滤波器不支持原地操作。
注意
函数文本ID是 "org.opencv.imgproc.filters.bilateralfilter"
函数原型
cpp
GMat cv::gapi::bilateralFilter
(
const GMat & src,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
参数
- 参数 src: 源8位或浮点型,单通道或三通道图像。
- 参数 d: 在滤波过程中使用的每个像素邻域的直径。如果它不大于零,则从 sigmaSpace 计算得出。
- 参数 sigmaColor: 颜色空间中的滤波sigma值。该参数值越大表示颜色差异的影响越小,导致在颜色相近的像素之间混合更大的区域。
- 参数 sigmaSpace: 坐标空间中的滤波sigma值。该参数值越大表示距离的影响越小,只要它们的颜色足够接近(参见 sigmaColor)。当 d>0 时,它指定邻域大小而不考虑 sigmaSpace。否则,d 与 sigmaSpace 成正比。
- 参数 borderType: 边界模式用于外推图像外部的像素,请参阅 BorderTypes
返回值
返回与 src 相同大小和类型的输出图像。
代码示例
cpp
#include <opencv2/gapi/core.hpp> // 包含G-API核心功能
#include <opencv2/gapi/imgproc.hpp> // 包含imgproc模块,可能需要的其他G-API模块
#include <opencv2/opencv.hpp>
int main()
{
// 加载输入图像
cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );
if ( src.empty() )
{
std::cerr << "Error: Image cannot be loaded!" << std::endl;
return -1;
}
// 定义双边滤波参数
int d = 9; // 邻域直径
double sigmaColor = 100; // 颜色空间的标准差
double sigmaSpace = 100; // 坐标空间的标准差
int borderType = cv::BORDER_DEFAULT; // 边界填充模式
// 定义G-API计算图来应用双边滤波
cv::GComputation comp( [ d, sigmaColor, sigmaSpace, borderType ]() {
cv::GMat in; // 输入:源图像
cv::GMat out = cv::gapi::bilateralFilter( in, d, sigmaColor, sigmaSpace, borderType );
return cv::GComputation( cv::GIn( in ), cv::GOut( out ) );
} );
// 输出结果
cv::Mat dst;
try
{
// 执行计算图并传入实际的cv::Mat数据
comp.apply( cv::gin( src ), cv::gout( dst ) );
// 显示结果
cv::imshow( "Original Image", src );
cv::imshow( "Filtered Image", dst );
cv::waitKey( 0 ); // 等待按键事件
}
catch ( const std::exception& e )
{
std::cerr << "Exception: " << e.what() << std::endl;
return -1;
}
return 0;
}
运行结果
