- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
功能描述
bilateralFilter是图像处理和计算机视觉领域中的一种高级图像滤波技术,特别设计用于在去除噪声的同时保留图像的边缘和细节。相比于传统的滤波器,如均值滤波或高斯滤波,双边滤波器能够在平滑图像的同时保持重要特征的清晰度。
双边滤波器的工作原理是通过一个高斯权重函数来计算每个像素的输出值,这个函数不仅考虑到空间上的邻近度,还考虑到像素值(强度或颜色)的相似度。换句话说,每个像素的新值是由其周围像素的加权平均得出的,其中权重取决于两个因素:空间距离和像素强度差异。
函数原型
函数应用双边滤波器到输入图像上,双边滤波器能够非常好地减少不想要的噪声,同时保持边缘相当清晰。然而,与大多数滤波器相比,它的运行速度非常慢。
标准差值(Sigma values):为了简化设置,你可以将两个标准差值设置为相同。如果它们很小(< 10),滤波器的效果将不明显;而如果它们很大(> 150),滤波器的效果会非常强烈,可能会使图像呈现出“卡通化”的外观。
滤波器尺寸:大尺寸的滤波器(d > 5)运行得非常慢,因此对于实时应用,建议使用d=5;而对于需要重度降噪的离线应用,或许可以使用d=9。
此滤波器不会在原地(inplace)工作,也就是说,它不会直接修改输入图像,而是产生一个新的输出图像。
void cv::bilateralFilter
(
InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
参数
- 参数 src 可以是8位或浮点型,单通道或三通道的图像。
- 参数 dst 目标图像,其大小和类型与源图像src相同 。
- 参数 d 在过滤过程中使用的每个像素邻域的直径。如果该值是非正数,它将从sigmaSpace计算得出。
- 参数 sigmaColor 色彩空间中的滤波器标准差。参数值越大意味着在像素邻域内(参见sigmaSpace)距离较远的颜色会被更多地混合在一起,从而导致更大区域的半等色块出现。
- 参数 sigmaSpace坐标空间中的滤波器标准差。参数值越大意味着只要颜色足够接近(参见sigmaColor),距离较远的像素也会相互影响。当d>0时,它规定了邻域的大小,不受sigmaSpace的影响。否则,d与sigmaSpace成比例。
- 参数 borderType 用于推算图像外像素的边界模式,详情请参阅BorderTypes
代码
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
// 读取图像
cv::Mat src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg", cv::IMREAD_COLOR);
if (!src.data)
{
std::cerr << "Error: Image cannot be loaded.\n";
return -1;
}
// 设置双边滤波参数
int d = 9; // 直径
double sigmaColor = 210; // 颜色空间标准差
double sigmaSpace = 75; // 坐标空间标准差
cv::Mat dst;
// 应用双边滤波
cv::bilateralFilter(src, dst, d, 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;
}
运行结果
你可以修改sigmaColor和sigmaSpace的值,看看运行效果有啥不同,增强对参数的理解