图像双边滤波算法matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       图像双边滤波是一种常用的图像滤波技术,它可以平滑图像并保留图像的边缘信息。然而,传统的双边滤波算法在处理大尺寸图像时,计算量较大,导致处理速度较慢。为了解决这个问题,研究者们提出了图像快速双边滤波算法。本文将介绍图像快速双边滤波算法的原理和实现步骤。

       双边滤波算法采用一个二维高斯滤波器对图像进行平滑处理,并根据像素的位置和像素值之间的差异来调整平滑程度,从而保留图像的边缘信息。

       图像快速双边滤波算法是一种改进的双边滤波算法,它采用了一种快速近似的高斯滤波方法,从而加速了滤波过程。具体来说,图像快速双边滤波算法可以分为以下步骤:
1.将输入图像$I_{\text{in}}$分解为不同尺度的图像$I_{\text{in}}^{(i)}$,其中$i$表示尺度。
2.对每个尺度的图像$I_{\text{in}}^{(i)}$进行高斯滤波处理,得到图像$G_{\sigma}^{(i)}$。
3.对每个尺度的图像$G_{\sigma}^{(i)}$进行双边滤波处理,得到图像$B_{\sigma}^{(i)}$。
4.将不同尺度的图像$B_{\sigma}^{(i)}$进行加权平均,得到最终输出图像$I_{\text{out}}$。
其中,高斯滤波和双边滤波的参数可以根据需要进行调整。
       图像快速双边滤波算法的原理是利用高斯金字塔的结构将图像分解成不同尺度的图像,然后对每个尺度的图像进行双边滤波处理,最后将不同尺度的图像进行加权平均,从而得到最终输出图像。采用这种方法可以加速滤波过程,同时保留图像的边缘信息。 

       图像快速双边滤波算法利用高斯金字塔结构将图像分解成不同尺度的图像,然后对每个尺度的图像进行双边滤波处理,最后将不同尺度的图像进行加权平均,从而得到最终输出图像。采用这种方法可以加速滤波过程,同时保留图像的边缘信息。

       滤波算法中,目标点上的像素值通常是由其所在位置上的周围的一个小局部邻居像素的值所决定。在2D高斯滤波中的具体实现就是对周围的一定范围内的像素值分别赋以不同的高斯权重值,并在加权平均后得到当前点的最终结果。而这里的高斯权重因子是利用两个像素之间的空间距离(在图像中为2D)关系来生成。通过高斯分布的曲线可以发现,离目标像素越近的点对最终结果的贡献越大,反之则越小。其公式化的描述一般如下所述:

       高斯滤波在低通滤波算法中有不错的表现,但是其却有另外一个问题,那就是只考虑了像素间的空间位置上的关系,因此滤波的结果会丢失边缘的信息。这里的边缘主要是指图像中主要的不同颜色区域(比如蓝色的天空,黑色的头发等),而Bilateral就是在Gaussian blur中加入了另外的一个权重分部来解决这一问题。Bilateral滤波中对于边缘的保持通过下述表达式来实现: 

二、核心程序

function [ outImg , param ]  =  shiftable_jointBF(inImg, rangeImg, sigmaS, sigmaR, w, tol)
 

% create spatial filter
filt     = fspecial('gaussian', [w w], sigmaS);

% set range interval and the order of raised cosine
T  =  maxFilter(rangeImg, w);
N  =  ceil( 0.405 * (T / sigmaR)^2 );

gamma    =  1 / (sqrt(N) * sigmaR);
twoN     =  2^N;

% compute truncation
if tol == 0
    M = 0;
else
    if sigmaR > 40
        M = 0;
    elseif sigmaR > 10
        sumCoeffs = 0;
        for k = 0 : round(N/2)
            sumCoeffs = sumCoeffs + nchoosek(N,k)/twoN;
            if sumCoeffs > tol/2
                M = k;
                break;
            end
        end
    else
        M = ceil( 0.5 * ( N - sqrt(4*N*log(2/tol)) ) );
    end
end


% main filter
[m, n, b]  =  size(inImg);
outImg1    =  zeros(m, n, b);
outImg2    =  zeros(m, n, b);
outImg     =  zeros(m, n, b);

warning off; %#ok<WNOFF>

for k = M : N - M
    
    coeff = nchoosek(N,k) / twoN;
    
    temp1  = cos( (2*k - N) * gamma * rangeImg);
    temp2  = sin( (2*k - N) * gamma * rangeImg);
    
    if size(inImg, 3) > 1
      temp1 = repmat(temp1, [1 1 size(inImg, 3)]);
      temp2 = repmat(temp2, [1 1 size(inImg, 3)]);
    end
    
    phi1 =  imfilter(inImg .* temp1, filt);
    phi2 =  imfilter(inImg .* temp2, filt);
    phi3 =  imfilter(temp1, filt);
    phi4 =  imfilter(temp2, filt);
    
    outImg1 = outImg1 + coeff * ( temp1 .* phi1 +  temp2 .* phi2 );
    outImg2 = outImg2 + coeff * ( temp1 .* phi3 +  temp2 .* phi4 );
    
end

idx1 = find( outImg2 < 0.0001);
idx2 = find( outImg2 > 0.0001);

outImg( idx1 ) = inImg( idx1 );
outImg( idx2 ) = outImg1( idx2 ) ./ outImg2 (idx2 );

% save parameters
param.T  = T;
param.N  = N;
param.M  = M;

up171

三、仿真结论

 

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130498526