C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > opencv 双边滤波

c/c++中opencv双边滤波的实现

作者:whoarethenext

本文主要介绍了c/c++中opencv双边滤波的实现,通过空间与颜色相似度双重权重实现图像去噪与边缘保留,具有一定的参考价值,感兴趣的可以了解一下

双边滤波器(Bilateral Filter)是一种非线性的图像平滑技术,它能够在有效去除噪声的同时,较好地保留图像的边缘信息。这使其在许多图像处理任务中非常受欢迎,例如图像美化、降噪等。本文将介绍双边滤波的原理,并展示如何使用 C++ 和 OpenCV 库来实现它。

双边滤波原理简介

传统的线性平滑滤波器(如高斯模糊、均值模糊)在平滑图像时,不区分像素间的差异,导致边缘区域也会被模糊掉。双边滤波器则巧妙地结合了空间邻近度像素值相似度(颜色强度)两个方面的信息。

它主要由两个高斯函数组成:

最终,一个像素的权重是这两个高斯权重的乘积。这意味着,只有当一个邻近像素同时满足“离得近”和“颜色像”这两个条件时,它才会对中心像素的滤波结果产生较大影响。因此,边缘(颜色差异大的地方)就能被较好地保留下来。

OpenCV中的 cv::bilateralFilter 函数

OpenCV 提供了 cv::bilateralFilter 函数来实现双边滤波。

函数原型 (C++):

void cv::bilateralFilter(
    cv::InputArray src,         // 输入图像 (8位或浮点型, 1通道或3通道)
    cv::OutputArray dst,        // 输出图像,与输入图像大小和类型相同
    int d,                      // 滤波过程中每个像素邻域的直径。如果是非正数,则由 sigmaSpace 计算得出
    double sigmaColor,          // 颜色空间滤波器的 sigma 值。这个参数越大,表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
    double sigmaSpace,          // 坐标空间滤波器的 sigma 值。这个参数越大,表明越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当 d > 0 时,d 指定了邻域大小且与 sigmaSpace 无关。否则,d 正比于 sigmaSpace。
    int borderType = cv::BORDER_DEFAULT // 用于推断图像外部像素的某种边界模式
);

参数详解:

C++/OpenCV 代码示例

下面是一个简单的 C++ 示例,演示如何加载一张图片,对其应用双边滤波,并显示原图和处理后的图像。

#include <opencv2/opencv.hpp> // 包含OpenCV主要头文件
#include <iostream>           // 用于标准输入输出

int main() {
    // --- 1. 加载图像 ---
    std::string imagePath = "your_image.jpg"; // 替换为你的图片路径
    cv::Mat srcImage = cv::imread(imagePath);

    // 检查图像是否成功加载
    if (srcImage.empty()) {
        std::cerr << "Error: Could not open or find the image!" << std::endl;
        return -1;
    }

    // --- 2. 应用双边滤波 ---
    cv::Mat filteredImage;
    int diameter = 9;          // 邻域直径
    double sigmaColor = 75;    // 颜色标准差
    double sigmaSpace = 75;    // 空间标准差

    // 调用双边滤波函数
    cv::bilateralFilter(srcImage, filteredImage, diameter, sigmaColor, sigmaSpace);

    // --- 3. 显示图像 ---
    // 创建窗口
    cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
    cv::namedWindow("Bilateral Filtered Image", cv::WINDOW_AUTOSIZE);

    // 显示图像
    cv::imshow("Original Image", srcImage);
    cv::imshow("Bilateral Filtered Image", filteredImage);

    // --- 4. 等待按键并关闭窗口 ---
    cv::waitKey(0); // 等待用户按下任意键
    cv::destroyAllWindows(); //销毁所有创建的窗口

    return 0;
}

编译和运行:

确保你已经正确安装了 OpenCV。你可以使用 CMake 或者直接用 g++ 编译 (链接 OpenCV 库):

g++ your_code.cpp -o bilateral_filter_app $(pkg-config --cflags --libs opencv4)
./bilateral_filter_app

(将 your_code.cpp 替换为你的源文件名,opencv4 可能需要根据你的 OpenCV 版本调整为 opencv 或其他)

参数调节技巧 ⚙️

正确选择 dsigmaColor, 和 sigmaSpace 的值对于获得理想的滤波效果至关重要:

一般建议

优缺点总结

优点:

缺点:

结论

双边滤波是一种强大且实用的图像平滑技术,特别适用于那些既要降噪又希望保留清晰边缘的应用场景。通过理解其原理和 OpenCV 中 cv::bilateralFilter 函数的参数,并进行适当的参数调整,你可以有效地提升图像质量。希望本文能帮助你更好地理解和应用双边滤波!

到此这篇关于c/c++中opencv双边滤波的实现的文章就介绍到这了,更多相关opencv 双边滤波内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文