- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
滤波是图像和视频处理中的基础操作。边缘保留平滑滤波器被广泛应用于多种不同场景[98]。
cv::edgePreservingFilter 是一种边缘保留滤波器,用于在平滑图像的同时保留边缘细节。其核心目标是:
- 降噪:减少图像中的噪声。
- 边缘保护:避免平滑操作模糊图像中的边缘和重要结构。
工作原理
-
边缘检测:
计算图像梯度或边缘强度,标记潜在边缘区域。
-
空间域平滑:
使用高斯滤波对图像进行初步平滑(由sigma_s控制范围)。
-
频率域滤波:
在频域中应用高斯滤波,保留与边缘相关的高频成分,抑制噪声(由sigma_r控制颜色相似性)。
-
边缘恢复:
根据边缘信息修正平滑后的图像,确保边缘清晰(具体方式取决于flags选择的算法)。
-
输出:
将处理后的图像转换回空间域,得到最终结果。
函数原型
cpp
void cv::edgePreservingFilter
(
InputArray src,
OutputArray dst,
int flags = 1,
float sigma_s = 60,
float sigma_r = 0.4f
)
参数
- src 输入 8 位 3 通道图像。
- dst 输出 8 位 3 通道图像。
- flags 边缘保护滤波器类型:cv::RECURS_FILTER 或 cv::NORMCONV_FILTER。
- sigma_s 取值范围为 0~200。
- sigma_r 取值范围为 0~1。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main( int argc, char* argv[] )
{
Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/jiangnan.jpg" ); // 输入图像
if ( src.empty() )
{
printf( "不能打开图像!\n" );
return -1;
}
namedWindow( "1-原图", WINDOW_AUTOSIZE );
imshow( "1-原图", src );
Mat dst;
edgePreservingFilter( src, dst, 1, 60, 0.44 ); // 调用滤波函数
imshow( "2-edgePreservingFilter", dst );
waitKey( 0 );
return 0;
}
运行结果
