精华内容
下载资源
问答
  • 引导滤波

    千次阅读 2018-01-23 17:27:15
    引导滤波:即需要引导图的滤波器,引导图可以是单独的图像或者是输入图像,当引导图为输入图像时,引导滤波就成为一个保持边缘的滤波操作,可以用于图像重建的滤波。 引导滤波的流程见下图: 假设输入...

    http://blog.csdn.net/LG1259156776/article/details/51815825

    1,定义

    引导滤波:即需要引导图的滤波器,引导图可以是单独的图像或者是输入图像,当引导图为输入图像时,引导滤波就成为一个保持边缘的滤波操作,可以用于图像重建的滤波。

    引导滤波的流程见下图:

    假设输入图像为p,输出图像为q,引导图为IqI在以像素k为中心的窗口中存在局部线性关系:

    窗口半径为rab为线性系数,且在局部窗口k中为常数。这个模型保证了只有在I存在边缘的情况下,q才会存在边缘。这是因为:。这与在去雾、超分辨率、抠图等研究中使用的模型是一致的。

    qp去除噪声或者纹理之后的图像:

    为确定以上公式中的线性系数,并满足使得qp的差别最小,转化为最优化问题:

    以上公式的求解可以利用线性回归:

    在这里, μkσk^2表示I在局部窗口wk中的均值和方差。 |ω|是窗口内的像素数,pk表示p在窗口wk中的均值。当求的akbk后:

    其中,

    算法流程:f为一个窗口半径为r的均值滤波器,corr为相关,var为方差,cov为协方差。

    2,边缘保持

    I=P时,引导滤波就变成了边缘保持的滤波操作,此时:

    考虑两种情况:

     

    即在高方差区域,保持值不变,在平滑区域,使用临近像素平均。

    3,彩色滤波

    直观的方法就是直接将引导滤波应用到三个颜色通道中(RGB):

     

     取值:i=123

    4,简单示例

    下载作者代码后,有两个主要函数:guidedfilter.m(灰度图像)和guidedfilter_color.m(彩色图像),随便取一副图像进行边缘保持滤波:

    I = double(imread('.\img_smoothing\cat.bmp')) / 255;

    p = I;

    r = 4; % try r=2, 4, or 8

    eps = 0.2^2; % try eps=0.1^2, 0.2^2, 0.4^2

     

    q = guidedfilter(I, p, r, eps);

     

    figure();

    imshow([I, q], [0, 1]);

    结果图:

    5,一些资源

    项目主页:http://research.microsoft.com/en-us/um/people/kahe/eccv10/index.html

     

    http://blog.csdn.net/kaikaicheng/article/details/8108474

    同时作者提供了代码和ppt可供参考,也可从博主资源中下载。

    http://download.csdn.net/detail/u010736419/6840011

    http://download.csdn.net/detail/u010736419/6840015

    http://download.csdn.net/detail/u010736419/6840025

     

    相关论文:


    展开全文
  • 快速引导滤波

    2019-03-09 16:28:41
    何凯明的快速引导滤波,MATLAB代码,思路不错,值得研究一下
  • 图像引导滤波

    2018-05-21 20:48:35
    本资源为何凯明博士2010年在ECCV 发表的引导滤波的论文,附有MATLAB源码以及所用到的图片。
  • 双边滤波与引导滤波

    2019-02-02 09:31:18
    双边滤波与引导滤波
                   

    双边滤波与引导滤波

    分类: AI and Computer Vision344人阅读评论(0)收藏举报

    双边滤波

    双边滤波很有名,使用广泛,简单的说就是一种同时考虑了像素空间差异与强度差异的滤波器,因此具有保持图像边缘的特性。

    先看看我们熟悉的高斯滤波器


    其中W是权重,i和j是像素索引,K是归一化常量。公式中可以看出,权重只和像素之间的空间距离有关系,无论图像的内容是什么,都有相同的滤波效果。

    再来看看双边滤波器,它只是在原有高斯函数的基础上加了一项,如下


    其中 I 是像素的强度值,所以在强度差距大的地方(边缘),权重会减小,滤波效应也就变小。总体而言,在像素强度变换不大的区域,双边滤波有类似于高斯滤波的效果,而在图像边缘等强度梯度较大的地方,可以保持梯度。


    引导滤波

    引导滤波是近三年才出现的滤波技术,知道的人还不多。它与双边滤波最大的相似之处,就是同样具有保持边缘特性。在引导滤波的定义中,用到了局部线性模型,至于该模型,可以暂时用下图简单的理解


    该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数来表示,当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用。

    同理,我们可以认为图像是一个二维函数,而且没法写出解析表达式,因此我们假设该函数的输出与输入在一个二维窗口内满足线性关系,如下


    其中,q是输出像素的值,I是输入图像的值,i和k是像素索引,a和b是当窗口中心位于k时该线性函数的系数。其实,输入图像不一定是待滤波的图像本身,也可以是其他图像即引导图像,这也是为何称为引导滤波的原因。对上式两边取梯度,可以得到


    即当输入图像I有梯度时,输出q也有类似的梯度,现在可以解释为什么引导滤波有边缘保持特性了。

    下一步是求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值与真实值p之间的差距最小,也就是让下式最小


    这里p只能是待滤波图像,并不像I那样可以是其他图像。同时,a之前的系数(以后都写为e)用于防止求得的a过大,也是调节滤波器滤波效果的重要参数。通过最小二乘法,我们可以得到


    其中,是I在窗口w_k中的平均值,是I在窗口w_k中的方差,是窗口w_k中像素的数量,是待滤波图像p在窗口w_k中的均值。

    在计算每个窗口的线性系数时,我们可以发现一个像素会被多个窗口包含,也就是说,每个像素都由多个线性函数所描述。因此,如之前所说,要具体求某一点的输出值时,只需将所有包含该点的线性函数值平均即可,如下


    这里,w_k是所有包含像素i的窗口,k是其中心位置。

    当把引导滤波用作边缘保持滤波器时,往往有 I = p ,如果e=0,显然a=1, b=0是E(a,b)为最小值的解,从上式可以看出,这时的滤波器没有任何作用,将输入原封不动的输出。如果e>0,在像素强度变化小的区域(或单色区域),有a近似于(或等于)0,而b近似于(或等于),即做了一个加权均值滤波;而在变化大的区域,a近似于1,b近似于0,对图像的滤波效果很弱,有助于保持边缘。而e的作用就是界定什么是变化大,什么是变化小。在窗口大小不变的情况下,随着e的增大,滤波效果越明显。

    在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。引导滤波最大的优势在于,可以写出时间复杂度与窗口大小无关的算法(打算在之后的文章中讨论),因此在使用大窗口处理图片时,其效率更高。

    关于引导滤波更多的讨论和应用,可以参看下面的论文

    GuidedFilter_ECCV10.pdf

    引导滤波的OpenCV实现

    分类: AI and Computer Vision414人阅读评论(3)收藏举报

    上一篇文章已经说了引导滤波的基本理论,而且我们也知道引导滤波可以写出时间复杂度与窗口大小无关的算法,现在就来使用C++并借助OpenCV实现这一算法。

    实现这种算法的关键思想是盒式滤波(box filter),而且必须是通过积分图来实现的盒式滤波,否则不可能与窗口大小无关,好在OpenCV的boxFilter函数满足这个要求。

    再看看引导滤波的公式


    先计算a_k的分子,Ip 在窗口w_k中的和,再除以窗口中像素的个数,刚好就是盒式滤波,因此我们可以将输入的引导图像 I 和滤波图像 p 相乘,并对相乘后的图像做box filtering,即得第一项的结果。后面的分别为 I 和 p 在窗口w_k中均值,因此分别对 I 和 p 进行box filtering,再将box filtering之后的结果相乘即可。实际上,a_k的分子就是 Ip 在窗口w_k中的协方差。

    接下来计算a_k的分母部分。是引导图 I 在窗口w_k中的方差,学过概率论与数理统计的朋友应该知道,方差和期望(均值)之间是有关系的,如下式


    因此在计算 I 的方差时,我们可以先计算 I*I 的均值,再减去 I 均值的平方即的平方。在方法上,计算 I*I 的均值和计算 Ip 的均值是一样的。最后,对计算出来的方差图像,加上常量e(每个元素都加e),分母就计算完了,自然,a_k在所有窗口中的值也就得到了。b_k的计算太简单了,大家都懂的。

    注意,我们的计算都是对整个图像的,以图像为单位进行计算,所以最后算出的也是两张图,a_k的图(左边)和b_k的图(右边),如下


    在图中可以看到,在边缘部分或变化剧烈的部分,a的值接近于1(白色),b的值接近为0(黑色),而在变化平坦的区域,a的值接近0(黑色),b的值为平坦区域像素的均值。这与上一篇文章中所说的规律是一致的。

    下面看第二个公式


    输出值q又与两个均值有关,分别为a和b在窗口w_i中的均值(不是w_k),所以还是box filtering,我们将上一步得到两个图像都进行盒式滤波,得到两个新图:a_i和b_i,然后用a_i乘以引导图像 I ,再加上b_i,即得最终滤波之后的输出,如下(左边为原图,右边为滤波之后的图像,其中滤波窗口半径为8,e的值为500):



    下面是整个算法的代码,仅供参考

    1. void guidedFilter(Mat& source, Mat& guided_image, Mat& output,int radius, float epsilon)
    2. {
    3. CV_Assert(radius >= 2 && epsilon > 0);
    4. CV_Assert(source.data != NULL && source.channels() == 1);
    5. CV_Assert(guided_image.channels() == 1);
    6. CV_Assert(source.rows == guided_image.rows && source.cols == guided_image.cols);
    7. Mat guided;
    8. if (guided_image.data == source.data)
    9. {
    10. //make a copy
    11. guided_image.copyTo(guided);
    12. }
    13. else
    14. {
    15. guided = guided_image;
    16. }
    17. //将输入扩展为32位浮点型,以便以后做乘法
    18. Mat source_32f, guided_32f;
    19. makeDepth32f(source, source_32f);
    20. makeDepth32f(guided, guided_32f);
    21. //计算I*p和I*I
    22. Mat mat_Ip, mat_I2;
    23. multiply(guided_32f, source_32f, mat_Ip);
    24. multiply(guided_32f, guided_32f, mat_I2);
    25. //计算各种均值
    26. Mat mean_p, mean_I, mean_Ip, mean_I2;
    27. Size win_size(2*radius + 1, 2*radius + 1);
    28. boxFilter(source_32f, mean_p, CV_32F, win_size);
    29. boxFilter(guided_32f, mean_I, CV_32F, win_size);
    30. boxFilter(mat_Ip, mean_Ip, CV_32F, win_size);
    31. boxFilter(mat_I2, mean_I2, CV_32F, win_size);
    32. //计算Ip的协方差和I的方差
    33. Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
    34. Mat var_I = mean_I2 - mean_I.mul(mean_I);
    35. var_I += epsilon;
    36. //求a和b
    37. Mat a, b;
    38. divide(cov_Ip, var_I, a);
    39. b = mean_p - a.mul(mean_I);
    40. //对包含像素i的所有a、b做平均
    41. Mat mean_a, mean_b;
    42. boxFilter(a, mean_a, CV_32F, win_size);
    43. boxFilter(b, mean_b, CV_32F, win_size);
    44. //计算输出 (depth == CV_32F)
    45. output = mean_a.mul(guided_32f) + mean_b;
    46. }
    void guidedFilter(Mat& source, Mat& guided_image, Mat& output, int radius, float epsilon){ CV_Assert(radius >= 2 && epsilon > 0); CV_Assert(source.data != NULL && source.channels() == 1); CV_Assert(guided_image.channels() == 1); CV_Assert(source.rows == guided_image.rows && source.cols == guided_image.cols); Mat guided; if (guided_image.data == source.data) {  //make a copy  guided_image.copyTo(guided); } else {  guided = guided_image; } //将输入扩展为32位浮点型,以便以后做乘法 Mat source_32f, guided_32f; makeDepth32f(source, source_32f); makeDepth32f(guided, guided_32f); //计算I*p和I*I Mat mat_Ip, mat_I2; multiply(guided_32f, source_32f, mat_Ip); multiply(guided_32f, guided_32f, mat_I2); //计算各种均值 Mat mean_p, mean_I, mean_Ip, mean_I2; Size win_size(2*radius + 1, 2*radius + 1); boxFilter(source_32f, mean_p, CV_32F, win_size); boxFilter(guided_32f, mean_I, CV_32F, win_size); boxFilter(mat_Ip, mean_Ip, CV_32F, win_size); boxFilter(mat_I2, mean_I2, CV_32F, win_size); //计算Ip的协方差和I的方差 Mat cov_Ip = mean_Ip - mean_I.mul(mean_p); Mat var_I = mean_I2 - mean_I.mul(mean_I); var_I += epsilon; //求a和b Mat a, b; divide(cov_Ip, var_I, a); b = mean_p - a.mul(mean_I); //对包含像素i的所有a、b做平均 Mat mean_a, mean_b; boxFilter(a, mean_a, CV_32F, win_size); boxFilter(b, mean_b, CV_32F, win_size); //计算输出 (depth == CV_32F) output = mean_a.mul(guided_32f) + mean_b;}
    1. void makeDepth32f(Mat& source, Mat& output)
    2. {
    3. if (source.depth() != CV_32F ) > FLT_EPSILON)
    4. source.convertTo(output, CV_32F);
    5. else
    6. output = source;
    7. }
    void makeDepth32f(Mat& source, Mat& output)if (source.depth() != CV_32F ) > FLT_EPSILON)  source.convertTo(output, CV_32F); else  output = source;}


    (本文图片均来自网络)

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 何凯明引导滤波

    2015-01-04 16:23:07
    何凯明博士的引导滤波,经典的图像去雾算法MATLAB实现
  • 在新设计的二次引导滤波模型中,将第一次引导滤波的输出图像作为第二次引导滤波的引导图像,克服了传统引导滤波的缺陷,抑制了噪声。在代价聚合阶段引入二次引导滤波,使用跨尺度框架聚合各尺度的匹配代价,进一步...
  • 局部立体匹配算法中经典的引导滤波算法
  • 图像引导滤波 HE

    2017-11-09 14:40:43
    图像引导滤波,通过频域上的处理,从而增强图片,利于处理。用于mura缺陷检测有效。
  • 图像分层处理常用滤波器,含有测试图片及测试程序,对于引导滤波不同作用进行了测试与试验,分别包括引导滤波的图像平滑、增强以及特征提取
  • 针对红外和可见光图像融合结果背景信息不足、对比度较低的问题,提出一种结合引导滤波和快速共现滤波的融合方法。首先,以高斯滤波将源图像分解为细节层和基础层。然后以去除值域滤波器、全局统计共现信息的方式简化...
  • 因此,提出了一种改善思路,即将引导滤波结合双边滤波的方法应用于二维切片的预处理中,在误差范围内改变二维切片的像素信息分布,以获得高质量的三维重建结果。首先,利用引导滤波增强边缘信息,恢复目标内部的结构信息;...
  • 这是基于引导滤波的图像融合matlab源码。下载解压后直接运行。
  • vs2013+opencv2.4.9实现对输入图像进行伪彩色增强和引导滤波图像增强,效果还可以 输入图像+灰度转换+伪彩色增强+引导滤波增强
  • OPENCV 实现引导滤波

    2021-03-02 17:30:48
    上面链接中的大佬实现了引导滤波,但是该代码如果用灰度图会报错,下面代码是大佬写的,可以实现rgb图的引导滤波。 /* 功能:图像引导滤波操作 */ #include <opencv2/core/core.hpp> #include <opencv2/...

    https://blog.csdn.net/sinat_36264666/article/details/77990790
    上面链接中的大佬实现了引导滤波,但是该代码如果用灰度图会报错,下面代码是大佬写的,可以实现rgb图的引导滤波。

    /*
    	功能:图像引导滤波操作
    */
    #include <opencv2/core/core.hpp>                  
    #include <opencv2/highgui/highgui.hpp>      
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <iostream>     
    using namespace std;
    using namespace cv;
     
    //-------------------【全局函数声明部分】--------------------------------------
    Mat guidedFilter(Mat &srcMat, Mat &guidedMat, int radius, double eps);//引导滤波器
     
    int main()
    {
    	//------------【0】定义相关变量-------------
    	Mat resultMat;	//最后结果图像
    	vector<Mat> vSrcImage, vResultImage;
    	//------------【1】读取源图像并检查图像是否读取成功------------     
    	Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\boat1.jpg");
    	if (!srcImage.data)
    	{
    		cout << "读取图片错误,请重新输入正确路径!\n";
    		system("pause");
    		return -1;
    	}
    	imshow("【源图像】", srcImage);
    	//-------【2】对源图像进行通道分离,并对每个分通道进行导向滤波操------
    	split(srcImage, vSrcImage);
    	for (int i = 0; i < 3; i++)
    	{
    		Mat tempImage;
    		vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0);//将分通道转换成浮点型数据
    		Mat cloneImage = tempImage.clone();	//将tempImage复制一份到cloneImage
    		Mat resultImage = guidedFilter(tempImage, cloneImage, 5, 0.01);//对分通道分别进行导向滤波,半径为1、3、5...等奇数
    		vResultImage.push_back(resultImage);//将分通道导向滤波后的结果存放到vResultImage中
    	}
    	//----------【3】将分通道导向滤波后结果合并-----------------------
    	merge(vResultImage, resultMat);
    	resultMat.convertTo(resultMat, CV_8UC3, 255);//将归一化的数字,回到0-255区间
    	imshow("【引导滤波/导向滤波】", resultMat);
    	waitKey(0);
    	return 0;
    }
     
    //导向滤波器
    Mat guidedFilter(Mat &srcMat, Mat &guidedMat, int radius, double eps)
    {
    	//------------【0】转换源图像信息,将输入扩展为64位浮点型,以便以后做乘法------------
    	srcMat.convertTo(srcMat, CV_64FC1);
    	guidedMat.convertTo(guidedMat, CV_64FC1);
    	//--------------【1】各种均值计算----------------------------------
    	Mat mean_p, mean_I, mean_Ip, mean_II;
    	boxFilter(srcMat, mean_p, CV_64FC1, Size(radius, radius));//生成待滤波图像均值mean_p	
    	boxFilter(guidedMat, mean_I, CV_64FC1, Size(radius, radius));//生成引导图像均值mean_I	
    	boxFilter(srcMat.mul(guidedMat), mean_Ip, CV_64FC1, Size(radius, radius));//生成互相关均值mean_Ip
    	boxFilter(guidedMat.mul(guidedMat), mean_II, CV_64FC1, Size(radius, radius));//生成引导图像自相关均值mean_II
    	//--------------【2】计算相关系数,计算Ip的协方差cov和I的方差var------------------
    	Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
    	Mat var_I = mean_II - mean_I.mul(mean_I);
    	//---------------【3】计算参数系数a、b-------------------
    	Mat a = cov_Ip / (var_I + eps);
    	Mat b = mean_p - a.mul(mean_I);
    	//--------------【4】计算系数a、b的均值-----------------
    	Mat mean_a, mean_b;
    	boxFilter(a, mean_a, CV_64FC1, Size(radius, radius));
    	boxFilter(b, mean_b, CV_64FC1, Size(radius, radius));
    	//---------------【5】生成输出矩阵------------------
    	Mat dstImage = mean_a.mul(srcMat) + mean_b;
    	return dstImage;
    }
    

    这个代码应用于灰度图会报错,所以如果是灰度图的话把下面这段替换即可

    split(srcImage, vSrcImage);
    	for (int i = 0; i < 3; i++)
    	{
    		Mat tempImage;
    		vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0);//将分通道转换成浮点型数据
    		Mat cloneImage = tempImage.clone();	//将tempImage复制一份到cloneImage
    		Mat resultImage = guidedFilter(tempImage, cloneImage, 5, 0.01);//对分通道分别进行导向滤波,半径为1、3、5...等奇数
    		vResultImage.push_back(resultImage);//将分通道导向滤波后的结果存放到vResultImage中
    	}
    	//----------【3】将分通道导向滤波后结果合并-----------------------
    	merge(vResultImage, resultMat);
    	resultMat.convertTo(resultMat, CV_8UC3, 255);//将归一化的数字,回到0-255区间
    	imshow("【引导滤波/导向滤波】", resultMat);
    

    替换成

    
    ```cpp
    Mat tempImage;
    	src.convertTo(tempImage, CV_64FC1, 1.0 / 255.0);//将分通道转换成浮点型数据
    	Mat cloneImage = tempImage.clone();
    	resultMat = guidedFilter(tempImage, cloneImage, 25, 0.01);//对分通道分别进行导向滤波,半径为1、3、5...等奇数
    	resultMat.convertTo(resultMat, CV_8UC1, 255);//将归一化的数字,回到0-255区间
    	cv::namedWindow("【引导滤波/导向滤波】", cv::WINDOW_NORMAL);
    	imshow("【引导滤波/导向滤波】", resultMat);
    
    
     
    
    展开全文
  • 基于引导滤波的单幅图像去雾研究
  • MATLAB版的引导滤波
  • guided-filter引导滤波进行图像处理,通过引导滤波,利用已存在的图像进行图像复原
  • 何凯明的引导滤波去雾算法,内有图像,main文件直接运行
  • 为了解决传统跟踪算法不能有效区分背景边缘和红外弱小目标的问题, 基于图像引导滤波和核相关滤波, 提出了一种改进型的红外弱小目标跟踪算法。将采用6组红外弱小目标图像序列得到的实验结果与采用经典跟踪算法得到的...
  • 引导滤波(导向滤波)的目的是,保持双边滤波的优势(有效保持边缘,非迭代计算),而克服双边滤波的缺点(设计一种时间复杂度为 O(1) 的快速滤波器,而且在主要边缘附近没有梯度的变形)。 本次实验采取的方法是...

     导向滤波(Guided Filtering)和双边滤波(BF)、最小二乘滤波(WLS)是三大边缘保持(Edge-perserving)滤波器。
     引导滤波(导向滤波)的目的是,保持双边滤波的优势(有效保持边缘,非迭代计算),而克服双边滤波的缺点(设计一种时间复杂度为 O(1) 的快速滤波器,而且在主要边缘附近没有梯度的变形)。
    本次实验采取的方法是:引导滤波器的保留边缘平滑滤波器应用。

    引导滤波简介
     引导滤波器的作用是:输入原始图像P和引导图像 I,输出图像 Q,使得 Q 与 P大体上相似,但边缘和纹理部分与I相似。其典型应用有两个:保边图像平滑,抠图。
     中心思想是局部线性,即图像看作是非解析的二维函数,但其中相邻近的(某个窗口内)的像素点可认为是解析的线性函数。因此,可通过线性参数将图像I线性变化为I2。
     其变换公式为:
    在这里插入图片描述
     其中,i表示的是像素点,ωk为第k个窗口,ak和bk表示在第k个窗口中计算出的系数。
     对于3*3的窗口而言,第i个像素会通过9个窗口,最终的qi取平均值。

    在这里插入图片描述
     由上述的线性关系可得:
    在这里插入图片描述
     即在某个像素点上,输出图像Q和引导图I有着一样的梯度,因此可以保留I中的细节和纹理(梯度,边缘)部分。只要求解系数a,b即可得到Q
     下一步是求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值 q与真实值 p 之间的差距最小,转化为最优化问题,也就是让下式最小:
    在这里插入图片描述
     通过最小二乘法,计算可得:
    在这里插入图片描述
    其中,μk和σk^2分别表示引导图像I在窗口ωk中的平均值和方差,∣ω∣是窗口ωk中像素点的个数,pk= 1/|ω| ∑_(i∈ω_k)p_i 是输入图像在窗口ωk中的平均值。

    引导滤波的保边平滑滤波器作用
     当输入图像和引导图像为同一张图像时,即P = I时,可以理解为,Q保留P中的纹理(梯度,边缘)部分,而平滑掉其他部分(噪声)。

     当I = P时,
    在这里插入图片描述
     其中,σk^2表示P在窗口ωk中的方差。
        pk表示P在窗口ωk中的均值。
        ε为调整对边缘检测敏感度的参数。值越大越不敏感。
     存在两种情况:1、平滑区域时,σk^2 << ε,ak ≈ 0,bk ≈pk,相当于均值滤波器,平滑图像。
            2、高方差(边缘)区域时,σk^2 >> ε,ak ≈ 1,bk ≈ 0,相当于保留梯度。

    灰度图的保边平滑
     读取图像后,灰度图矩阵转化为double类型。计算完系数a,b后,组合的线性方程直接作用于灰度图矩阵。

    彩色图像的保边平滑
     读取图像后,图像矩阵转化为double类型。将rgb三通道提取出来,计算完系数a,b后,组合的线性方程分别计算三个通道的矩阵,最后再用cat函数截切在一起。

     代码已上传资源,以下展示结果。
    灰度图保边平滑效果
    彩色图保边平滑效果

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482
精华内容 192
关键字:

引导滤波