首页 > 其他分享 >OpenCV(cv::bilateralFilter())

OpenCV(cv::bilateralFilter())

时间:2024-09-17 19:23:36浏览次数:1  
标签:滤波器 滤波 像素 OpenCV bilateralFilter 图像 cv 双边

目录



cv::bilateralFilter() 是 OpenCV 中用于图像平滑处理。与传统的线性滤波器(如高斯滤波器)不同,它同时考虑空间邻近性和像素值相似性,从而保留边缘的细节。

1. 函数定义

void cv::bilateralFilter(
    InputArray src,
    OutputArray dst,
    int d,
    double sigmaColor,
    double sigmaSpace,
    int borderType = BORDER_DEFAULT
)

参数:

  1. src: 输入图像,可以是 8 位或浮点型单通道或多通道图像。
  2. dst: 输出图像,与输入图像具有相同的尺寸和类型。
  3. d: 每个像素邻域的直径。如果为负值,OpenCV 会根据 sigmaSpace 自动计算。
  4. sigmaColor: 用于计算颜色距离的标准差。较大的值会使得颜色相差较大的像素也能相互影响,导致更强的平滑效果。
  5. sigmaSpace: 用于计算空间距离的标准差。较大的值意味着更远的像素会相互影响,影响范围更大。
  6. borderType: 图像边界的处理方式,默认为 BORDER_DEFAULT。其他常用的选项包括 BORDER_CONSTANTBORDER_REFLECT 等。


2. 双边滤波的工作原理

双边滤波器是一种非线性滤波器,它基于两个不同的高斯函数:

  1. 空间高斯权重(Gaussian Spatial Weight): 取决于像素在空间上的距离,距离越近的像素权重越大。
  2. 颜色高斯权重(Gaussian Color Weight): 取决于像素值(颜色)之间的差异,颜色差异越小的像素权重越大。

最终,每个像素的输出值是其邻域内所有像素值的加权平均,权重是上述两个高斯权重的乘积。这种方法可以有效地在保持边缘清晰的同时去除噪声。

数学表达式:

\[I_{out}(x) = \frac{1}{W_p} \sum_{y \in S} I(y) \cdot \exp\left(-\frac{\|x - y\|^2}{2\sigma_{space}^2}\right) \cdot \exp\left(-\frac{\|I(x) - I(y)\|^2}{2\sigma_{color}^2}\right) \]

其中:

  • \(W_p\) 是归一化系数,用于确保权重总和为 1。
  • \(S\) 是邻域内的像素集合。
  • \(\exp\left(-\frac{\|x - y\|^2}{2\sigma_{space}^2}\right)\) 是基于空间距离的高斯权重。
  • \(\exp\left(-\frac{\|I(x) - I(y)\|^2}{2\sigma_{color}^2}\right)\) 是基于颜色差异的高斯权重。


3. 应用场景

  1. 图像去噪:在去除图像噪声的同时,保留边缘细节。
  2. 边缘保持平滑:适用于需要平滑图像但不希望模糊边缘的应用,如医学图像处理。
  3. 图像增强:在某些图像增强技术中,用于平滑处理以突出重要特征。


4. 示例

以下是一个使用 cv::bilateralFilter 的示例:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取输入图像
    cv::Mat src = cv::imread("input.jpg");
    if (src.empty())
    {
        std::cerr << "无法读取图像!" << std::endl;
        return -1;
    }

    cv::Mat dst;

    // 应用双边滤波
    // d = 9,sigmaColor = 75,sigmaSpace = 75
    cv::bilateralFilter(src, dst, 9, 75, 75);

    // 显示结果
    cv::imshow("原始图像", src);
    cv::imshow("双边滤波结果", dst);
    cv::waitKey(0);

    return 0;
}

参数选择的影响:

  • d(邻域直径):

    • 较小的值:仅考虑局部邻域,计算量较小,但平滑效果有限。
    • 较大的值:考虑更大范围的像素,平滑效果更显著,但计算量增加。
  • sigmaColor

    • 较小的值:仅考虑颜色非常接近的像素,有助于保留更多的边缘细节。
    • 较大的值:允许颜色差异较大的像素相互影响,可能导致边缘模糊。
  • sigmaSpace

    • 较小的值:仅考虑空间上接近的像素。
    • 较大的值:允许空间上较远的像素参与计算,适用于更大范围的平滑。


5. 与其他滤波器的比较

  • 高斯滤波器(Gaussian Filter):

    • 线性滤波器,权重仅依赖于空间距离。
    • 无法有效保留边缘,可能导致边缘模糊。
  • 中值滤波器(Median Filter):

    • 非线性滤波器,常用于去除椒盐噪声。
    • 能够保留边缘,但在处理连续噪声时效果不如双边滤波。
  • 双边滤波器(Bilateral Filter):

    • 非线性滤波器,权重同时依赖于空间距离和颜色差异。
    • 能够在去噪的同时更好地保留边缘细节,但计算复杂度较高。


6. 性能优化

双边滤波器计算量较大,特别是在高分辨率图像上。以下是一些常见的优化方法:

  1. 使用快速双边滤波算法:如快速双边滤波(Fast Bilateral Filter)或双边中值滤波(Bilateral Median Filter)。
  2. 降采样处理:在较低分辨率下应用滤波,然后再上采样回原始分辨率。
  3. 并行计算:利用 GPU 或多线程加速计算。


7. 注意事项

  • 双边滤波速度较慢,因为它需要计算每个像素与其邻域所有像素的颜色和空间差异。
  • 通常,使用较大的 sigmaSpace 和较小的 sigmaColor 值可以有效去除噪声并保留边缘。
  • 对于多通道图像(如彩色图像),双边滤波器会分别处理每个通道,可能导致颜色偏移。为避免这种情况,可以先将图像转换到其他颜色空间(如 Lab),然后进行滤波。

结论

cv::bilateralFilter() 是一个强大的图像平滑工具,能够在去除噪声的同时保持图像的边缘信息。尽管其计算复杂度较高,但通过合理的参数选择和优化技术,可以在实际应用中获得良好的效果。适用于需要边缘保留的图像处理任务,如图像去噪、图像增强和特征提取等。



标签:滤波器,滤波,像素,OpenCV,bilateralFilter,图像,cv,双边
From: https://www.cnblogs.com/keye/p/18417408

相关文章

  • opencv-python学习笔记10-图像形态学处理
    目录一、基本概念: (1)结构元素(StructuringElement):(2)膨胀(Dilation):(3)腐蚀(Erosion):(4)开运算(Opening)(5)闭运算(Closing)(6)形态学梯度(MorphologicalGradient)(7)顶帽(Top-hat)和黑帽(Black-hat)转换(8)应用领域 二、膨胀:(1)基本概念:(2)原理:(3)方法:(4)OpenCV中的膨胀函数:(5)代码示例:(6)应用领域:(7......
  • YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
    摘要轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级ViTs和轻量级CNNs之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在本研究中......
  • 从kaggle竞赛零基础上手CV实战(Deepfake检测)
    关注B站可以观看更多实战教学视频:hallo128的个人空间从kaggle竞赛零基础上手CV实战从kaggle竞赛零基础上手CV实战(Deepfake检测)目录从kaggle竞赛零基础上手CV实战(Deepfake检测)背景介绍学习地址课程大纲课程特色适用人群背景介绍随着人工智能技术的迅猛发展,深......
  • OpenCV(cv::merge())
    目录1.函数定义2.工作原理3.示例4.注意事项总结cv::merge()是OpenCV中用于将单通道图像合并为多通道图像。这个函数对于处理图像的不同颜色通道或者其他分割的图像数据特别有用。1.函数定义voidcv::merge(conststd::vector<Mat>&mv,OutputArraydst);参数:......
  • CVE-2021-24762 复现
    一看是个wordpress,看了下版本6.0没洞,直接扔wpscan扫一下发现了个插件一搜发现perfect-survey在1.5.2之前都有洞,直接搜exp打.上官网找了个API重扫一遍,直接给出了CVE号!直接找个sqlmap的exp跑一下,注意第二个位置选n来设置cookiesqlmap-u"http://eci-2zeg18fce0yxpb7p......
  • 一个简单的交叉编译riscv的makefile脚本
    为了编写一个使用特定交叉编译工具链(在这个例子中是`riscv64-unknown-linux-gnu-`)来编译`hello.c`的Makefile脚本,你需要设置`CROSS_COMPILE`变量,并在编译命令中使用这个变量来指定交叉编译器的路径。下面是一个简单的Makefile示例:```makefile#定义交叉编译工具链的前缀CROSS_COM......
  • 9月京东云云服务器CVM价格配置表汇总-金秋上云!
    轻量云主机是面向中小企业、开发者打造的预装精选软件、开箱即用的主机产品,快速搭建网站、电商、企业低代码工具箱,云盘、共享文档、知识库、开发测试环境等,相对普通云主机,按套餐购买更优惠、控制台可视化管理,运维更简单,提供更便捷上云体验。轻量云主机这个专区是本次活动的主......
  • Ubuntu 18.04搭建RISCV和QEMU环境
    Ubuntu18.04搭建RISCV和QEMU环境  原文:https://blog.csdn.net/Eng_ingLi/article/details/135285200 前言因为公司项目代码需要在RISCV环境下测试,因为没有硬件实体,所以在Ubuntu18.04上搭建了riscv-gnu-toolchain+QEMU模拟器环境。安装riscv-gnu-toolchainriscv......
  • opencv学习:calcHist 函数绘制图像直方图及代码实现
    cv2.calcHist函数是OpenCV库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。函数语法hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate=False)......
  • opencv学习:图像下采样和上采样及拉普拉斯金字塔
    图像下采样和上采样OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理功能,包括图像的上采样和下采样。下采样(Downsampling)下采样是减少图像分辨率的过程,通常用于图像压缩、图像分析等场景。在OpenCV中,下采样可以通过......