- 締切済み
h.264のデブロッキングフィルタについて
H264のデブロッキングフィルタについてです。 現在H264について勉強しているのですが、デブロッキングフィルタのところで、ブロックノイズ付近ではフィルタリングを強くするなど、場所によってフィルタリング強度を変えるということはわかったのですが、このフィルタリング自体の処理がイマイチわかりません。 ガウシアンフィルタなどを使っているのでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- axel_eye
- ベストアンサー率64% (145/226)
No.1です。間違ってました。すみません。 (2-1),(2-3)の条件ですが、 正しくは、 (2-1)ap < β && Abs(p0 - q0) < ((α >> 2) + 2) (2-3)aq < β && Abs(p0 - q0) < ((α >> 2) + 2) でした。 また、No.2で書きましたαとβの式の前が、 (3-1),(3-2)となってますが、これは重複していました。 特に、番号無でよいかと思われます。
- axel_eye
- ベストアンサー率64% (145/226)
>この式の中にでてくる>>や<<は何を表しているのでしょうか? >ビットシフトということですか? No.1です。はい。ズバリその通りです。
- axel_eye
- ベストアンサー率64% (145/226)
No.1です。続きです。 α,βについてですが、 (3-1)chromaEdgeFlagが0の時 α = α' * (1 << (BitDepthy - 8) β = β' * (1 << (BitDepthy - 8) (3-2)chromaEdgeFlagが1の時 α = α' * (1 << (BitDepthc - 8) β = β' * (1 << (BitDepthc - 8) となります。chromaEdgeFlagも外部から貰います。 α',β'の値は、indexA,indexBという値によってテーブル引きされます。 indexA = Clip3(0, 51, qPav + filterOffsetA) indexB = Clip3(0, 51, qPav + filterOffsetB) qPavは恐らく、量子化パラメーターの平均だと思います。 filterOffsetA,filterOffsetB共に外部から貰います。 ついでに、filterSamplesFlagというものも求めます。 filterSamplesFlag = (bS != 0 && Abs(p0 - q0) < α && Abs(q1- q0) < β) となります。このfilterSamplesFlagが0か1かによってフィルターの有無が決まります。 最後に、indexAの値と、bS = 1/2/3の時によってt'c0の値をテーブル引きします。 すなわち、indexAの値とbSの値に応じたt'c0の値が存在する訳です。 ちなみに、これらの情報は書籍でも概要レベルでは載ってますが、 ITUから規格をダウンロードする事が出来ます。 http://www.itu.int/rec/T-REC-H.264-201003-I/en 上記のα,βのテーブル値及び、t'c0のテーブル値については8.7.2節辺りに載ってますので、 参考にしてください。 デブロッキングフィルタのフィルタは、FIRフィルタの一種であるようです。 ご参考までに。
- axel_eye
- ベストアンサー率64% (145/226)
デブロッキングフィルタの内部しかわかりません。 外部についてはわかりません。 前提として、4x4ブロックが2個横に並んでいるとします。 2個並んだブロックの境界から、水平左方向の画素をp0,p1,p2,p3 水平右方向の画素をq0,q1,q2,q3とします。 さらに、出力後のp0-p3,q0-q3をそれぞれ、p'0-p'3,q'0-q'3とします。 垂直についても同じですが、今は簡単のために水平方向だけ考える事にします。 まず、bS(Boundary Strength)値と言うのを入力します。 デブロッキングフィルタでは、このbS値によって3つの場合分けが できます。 (1)bS=0の時 フィルターはかけません。すなわち、p0-p3,q0-q3は全てスルーです。 (2)bS=4の時 フィルターは次のようなフィルターをかけます。 まず、ap = Abs(p2 - p0),aq = Abs(q2 - q0)です。 (2-1)ap < β < Abs(p0-q0) < ((α >> 2) + 2)の時 p'0 = (p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4) >> 3 p'1 = (p2 + p1 + p0 + q0 + 2) >> 2 p'2 = (2*p3 + 3*p2 + p1 + p0 + q0 + 4) >> 3 (2-2)(2-1)以外の時 p'0 = (2*p1 + p0 + q1 + 2) >> 2 p'1 = p1 p'2 = p2 (2-3)aq < β < Abs(p0-q0) < ((α >> 2) + 2)の時 q'0 = (p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4) q'1 = (p0 + q0 + q1 + q2 + 2) >> 2 q'2 = (2*q3 + 3*q2 + q1 + q0 + p0 + 4) >> 3 (2-4)(2-3)以外の時 q'0 = (2*q1 + q0 + p1 + 2) >> 2 q'1 = q1 q'2 = q2 となります。(2-1)(2-2)の処理は、p0-p3の処理で、 (2-3)(2-4)の処理は、q0-q3の処理です。 α,βに関しては後で説明します。 p3,q3に関してはスルーです。 (3)bS < 4の時 (3-1)chromaStyleFilteringが0の時 tc = tc0 + (ap < β) ? 1 : 0) + ((aq < β) ? : 0) (3-2)chromaStyleFilteringが1の時 tc = tc0 + 1 (3-3)chromaEdgeFlagが0の時 tc0 = t'c0 * (1 << BitDepthy - 8) (3-4)chromaEdgeFlagが1の時 tc0 = t'c0 * (1 << BitDepthc - 8) となります。 ここで、(3-1)(3-2)がペアの処理で(3-3)(3-4)がペアの処理です t'c0の求め方は後述します。BitDepthy,BitDepthcはデブロッキングフィルタの 外部から値を貰います。 (3-5)p'0,q'0 Δ = Clip3(-tc,tc,((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3)) (Clip3(a,b,c)は、cの範囲がa <= c <= bとなるようにクリップします) p'0 = Clip1(p0 + Δ) q'0 = Clip1(q0 + Δ) (うろ覚えですが、Clip1(a)は、0 <= a <= 255となるようにクリップするのだったと思います) (3-6)p'1(chromaStyleFilteringが0かつap < βの時) p'1 = p1 + Clip3(-tc0,tc0,(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) (3-7)p'1(chromaStyleFilteringが1またはap >= βの時) p'1 = p1 (3-8)q'1(chromaStyleFilteringが0かつaq < βの時) q'1 = q1 + Clip3(-tc0,tc0,(q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1) (3-9)p'1(chromaStyleFilteringが1またはaq >= βの時) q'1 = q1 (3-10)p'2,q'2 p'2 = p2 q'2 = q2 となります。
補足
回答ありがとうございます。 この式の中にでてくる>>や<<は何を表しているのでしょうか? ビットシフトということですか?