画像バイラテラル フィルタリング アルゴリズムの Matlab シミュレーション

目次

1. 理論的根拠

2.コアプログラム

3. シミュレーションの結論


1. 理論的根拠

       画像バイラテラル フィルター処理は、一般的に使用される画像フィルター処理手法であり、画像を平滑化し、画像のエッジ情報を保持できます。しかし、従来のバイラテラル フィルタリング アルゴリズムは、大規模な画像を処理する際に計算量が多く、処理速度が遅くなります。この問題を解決するために、研究者は画像の高速バイラテラル フィルタリング アルゴリズムを提案しました。この記事では、画像高速バイラテラル フィルタリング アルゴリズムの原理と実装手順を紹介します。

       バイラテラル フィルタリング アルゴリズムは、2 次元のガウス フィルターを使用して画像を平滑化し、ピクセルの位置とピクセル値の差に応じて平滑化の度合いを調整することで、画像のエッジ情報を保持します。

       画像高速バイラテラル フィルタリング アルゴリズムは、改良されたバイラテラル フィルタリング アルゴリズムであり、高速近似ガウス フィルタリング メソッドを使用するため、フィルタリング プロセスが高速化されます。具体的には、画像高速バイラテラル フィルタリング アルゴリズムは次のステップに分割できます。
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 ガウス フィルタリングの具体的な実装は、特定の範囲内の周囲のピクセル値に異なるガウス重み値を割り当て、加重平均後に現在のポイントの最終結果を取得することです。ここでのガウス重み係数は、2 つのピクセル間の空間距離 (画像の 2D) 関係を使用して生成されます。ガウス分布の曲線から、ポイントがターゲット ピクセルに近いほど、最終結果への寄与が大きくなり、逆もまた同様であることがわかります。その定式的な説明は、一般的に次のとおりです。

       ガウス フィルタリングは、ローパス フィルタリング アルゴリズムで優れたパフォーマンスを発揮しますが、別の問題があります。つまり、ピクセル間の空間的な位置関係のみが考慮されるため、フィルタリング結果はエッジ情報を失います。ここでのエッジとは、主に画像内の主要な異なる色の領域 (青空、黒髪など) を指し、バイラテラルはこの問題を解決するためにガウスぼかしに別の重み分割を追加します。バイラテラル フィルタリングにおけるエッジの保存は、次の式によって実現されます。 

2.コアプログラム

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

3. シミュレーションの結論

 

 

おすすめ

転載: blog.csdn.net/ccsss22/article/details/130498526