引导滤波 Guided Image Filtering

本文主要介绍导向滤波,引导滤波在滤波的同时,具有保边缘的特效,考虑了空间因素,可以用在图像去雾算法中对透射率t的优化中,能起到很好的效果

 

论文如下:

Guided Image Filtering
Kaiming He  , Jian Sun , and Xiaoou Tang ,
Department of Information Engineering, The Chinese University of Hong Kong
Microsoft Research Asia
Shenzhen Institutes of Advanced Technology, Chinese Academy of Sciences, China


原理如下:

 

代码如下:

#include "afxwin.h"
#include <cv.h>
#include "cxcore.h"  
#include <highgui.h>
#include<vector>
#include <iostream>  
#include "opencv2/core/core.hpp"    
#include "opencv2/highgui/highgui.hpp"    
#include "opencv2/imgproc/imgproc.hpp"   

void Ctry::OnTryTyr1()  //消息响应函数
{
	int r = 4;
	double eps = 0.01;

	Mat image_src = imread("C:\\Users\\Administrator\\Desktop\\38.jpg", CV_LOAD_IMAGE_COLOR);
	vector<Mat> bgr_src, bgr_dst;
	split(image_src, bgr_src);//分解每个通道  

	Mat dst_color;
	Mat temp;
	for (int i = 0; i<3; i++)
	{
		Mat I = getimage(bgr_src[i]);
		Mat p = I.clone();
		Mat q = guidedFilter2(I, p, r, eps);	
		bgr_dst.push_back(q);
	}
	merge(bgr_dst, dst_color);

	imwrite("C:\\Users\\Administrator\\Desktop\\result2.jpg", dst_color*255);


	double time2 = 0;
	time2 = (double)getTickCount();
	Mat image_gray(image_src.size(), CV_8UC1);
	cvtColor(image_src, image_gray, CV_BGR2GRAY);
	Mat I = getimage(image_gray);
	Mat p = I.clone();
	
	Mat  Output;
	guidedFilter2(I, p, r, eps).copyTo(Output);
	
	imshow("方法:", Output);
	Mat tt;
	Output.convertTo(tt, -1,255.0);
	imwrite("C:\\Users\\Administrator\\Desktop\\mert.JPG", tt);

	time2 = 1000 * ((double)getTickCount() - time2) / getTickFrequency();
	cout << endl << "Time of guided filter2 for  runs: " << time2 << " milliseconds." << endl;	
	waitKey(0);
}

//convert image depth to CV_64F  
Mat  Ctry::getimage(Mat &a)
{
	int hei = a.rows;
	int wid = a.cols;
	Mat I(hei, wid, CV_64FC1);
	//convert image depth to CV_64F  
	a.convertTo(I, CV_64FC1, 1.0 / 255.0);
	return I;
}

Mat  Ctry::guidedFilter2(cv::Mat I, cv::Mat p, int r, double eps)
{
	/*
	% GUIDEDFILTER   O(1) time implementation of guided filter.
	%
	%   - guidance image: I (should be a gray-scale/single channel image)
	%   - filtering input image: p (should be a gray-scale/single channel image)
	%   - local window radius: r
	%   - regularization parameter: eps
	*/

	cv::Mat _I;
	I.convertTo(_I, CV_64FC1);
	I = _I;

	cv::Mat _p;
	p.convertTo(_p, CV_64FC1);
	p = _p;

	//[hei, wid] = size(I);  
	int hei = I.rows;
	int wid = I.cols;

	//N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.  
	cv::Mat N;
	cv::boxFilter(cv::Mat::ones(hei, wid, I.type()), N, CV_64FC1, cv::Size(r, r));

	//mean_I = boxfilter(I, r) ./ N;  
	cv::Mat mean_I;
	cv::boxFilter(I, mean_I, CV_64FC1, cv::Size(r, r));

	//mean_p = boxfilter(p, r) ./ N;  
	cv::Mat mean_p;
	cv::boxFilter(p, mean_p, CV_64FC1, cv::Size(r, r));

	//mean_Ip = boxfilter(I.*p, r) ./ N;  
	cv::Mat mean_Ip;
	cv::boxFilter(I.mul(p), mean_Ip, CV_64FC1, cv::Size(r, r));

	//cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.  
	cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);

	//mean_II = boxfilter(I.*I, r) ./ N;  
	cv::Mat mean_II;
	cv::boxFilter(I.mul(I), mean_II, CV_64FC1, cv::Size(r, r));

	//var_I = mean_II - mean_I .* mean_I;  
	cv::Mat var_I = mean_II - mean_I.mul(mean_I);

	//a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;     
	cv::Mat a = cov_Ip / (var_I + eps);

	//b = mean_p - a .* mean_I; % Eqn. (6) in the paper;  
	cv::Mat b = mean_p - a.mul(mean_I);

	//mean_a = boxfilter(a, r) ./ N;  
	cv::Mat mean_a;
	cv::boxFilter(a, mean_a, CV_64FC1, cv::Size(r, r));
	mean_a = mean_a / N;

	//mean_b = boxfilter(b, r) ./ N;  
	cv::Mat mean_b;
	cv::boxFilter(b, mean_b, CV_64FC1, cv::Size(r, r));
	mean_b = mean_b / N;

	//q = mean_a .* I + mean_b; % Eqn. (8) in the paper;  
	cv::Mat q = mean_a.mul(I) + mean_b;

	return q;
}

效果图:


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引导滤波Guided Image Filtering)是一种能够保留图像细节的图像滤波方法,通过引导图像的辅助作用,对待处理图像进行滤波。其主要思想是根据引导图像的特征来调整滤波器的权重,从而使得滤波器更加适应于图像的结构和纹理特征,达到保留细节的效果。 具体实现方法如下: 1. 对待处理图像和引导图像进行预处理,计算它们的均值和方差。 2. 对引导图像进行高斯滤波,得到平滑后的引导图像。 3. 计算待处理图像和引导图像的协方差,并计算得到待处理图像的均值和方差。 4. 计算待处理图像和引导图像的相关系数,并根据相关系数和平滑后的引导图像计算得到滤波器的权重。 5. 根据滤波器的权重和待处理图像的均值、方差,对待处理图像进行滤波。 下面是引导滤波的Matlab代码实现: ```matlab function [q] = guidedfilter(I, p, r, eps) % guidedfilter: Guided image filtering % % Input: % - I: guidance image (should be a gray-scale/single channel image) % - p: filtering input image % - r: radius of filter % - eps: regularization parameter % % Output: % - q: filtering output image % % Reference: % Kaiming He, Jian Sun, and Xiaoou Tang, "Guided Image Filtering," % IEEE Transactions on Pattern Analysis and Machine Intelligence, % Vol. 35, No. 6, pp. 1397-1409, June 2013. % % Author: hqli % Email: hqli@pku.edu.cn % Date: 2016-11-05 % % Check inputs if (ndims(I)~=2) error('The guidance image should be a gray-scale/single channel image.'); end if (ndims(p)==2) % Single-channel image [hei, wid] = size(p); nCh = 1; else % Multi-channel image [hei, wid, nCh] = size(p); end if (size(I,1)~=hei || size(I,2)~=wid) error('The size of the guidance image should be the same as the input image.'); end % Compute mean and covariance matrices mean_I = imboxfilt(I, r) ./ (r^2); mean_p = zeros(hei, wid, nCh); for ii=1:nCh mean_p(:,:,ii) = imboxfilt(p(:,:,ii), r) ./ (r^2); end mean_Ip = zeros(hei, wid, nCh); for ii=1:nCh mean_Ip(:,:,ii) = imboxfilt(I.*p(:,:,ii), r) ./ (r^2); end cov_Ip = mean_Ip - mean_I.*mean_p; % Compute local variances and covariances var_I = imboxfilt(I.^2, r) ./ (r^2) - mean_I.^2; var_p = zeros(hei, wid, nCh); for ii=1:nCh var_p(:,:,ii) = imboxfilt(p(:,:,ii).^2, r) ./ (r^2) - mean_p(:,:,ii).^2; end % Compute weight and bias a = zeros(hei, wid, nCh); b = zeros(hei, wid, nCh); for ii=1:nCh a(:,:,ii) = cov_Ip(:,:,ii) ./ (var_I + eps); b(:,:,ii) = mean_p(:,:,ii) - a(:,:,ii) .* mean_I; end % Compute the filtering output q = zeros(size(p)); for ii=1:nCh q(:,:,ii) = imboxfilt(a(:,:,ii).*p(:,:,ii) + b(:,:,ii), r) ./ (r^2); end ``` 其中,I为引导图像,p为待处理图像,r为滤波器的半径,eps为正则化参数。函数返回值q为滤波后的图像。 下面是引导滤波的OpenCV实现: ```c++ cv::Mat guidedFilter(const cv::Mat& I, const cv::Mat& p, int r, double eps) { // Check inputs CV_Assert(I.channels() == 1); CV_Assert(p.channels() == 1 || p.channels() == I.channels()); CV_Assert(I.rows == p.rows && I.cols == p.cols); // Convert input images to CV_64FC1 cv::Mat I_double, p_double; I.convertTo(I_double, CV_64FC1); p.convertTo(p_double, CV_64FC1); // Compute mean and covariance matrices cv::Mat mean_I, mean_p, mean_Ip, cov_Ip, var_I, var_p; cv::boxFilter(I_double, mean_I, CV_64FC1, cv::Size(r, r)); cv::boxFilter(p_double, mean_p, CV_64FC1, cv::Size(r, r)); cv::boxFilter(I_double.mul(p_double), mean_Ip, CV_64FC1, cv::Size(r, r)); cov_Ip = mean_Ip - mean_I.mul(mean_p); cv::boxFilter(I_double.mul(I_double), var_I, CV_64FC1, cv::Size(r, r)); var_I -= mean_I.mul(mean_I); if (p.channels() == 1) { cv::boxFilter(p_double.mul(p_double), var_p, CV_64FC1, cv::Size(r, r)); var_p -= mean_p.mul(mean_p); } else { std::vector<cv::Mat> p_channels(p.channels()); cv::split(p_double, p_channels); var_p = cv::Mat::zeros(I.rows, I.cols, CV_64FC(p.channels())); for (int i = 0; i < p.channels(); i++) { cv::boxFilter(p_channels[i].mul(p_channels[i]), var_p.channels(i), CV_64FC1, cv::Size(r, r)); var_p.channels(i) -= mean_p.channels(i).mul(mean_p.channels(i)); } } // Compute weight and bias cv::Mat a, b; a = cov_Ip / (var_I + eps); b = mean_p - a.mul(mean_I); // Compute the filtering output cv::Mat q; if (p.channels() == 1) { cv::boxFilter(a.mul(p_double) + b, q, CV_64FC1, cv::Size(r, r)); } else { std::vector<cv::Mat> q_channels(p.channels()); for (int i = 0; i < p.channels(); i++) { cv::boxFilter(a.channels(i).mul(p_channels[i]) + b.channels(i), q_channels[i], CV_64FC1, cv::Size(r, r)); } cv::merge(q_channels, q); } return q; } ``` 其中,I为引导图像,p为待处理图像,r为滤波器的半径,eps为正则化参数。函数返回值q为滤波后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值