guided image filtering
时间: 2023-11-27 21:03:35 浏览: 127
引中提到了导向滤波,它是一种保边滤波器,类似于双边滤波器,需要除了原始影像之外的另一副引导图。导向滤波的框架和算法原理在引用中也有详细介绍。引导滤波器是一种显式图像过滤器,其输出是引导图像的局部线性变换。与双边滤波器相比,引导滤波器具有较好的边缘保留平滑特性,并且不会受到梯度反转伪影的影响。此外,引导滤波器还可以使用引导图像来使滤波输出比输入更结构化,平滑度更低。引导滤波器在各种应用中表现良好,包括图像平滑/增强、HDR压缩、闪光/无闪光成像、抠图/羽化、去雾和联合上采样。
在导向滤波中,权值的计算是通过引导图像来确定的。引导图像可以是单独的一幅图像,也可以是输入的图像本身。当引导图像是输入图像本身时,导向滤波就变成了一个边缘保留的滤波器。导向滤波器的重要假设是权值与像素值无关,对于灰度和高维图像,导向滤波器具有O(N)时间复杂度,其中N是像素数。根据引用中的描述,导向滤波器的CPU实现在每百万像素上执行灰度过滤的时间为40毫秒,是边缘保留过滤器中最快的之一。
综上所述,引导滤波器是一种保边滤波器,在图像处理中有着广泛的应用,可以通过引导图像来调整滤波器的行为,从而获得更好的平滑效果和边缘保留特性。
相关问题
引导滤波matlab代码实现,引导图滤波(Guided Image Filtering)原理以及OpenCV实现
引导滤波(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为滤波后的图像。
Image Fusion With Guided Filtering代码
### 基于引导滤波的图像融合代码实现
为了实现基于引导滤波的多聚焦图像融合,可以采用MATLAB作为编程工具。下面提供了一个简单的框架来展示如何利用引导滤波技术完成两幅输入图片的信息合成。
#### 准备工作
确保安装并配置好MATLAB环境,并导入待处理的一对或多张源图。这些图片应该具有相同的尺寸大小以便后续操作。
#### 主函数设计
定义主程序入口,在此调用辅助子函数执行具体任务:
```matlab
function fused_image = guided_filter_fusion(image1, image2)
% 输入参数image1,image2代表要融合的第一张和第二张原始灰度/彩色照片矩阵
% 调整亮度对比度使得两张图片更易区分特征区域
adjusted_img1 = adjust_contrast_brightness(image1);
adjusted_img2 = adjust_contrast_brightness(image2);
% 计算每张图片对应的权重映射W_i(x),这里简单取局部方差作为衡量标准之一
weight_map_1 = compute_weight_map(adjusted_img1);
weight_map_2 = compute_weight_map(adjusted_img2);
% 应用引导滤波器平滑权重分布,减少噪声影响
smoothed_weights_1 = guidedFilter(im2double(rgb2gray(image1)), im2double(weight_map_1), 8, 0.01);
smoothed_weights_2 = guidedFilter(im2double(rgb2gray(image2)), im2double(weight_map_2), 8, 0.01);
% 归一化处理后的权值向量之和等于1
total_weights = smoothed_weights_1 + smoothed_weights_2;
normalized_wts_1 = smoothed_weights_1 ./ total_weights;
normalized_wts_2 = smoothed_weights_2 ./ total_weights;
% 对应位置像素加权求平均值得到最终融合效果
fused_image = uint8(normalized_wts_1 .* double(image1) + ...
normalized_wts_2 .* double(image2));
end
```
上述过程中的`adjust_contrast_brightness()`用于增强原图细节;而`compute_weight_map()`则负责构建反映各处显著性的响应图谱[^2]。
#### 辅助功能模块
以下是两个重要的支持性方法声明:
```matlab
% 提升给定影像的整体视觉质量
function enhanced_pic = adjust_contrast_brightness(pic)
clc; clearvars -except pic;
hFig=figure('Name','调整前');
subplot(1,2,1);imshow(pic);title('Original Image');
low_in = min(min(double(pic)));
high_in = max(max(double(pic)));
low_out = 0;
high_out = 255;
enhanced_pic = (pic-low_in)*(high_out-low_out)/(high_in-low_in)+low_out;
enhanced_pic(uint8(enhanced_pic<0))=0;
enhanced_pic(uint8(enhanced_pic>255))=255;
subplot(1,2,2); imshow(uint8(enhanced_pic)); title('Enhanced Image')
figure(hFig);
end
% 创建描述空间变化特性的指示图表
function saliencyMap = compute_weight_map(img)
imgGray = rgb2gray(img);
gradientMagnitude = sqrt((imfilter(double(imgGray),[-1 0 1])').^2+(imfilter(double(imgGray),[-1;0;1]).^2));
sigma = 3;
gaussianKernelSize = fix(2 * ceil(2*sigma) + 1);
weights = fspecial('gaussian', [gaussianKernelSize gaussianKernelSize], sigma);
blurredGradientMag = conv2(gradientMagnitude,weights,'same');
thresholdValue = graythresh(blurredGradientMag)*255;
binaryMask = blurredGradientMag > thresholdValue;
saliencyMap = bwareaopen(binaryMask, 30);
end
```
通过以上步骤即可获得一张综合了多个视角优点的新图像。值得注意的是实际应用时可能还需要针对特定场景做适当修改优化算法性能[^1]。
阅读全文
相关推荐













