Opencv2.4.9源码分析——adaptiveBilateralFilter

本文分析了OpenCV2.4.9中adaptiveBilateralFilter的实现原理,探讨了双边滤波的基础概念,包括高斯距离权重和高斯相似度权重的影响。自适应双边滤波旨在动态调整相似度权重的方差,代码中展示了函数参数的作用,如内核大小、距离方差和最大相似度方差。然而,该滤波器存在性能问题,当内核尺寸增大时可能导致程序异常终止。
摘要由CSDN通过智能技术生成

上一篇文章我们介绍了双边滤波,它的公式为:

(1)

其中,f(ξ)表示原图。

c(ξ,x)表示的是高斯距离的权值,σd值大则滤波结果会受到更远的像素影响;s(ξ,x)表示的是高斯相似度的权值,σr值大则意味着更无关的像素强度值(或颜色值)会影响滤波器结果。因此这两个值的选取会直接影响到滤波效果。

关于高斯距离的权值,还会受到滤波内核大小的影响,因此它的方差σd值对滤波结果的影响会受到一定的约束,但σr值的选取就难以把握,因此本算法的目的就是自适应的选取σr值的大小。

在opencv文档中没有说明该算法的出处,但从它的程序源码中可以分析得到,σ r值是通过领域内的像素值得到,具体公式为:

         (2)

其中,n表示邻域内的像素个数,该邻域指的是滤波内核,I(i)表示的是像素值。

 

下面我们来分析一下具体的代码,该函数的原型为:

void adaptiveBilateralFilter(InputArraysrc, OutputArray dst, Size ksize, double sigmaSpace, double maxSigmaColor=20.0,Point anchor=Point(-1, -1), int borderType=BORDER_DEFAULT )

_src为输入原图像;_dst为滤波后的图像;ksize为滤波内核的大小;sigmaSpace为距离权值公式中的方差,即公式1中的σd;maxSigmaColor为相似度权值公式中的方差(σr)的最大值,自适应双边滤波的相似度方差是通过公式2计算得到,但如果计算的结果太大,超过了该值,则以该值为准;anchor为内核锚点;borderType表示用什么方式来处理加宽后的图像四周边界。

 

该函数的源码是在/sources/modules/imgproc/scr/smooth.cpp内:

void cv::adaptiveBilateralFilter( InputArray _src, OutputArray _dst, Size ksize,
                                  double sigmaSpace, double maxSigmaColor, Point anchor, int borderType )
{
    //得到输入图像矩阵和与其尺寸类型一致的输出图像矩阵
    Mat src = _src.getMat();
    _dst.create(src.size(), src.type());
    Mat dst = _dst.getMat();
    //该算法只能处理8位二进制的灰度图像和三通道的彩色图像
    CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8UC3);
    //得到滤波内核的锚点
    anchor = normalizeAnchor(anchor,ksize);
    if( src.depth() == CV_8U )
        adaptiveBilateralFilter_8u( src, dst, ksize, sigmaSpace, maxSigmaColor, anchor, borderType );
    else
        CV_Error( CV_StsUnsupportedFormat,
        "Adaptive Bilateral filtering is only implemented for 8u images" );
}

static void adaptiveBilateralFilter_8u( const Mat& src, Mat& dst, Size ksize, double sigmaSpace, double maxSigmaColor, Point anchor, int borderType )
{
    Size size = src.size();
    处理之前再次检查图像中的相关信息是否正确
    CV_Assert( (src.type() == CV_8UC1 || src.type() == CV_8UC3) &&
              src.type() == dst
opencv是一个开源的计算机视觉库,opencv2.4.9是其中的一个版本。在opencv2.4.9中,有一个模块叫做stitching,用于图像拼接。 图像拼接是将多张图像按照一定的顺序和方式进行合并,形成一张更大视野覆盖范围的图像。拼接的过程需要解决图像间的重叠区域匹配、图像变换与叠加等问题。 在opencv2.4.9的stitching模块中,主要有以下几个重要的类: 1. Stitcher类:拼接器类,用于执行拼接的主要操作。它提供了一系列的方法,如设置拼接的模式、添加要拼接的图像等。 2. FeaturesFinder类:特征点检测类,用于在图像中寻找特征点。该类利用SIFT、SURF等算法来检测图像中的关键点,以便进行匹配。 3. FeaturesMatcher类:特征点匹配类,用于对图像中的特征点进行匹配。该类使用KNN算法进行特征点的匹配,并利用RANSAC算法进一步筛选特征点,剔除误匹配。 4. Estimator类:变换估计类,用于估计图像间的变换参数。该类可以通过特征点的对应关系,计算图像间的旋转矩阵、平移矩阵等变换参数。 5. Blender类:图像融合类,用于将拼接后的图像进行融合。该类可以进行多种融合方式,如线性融合、多频融合等。 通过以上的类和方法,opencv2.4.9的stitching模块能够完成图像拼接的过程。整个过程包括特征点检测、特征点匹配、变换参数估计和图像融合等步骤。 需要指出的是,本文只是对opencv2.4.9的stitching模块进行了初步的介绍,具体的源码分析需要深入研究。整个源码工程庞大,包含很多细节和算法,需要对计算机视觉和图像处理有较深入的理解才能进行分析和改进。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值