ガイド付きフィルタリングと opencv python 実装

意味

ガイド付きフィルター処理は、出力が図IIによってガイドされる線形フィルターです。I倍の入力グラフPPP は重みの加重平均を取得します。
ここに画像の説明を挿入
jjjはピクセルの添え字、フィルター カーネルW ij W_{ij}W I I ppに依存しないIの関数p

ブートストラップ フィルターの重要な仮定は、ブートストラップ I とフィルター出力qqq間の局所線形モデルqq_q I I I in ピクセルkkkを中心とするω k \omega_kおおkの線形変換。
ここに画像の説明を挿入
ここでは ( ak a_kakbk b_kbk) in ω k \omega_kおおkここで、 は線形定数です。ここでω k \omega_kおおk半径rrの場合rの正方形ウィンドウ。ウィンドウ内ω k \omega_kおおkその中で、1 つのak a_kのみが決定されますakbk b_kbk、しかし a ak a_kに基づくことができますakbk b_kbk∣ ω ∣ |\omega|を見つけます。ω qiq_iq. この局所線形モデルにより、qqq IIのみ私がエッジを持っているとき、私はエッジを持っています。なぜなら∇ q ∇qq =a ∇ I a∇I

派生する

リッジ回帰を使用してパラメーターak a_kを確認しますakbk b_kbkの値、つまり、次の式の最小値を見つけます:
ここに画像の説明を挿入
ここでϵ \epsilonϵはak a_kの場合の正則化パラメータですakは大きすぎます。qi q_i
と考えることができます。qパイ p_iの場合pノイズを除去ni n_in写真の後:
ここに画像の説明を挿入

得られた結果は次のとおりです。
ここに画像の説明を挿入
ここで、μ k \mu_kメートルkσ k 2 \sigma_k^2pk2 I I ω k \omega_kおおk内の平均と分散。∣ ω ∣ |\オメガ|ω はウィンドウ内のピクセル数です。p ‾ k \overline{p}_kpkウィンドウ内のppですpの平均。具体的な導出については、公式導出

この線形モデルを画像全体のすべての小さなウィンドウqi q_iに適用します。q小さなウィンドウごとに異なる値が存在するため、qi q_iを設定する必要があります。q平均を取る:
ここに画像の説明を挿入
論文は、最初に提案された加重平均の重みが次のようであることを指摘しています:
ここに画像の説明を挿入
ガイド画像IIのみに依存します。I._ _ 具体的な導出については、論文 3.3 で詳しく説明しています。

ϵ \εε

I = p I=p=p、アルゴリズムはエッジ保存フィルターになります。
ここに画像の説明を挿入

ケース1:

ウィンドウが平坦な領域にある場合、領域の方程式σ k 2 \sigma_k^2pk2はϵ \epsilonよりもはるかに小さくなりますϵしたがって、ak ≈ 0 a_k\approx0ak0bk ≈ p ‾ k b_k\approx\overline{p}_kbkpkこれは、領域に対して平均フィルタリングを実行することと同じです。

ケース2:

ウィンドウが高分散領域にある場合、この領域の方程式σ k 2 \sigma_k^2pk2はϵ \epsilonよりもはるかに大きくなりますϵしたがって、ak ≈ 1 a_k\approx1ak1bk ≈ 0 b_k\approx0bk0。これは、領域内の元の勾配を維持することと同じです。

ここに画像の説明を挿入
rrr ϵϵが大きいほど、画像がぼやけており、平均フィルタリングを行う傾向があります。

コード

ここに画像の説明を挿入
入力画像は処理前に正規化する必要があります。そうしないと、フィルタリング後に 255 を超える値が存在します。

def guided_filter(I,p,win_size,eps):

    mean_I = cv2.blur(I,(win_size,win_size))
    mean_p = cv2.blur(p,(win_size,win_size))

    corr_I = cv2.blur(I*I,(win_size,win_size))
    corr_Ip = cv2.blur(I*p,(win_size,win_size))

    var_I = corr_I-mean_I*mean_I
    cov_Ip = corr_Ip - mean_I*mean_p

    a = cov_Ip/(var_I+eps)
    b = mean_p-a*mean_I

    mean_a = cv2.blur(a,(win_size,win_size))
    mean_b = cv2.blur(b,(win_size,win_size))

    q = mean_a*I + mean_b
    return q

参考文献

ガイド付き画像フィルタリング
ガイド付きフィルター (ガイド付きフィルター) 式の詳細

おすすめ

転載: blog.csdn.net/qtzbxjg/article/details/127267133