新しく質問する

h.264のデブロッキングフィルタについて

役に立った:0件
  • 質問者:noname#131042
  • 投稿日時:2011/04/15 12:37
  • 困り度:困ってます
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

H264のデブロッキングフィルタについてです。
現在H264について勉強しているのですが、デブロッキングフィルタのところで、ブロックノイズ付近ではフィルタリングを強くするなど、場所によってフィルタリング強度を変えるということはわかったのですが、このフィルタリング自体の処理がイマイチわかりません。

ガウシアンフィルタなどを使っているのでしょうか?

よろしくお願いします。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)

回答(4件)

  • 参考になった:0件
  • 回答者:axel_eye
  • 回答日時:2011/04/16 00:45

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)となってますが、これは重複していました。
特に、番号無でよいかと思われます。

通報する

  • 参考になった:0件
  • 回答者:axel_eye
  • 回答日時:2011/04/16 00:38

>この式の中にでてくる>>や<<は何を表しているのでしょうか?
>ビットシフトということですか?

No.1です。はい。ズバリその通りです。

通報する

  • 参考になった:0件
  • 回答者:axel_eye
  • 回答日時:2011/04/15 15:35

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フィルタの一種であるようです。
ご参考までに。

通報する

  • 参考になった:0件
  • 回答者:axel_eye
  • 回答日時:2011/04/15 15:21

デブロッキングフィルタの内部しかわかりません。
外部についてはわかりません。

前提として、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

となります。

通報する

この回答への補足

回答ありがとうございます。
この式の中にでてくる>>や<<は何を表しているのでしょうか?
ビットシフトということですか?

  
このQ&Aは役に立ちましたか?(役に立った:0件)

このページのトップへ