意味
ガイド付きフィルター処理は、出力が図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_kak、bk b_kbk) in ω k \omega_kおおkここで、 は線形定数です。ここでω k \omega_kおおk半径rrの場合rの正方形ウィンドウ。ウィンドウ内ω k \omega_kおおkその中で、1 つのak a_kのみが決定されますakとbk b_kbk、しかし a ak a_kに基づくことができますakとbk b_kbk、∣ ω ∣ |\omega|を見つけます。∣ ω ∣ qiq_iq私. この局所線形モデルにより、qqq IIのみ私がエッジを持っているとき、私はエッジを持っています。なぜなら∇ q ∇q∇ q =a ∇ I a∇Iあ∇私。
派生する
リッジ回帰を使用してパラメーターak a_kを確認しますak、bk 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}_kpなkウィンドウ内の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\approx0ak≒0,bk ≈ p ‾ k b_k\approx\overline{p}_kbk≒pなkこれは、領域に対して平均フィルタリングを実行することと同じです。
ケース2:
ウィンドウが高分散領域にある場合、この領域の方程式σ k 2 \sigma_k^2pk2はϵ \epsilonよりもはるかに大きくなりますϵ。したがって、ak ≈ 1 a_k\approx1ak≒1,bk ≈ 0 b_k\approx0bk≒0。これは、領域内の元の勾配を維持することと同じです。
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