以下、本発明の実施の形態について、図面を参照しながら説明する。なお、以下の実施形態における構成要素は、適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組み合わせを含む様々なバリエーションが可能である。したがって、以下の実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
(第1実施形態)
以下、図1~図16を参照して、本発明の第1実施形態に係る画像処理システム10について説明する。図1は、本実施形態に係る実施形態に係る画像処理システム10を示す図である。
図1に示すように、画像処理システム10は、画像符号化装置100及び画像復号装置200を有する。
画像符号化装置100は、入力画像信号を符号化することによって符号化データを生成するように構成されている。画像復号装置200は、符号化データを復号することによって出力画像信号を生成するように構成されている。
ここで、かかる符号化データは、画像符号化装置100から画像復号装置200に対して伝送路を介して送信されてもよい。また、符号化データは、記憶媒体に格納された上で、画像符号化装置100から画像復号装置200に提供されてもよい。
(画像符号化装置100)
以下、図2を参照して、本実施形態に係る画像符号化装置100について説明する。図2は、本実施形態に係る画像符号化装置100の機能ブロックの一例について示す図である。
図2に示すように、画像符号化装置100は、インター予測部111と、イントラ予測部112と、減算器121と、加算器122と、変換・量子化部131と、逆変換・逆量子化部132と、符号化部140と、インループフィルタ処理部150と、フレームバッファ160とを有する。
インター予測部111は、インター予測(フレーム間予測)によって予測信号を生成するように構成されている。
具体的には、インター予測部111は、符号化対象のフレーム(以下、対象フレーム)とフレームバッファ160に格納される参照フレームとの比較によって、参照フレームに含まれる参照ブロックを特定し、特定された参照ブロックに対する動きベクトルを決定するように構成されている。
また、インター予測部111は、参照ブロック及び動きベクトルに基づいて予測ブロックに含まれる予測信号を予測ブロック毎に生成するように構成されている。インター予測部111は、予測信号を減算器121及び加算器122に出力するように構成されている。ここで、参照フレームは、対象フレームとは異なるフレームである。
イントラ予測部112は、イントラ予測(フレーム内予測)によって予測信号を生成するように構成されている。
具体的には、イントラ予測部112は、対象フレームに含まれる参照ブロックを特定し、特定された参照ブロックに基づいて予測信号を予測ブロック毎に生成するように構成されている。また、イントラ予測部112は、予測信号を減算器121及び加算器122に出力するように構成されている。
ここで、参照ブロックは、予測対象のブロック(以下、対象ブロック)について参照されるブロックである。例えば、参照ブロックは、対象ブロックに隣接するブロックである。
減算器121は、入力画像信号から予測信号を減算し、予測残差信号を変換・量子化部131に出力するように構成されている。ここで、減算器121は、イントラ予測又はインター予測によって生成される予測信号と入力画像信号との差分である予測残差信号を生成するように構成されている。
加算器122は、逆変換・逆量子化部132から出力される予測残差信号に予測信号を加算してフィルタ処理前復号信号を生成し、かかるフィルタ処理前復号信号をイントラ予測部112及びインループフィルタ処理部150に出力するように構成されている。
ここで、フィルタ処理前復号信号は、イントラ予測部112で用いる参照ブロックを構成する。
変換・量子化部131は、予測残差信号の変換処理を行うとともに、係数レベル値を取得するように構成されている。さらに、変換・量子化部131は、係数レベル値の量子化を行うように構成されていてもよい。
ここで、変換処理は、予測残差信号を周波数成分信号に変換する処理である。かかる変換処理では、離散コサイン変換(DCT;Discrete Cosine Transform)に対応する基底パターン(変換行列)が用いられてもよく、離散サイン変換(DST;Discrete Sine Transform)に対応する基底パターン(変換行列)が用いられてもよい。
逆変換・逆量子化部132は、変換・量子化部131から出力される係数レベル値の逆変換処理を行うように構成されている。ここで、逆変換・逆量子化部132は、逆変換処理に先立って、係数レベル値の逆量子化を行うように構成されていてもよい。
ここで、逆変換処理及び逆量子化は、変換・量子化部131で行われる変換処理及び量子化とは逆の手順で行われる。
符号化部140は、変換・量子化部131から出力された係数レベル値を符号化し、符号化データを出力するように構成されている。
ここで、例えば、符号化は、係数レベル値の発生確率に基づいて異なる長さの符号を割り当てるエントロピー符号化である。
また、符号化部140は、係数レベル値に加えて、復号処理で用いる制御データを符号化するように構成されている。
ここで、制御データは、符号化ブロック(CU:Coding Unit)サイズ、予測ブロック(PU:Prediction Unit)サイズ、変換ブロック(TU:Transform Unit)サイズ等のサイズデータを含んでもよい。
インループフィルタ処理部150は、加算器122から出力されるフィルタ処理前復号信号に対してフィルタ処理を行うとともに、フィルタ処理後復号信号をフレームバッファ160に出力するように構成されている。
ここで、例えば、フィルタ処理は、ブロック(符号化ブロック、予測ブロック又は変換ブロック)の境界部分で生じる歪みを減少するデブロッキングフィルタ処理である。
フレームバッファ160は、インター予測部111で用いる参照フレームを蓄積するように構成されている。
ここで、フィルタ処理後復号信号は、インター予測部111で用いる参照フレームを構成する。
(符号化部140)
以下、図3~図5を用いて符号化部140で符号化される制御データについて説明する。図3は、符号化部140から出力される符号化後のデータ(ビットストリーム)の構成例である。
まず、かかるビットストリームは、先頭にSPS(Sequence Parameter Set:シーケンスパラメータセット)141を含んでもよい。SPS141は、シーケンス(ピクチャの集合)単位での制御データの集合である。具体例については、後述する。各SPS141は、複数のSPS141が存在する場合に個々を識別するためのid情報を少なくとも含む。
かかるビットストリームは、SPS141の次に、PPS(Picture Parameter Set:ピクチャパラメータセット)142を含んでもよい。PPS142は、ピクチャ(スライスの集合)単位での制御データの集合である。各PPS142は、複数のSPS141が存在する場合に個々を識別するためのid情報を少なくとも含む。また、各PPS142は、各PPS142に対応するSPS141を指定するためのSPS id情報を少なくとも含む。
かかるビットストリームは、PPS142の次に、スライスヘッダ143Aを含んでもよい。スライスヘッダ143Aは、スライス単位での制御データの集合である。具体例については、後述する。各スライスヘッダ143Aは、各スライスヘッダ143Aに対応するPPS142を指定するためのPPS id情報を少なくとも含む。
かかるビットストリームは、スライスヘッダ143Aの次に、スライスデータ144Aを含んでもよい。スライスデータ144Aは、上述の係数レベル値やサイズデータ等を含んでもよい。
以上のように、各スライスデータ144A/144Bに、1つずつスライスヘッダ143A/143B、PPS142、SPS141が対応する構成となる。上述のように、スライスヘッダ143A/143Bにて、どのPPS142を参照するかについてPPS id情報で指定し、さらに、そのPPS142にて、どのSPS141を参照するかについてSPS id情報で指定するため、複数のスライスデータ144A/144Bに対して共通のSPS141及びPPS142を用いることができる。
言い換えると、SPS141及びPPS142は、スライスデータ144A/144B毎に、必ずしも伝送する必要がない。例えば、図3のように、スライスヘッダ143B及びスライスデータ144Bの直前では、SPS141及びPPS142を符号化しないようなストリーム構成とすることもできる。
なお、図3の構成は、あくまで一例である。各スライスデータ144A/144Bに、スライスヘッダ144A/144B、PPS142、SPS141で指定された制御データが対応する構成となっていれば、ストリームの構成要素として、上述以外の要素が追加されてもよい。また、同様に、伝送に際して、図3と異なる構成に整形されてもよい。
図4は、SPS141内に含まれる制御データの一例を示す図である。
SPS141は、上述の通り、少なくとも各SPS141を識別するためのid情報 (sps_seq_parameter_set_id)を含む。
SPS141は、後述するBDOF(Bi-Directional Optical Flow)処理の使用可否(有効・無効)を制御するためのフラグである「sps_bdof_enabled_flag」を含んでもよい。かかるフラグの値が「0」である時、かかるSPS141に対応するスライス内では、BDOF処理を使用しないことを意味する。一方、かかるフラグの値が「1」である時は、かかるSPS141に対応するスライス内で、BDOF処理を使用可能であることを意味する。スライス内の各ブロックでBDOF処理を実際に使用するかどうかは、後述する処理にてブロック毎に決定される。
すなわち、「sps_bdof_enabled_flag」は、SPS141に含まれるBDOF処理のシーケンス単位での使用可否を示すフラグ(第4フラグ)である。
SPS141は、後述するDMVR(Decoder-side Motion Vector Refinemtnt)処理の使用可否(有効・無効)を制御するためのフラグである「sps_dmvr_enabled_flag」を含んでもよい。かかるフラグの値が「0」である時、かかるSPS141に対応するスライス内では、DMVR処理を使用しないことを意味する。一方、かかるフラグの値が「1」である時は、かかるSPS141に対応するスライス内で、DMVR処理を使用可能であることを意味する。スライス内の各ブロックでDMVR処理を実際に使用するかどうかは、後述する処理にてブロック毎に決定される。
すなわち、「sps_dmvr_enabled_flag」は、SPS141に含まれるDMVR処理のシーケンス単位での使用可否を示すフラグ(第3フラグ)である。
SPS141は、後述するアフィン動き補償の使用可否(有効・無効)を制御するためのフラグである「sps_affine_enabled_flag」を含んでもよい。かかるフラグの値が「0」である時、かかるSPS141に対応するスライス内では、アフィン動き補償を使用しないことを意味する。一方、かかるフラグの値が「1」である時は、かかるSPS141に対応するスライス内で、アフィン動き補償を使用可能であることを意味する。スライス内の各ブロックでアフィン動き補償を実際に使用するかどうかは、後述する処理にてブロック毎に決定される。
すなわち、「sps_affine_prof_enabled_flag」は、SPS141に含まれるPROF処理のシーケンス単位での使用可否を示すフラグ(第5フラグ)である。
「sps_affine_enabled_flag」が「1」である時、SPS141は、追加で「sps_affine_type_flag」というフラグを含んでもよい。かかるフラグの値が「0」である時、かかるSPS141に対応するスライス内では、後述するアフィン動き補償の際のパラメータ数を常に「4」とすることを意味する。一方、かかるフラグの値が「1」である時は、かかるSPS141に対応するスライス内で、アフィン動き補償を行う際にパラメータ数を「4」又は「6」のいずれからかブロック毎に選択可能であることを意味する。
「sps_affine_enabled_flag」の値が「1」である時、SPS141は、追加で「sps_affine_prof_enabled_flag」というフラグを含んでもよい。かかるフラグの値が「0」である時、かかるSPS141に対応するスライス内では、後述するPROF(Prediction Refinement with Optical Flow)処理を使用しないことを意味する。一方、かかるフラグの値が「1」である時は、かかるSPS141に対応するスライス内で、PROF処理を使用可能であることを意味する。スライス内の各ブロックでPROF処理を実際に使用するかどうかは、後述する処理にてブロック毎に決定される。
「sps_bdof_enabled_flag」、「sps_dmvr_enabled_flag」及び「sps_affine_prof_enabled_flag」のうち少なくともいずれか1つのフラグの値が「1」である時、SPS141は、追加で「sps_bdof_dmvr_prof_slice_present_flag」というフラグを含んでもよい。かかるフラグが「1」である時、かかるSPS141に対応するスライスヘッダ143A/143B内に、後述する「slice_disable_bdof_dmvr_prof_flag」というフラグを含むことを意味する。かかるフラグの値が「0」である時は、かかるSPS141に対応するスライスヘッダ143A/143B内に、「slice_disable_bdof_dmvr_prof_flag」が含まれないことを意味する。
すなわち、「sps_bdof_dmvr_prof_slice_present_flag」は、スライスヘッダ143A/143B内に、「slice_disable_bdof_dmvr_prof_flag」が含まれているか否かについて示すフラグ(第2フラグ)である。なお、かかるフラグが存在しなかった場合は、かかるフラグの値が「0」であると暗黙的にみなすことができる。
図5は、スライスヘッダ143A/143Bに含まれる制御データの一例を示す図である。
スライスヘッダ143A/143Bには、上述の通り、かかるスライスに対応するPPS142を指定するためのPPS id情報である「slice_pic_parameter_set_id」を少なくとも含む。上述の通り、かかるPPS id情報で指定されたPPS内で参照されているSPS141が、かかるスライスヘッダ143A/143Bに対応するSPS141となる。
かかるスライスヘッダ143A/143Bに対応するSPS141内に「sps_bdof_dmvr_prof_slice_present_flag」が含まれており、かつ、かかるフラグの値が「1」である時、かかるスライスヘッダ143A/143Bに「slice_disable_bdof_dmvr_prof_flag」が含まれていてもよい。かかるフラグの値が「1」である場合、後述のように、かかるスライスに含まれる各ブロックにおいて、BDOF処理、DMVR処理、PROF処理を使用しないように制御されてもよい。かかるフラグの値が「0」である場合、かかるスライスに含まれる各ブロックにおいて、BDOF処理、DMVR処理、PROF処理を使用することができるように制御されてもよい。
ずなわち、「slice_disable_bdof_dmvr_prof_flag」は、スライスヘッダ143A/143Bに含まれるDMVR処理、BDOF処理、PROF処理の使用可否を一括して制御するフラグ(第1フラグ)である。
換言すると、「slice_disable_bdof_dmvr_prof_flag」は、スライスヘッダ143A/143Bに含まれるPROF処理の使用可否を制御するフラグであり、スライスヘッダ143A/143Bに含まれるDMVR処理の使用可否を制御するフラグであり、スライスヘッダ143A/143Bに含まれるBDOF処理の使用可否を制御するフラグである。
以上で説明したフラグの値は、あくまでも一例である。フラグの値(「0」及び「1」)に与える意味を逆転させた場合、対応する処理もそれに応じて逆転させることで等価な処理を実現可能である。
また、以上のように、BDOF処理、DMVR処理、PROF処理をスライス単位で使用しないように制御するフラグを設けることで、画像符号化装置100側から、かかる機能を使用しないことを明示的に制御することができるため、かかる機能を使用しないことで画像符号化装置100及び対応する画像復号装置200の処理負荷や消費電力を削減することができる。
(インター予測部111)
以下、図6を参照して、本実施形態に係る画像符号化装置100のインター予測部111について説明する。図6は、本実施形態に係る画像符号化装置100のインター予測部111の機能ブロックの一例について示す図である。
図6に示すように、インター予測部111は、動きベクトル探索部111Aと、動きベクトル符号化部111Bと、洗練化部111Cと、予測信号生成部111Dと、アフィン動きベクトル算出部111Eと、アフィン予測信号生成部111Fとを有する。
インター予測部111は、動きベクトルに基づいて予測ブロックに含まれる予測信号を生成するように構成されている予測部の一例である。
動きベクトル探索部111Aは、対象フレームと参照フレームとの比較によって、参照フレームに含まれる参照ブロックを特定し、特定された参照ブロックに対する動きベクトルを探索するように構成されている。
また、上述の探索を複数の参照フレーム候補に対して行い、当該予測ブロックで予測に用いる参照フレーム及び動きベクトルを決定する。参照フレーム及び動きベクトルは、一つのブロックに対して最大二つずつ用いることができる。一つのブロックに対して参照フレーム及び動きベクトルを一組のみ用いる場合を片予測と呼び、参照フレーム及び動きベクトルを二組用いる場合を双予測と呼ぶ。以降、一組目をL0と呼び、二組目をL1と呼ぶ。
更に、動きベクトル探索部111Aは、参照フレーム及び動きベクトルの符号化方法を決定するように構成されている。符号化方法には、参照フレーム及び動きベクトルの情報をそれぞれ伝送する通常の方法に加え、後述するマージモードやアフィン動き補償等がある。
なお、動きベクトルの探索方法、参照フレームの決定方法及び参照フレーム及び動きベクトルの符号化方法の決定方法については、既知の手法を採用することが可能であるため、その詳細については省略する。
動きベクトル符号化部111Bは、動きベクトル探索部111Aで決定した参照フレームと動きベクトルの情報を、同じく動きベクトル探索部111Aで決定した符号化方法を用いて符号化するように構成されている。具体的な参照フレーム及び動きベクトル情報の符号化方法については、既知の手法を採用することが可能であるため、その詳細については省略する。
当該ブロックの符号化方法がマージモードの場合、画像符号化装置100側において、初めに、当該ブロックに対するマージリストが作成される。ここで、マージリストは、参照フレームと動きベクトルとの組み合わせが複数列挙されたリストである。
各組み合わせには、インデックスが振られており、画像符号化装置100は、参照フレーム及び動きベクトルの情報を個別に符号化する代わりに、かかるインデックスのみを符号化し、画像復号装置200に伝送する。画像符号化装置100側と画像復号装置200側とでマージリストの作成方法を共通化しておくことで、画像復号装置200側では、かかるインデックスに係る情報のみから参照フレーム及び動きベクトルの情報を復号することができる。
なお、マージリストの作成方法については、既知の手法を採用することが可能であるため、その詳細については省略する。
アフィン動き補償は、ブロック毎に少数のパラメータを伝送し、そのパラメータと予め定められたモデルとに基づいて、かかるブロックを分割したサブブロック毎の動きベクトルを導出する手法である。かかる動きベクトルを導出する手法の詳細については、後述する。
アフィン動き補償の場合、動きベクトル符号化部111Bは、後述するコントロールポイント動きベクトルの情報及び参照フレームの情報を符号化するように構成されている。コントロールポイント動きベクトルは、後述のように、ブロック毎に2つ又は3つの動きベクトル情報を伝送する。
また、かかるブロックが、双予測を行うブロックの場合は、L0及びL1について、それぞれ2つ又は3つずつコントロールポイント動きベクトルの情報を伝送する。具体的な符号化方法については、既知の手法を採用することが可能であるため、その詳細については省略する。
当該ブロックにて、アフィン動き補償を用いる場合は、図6に示すアフィン動きベクトル算出部111Eの処理に移り、そうでない場合は、洗練化部111Cの処理に移る。
洗練化部111Cは、動きベクトル符号化部111Bで符号化された動きベクトルを修正する洗練化処理(例えば、DMVR)を行うように構成されている。
具体的には、洗練化部111Cは、動きベクトル符号化部111Bで符号化された動きベクトルによって特定される参照位置を基準として探索範囲を設定し、探索範囲の中から所定コストが最も小さい修正参照位置を特定し、修正参照位置に基づいて動きベクトルを修正する洗練化処理を行うように構成されている。
図7は、洗練化部111Cの処理手順の一例を示すフローチャートである。
図7に示すように、ステップS71において、洗練化部111Cは、洗練化処理を適用するための所定条件が満足されているかどうかについて判定する。かかる所定条件が全て満足されている場合に、本処理手順は、ステップS72へ進む。一方、かかる所定条件のどれか一つでも満足されていない場合は、本処理手順は、ステップS75へ進み、洗練化処理を終了する。
ここで、所定条件は、当該ブロックが双予測を行うブロックであるという条件を含む。
また、所定条件は、L0側の参照フレーム及びL1側の参照フレームのいずれか一方が当該フレームに対して時間的に過去のフレームで、他方の参照フレームが当該フレームに対して時間的に未来のフレームであり、当該フレームからの時間的な距離(例えば、POC(Picture Order Count)の差の絶対値)がL0側とL1側とで等しいことという条件を含んでもよい。
また、所定条件は、動きベクトルがマージモードで符号化されているという条件を含んでもよい。
また、所定条件は、当該ブロックが属するシーケンスのSPS141において、「sps_dmvr_enabled_flag」の値が当該シーケンスにてDMVRを使用可能であるということを示していること(例えば、当該フラグの値が「1」であること)という条件を含んでもよい。
さらに、所定条件は、当該ブロックが属するスライスのスライスヘッダ143A/143Bにおいて、「slice_disable_bdof_dmvr_prof_flag」の値が当該スライスにおいてDMVRを使用可能であるということを示していること(例えば、当該フラグの値が「0」であること)という条件を含んでもよい。
ステップS72において、洗練化部111Cは、動きベクトル符号化部111Bで符号化された動きベクトル及び参照フレームの情報に基づいて、探索用画像を生成する。
ここで、動きベクトルが非整数画素位置を指していた場合は、洗練化部111Cは、参照フレームの画素値にフィルタを適用して非整数画素位置の画素を内挿する。この時、洗練化部111Cは、後述する予測信号生成部111Dで用いる内挿フィルタより、少ないタップ数の内挿フィルタを用いることで、演算量を削減することができる。例えば、洗練化部111Cは、バイリニア補間によって非整数画素位置の画素値を内挿することができる。
ステップS73において、洗練化部111Cは、ステップS72で生成した探索用画像を用いて、整数画素精度での探索を行う。ここで、整数画素精度とは、動きベクトル符号化部111Bで符号化された動きベクトルを基準として、整数画素間隔となる点のみを探索することを意味する。
洗練化部111Cは、ステップS72の探索によって、整数画素間隔位置での修正後の動きベクトルを決定する。探索の方法としては、既知の手法を用いることができる。
例えば、洗練化部111Cは、L0側及びL1側の差分動きベクトルが符号のみを反転した組み合わせとなる点のみを探索するという方法で探索することもできる。探索に際しては、洗練化部111Cは、例えば、各探索点において探索コストを算出し、探索コストが最も小さい探索点に動きベクトルを修正するように決定してもよい。
ここで、洗練化部111Cは、動きベクトル符号化部111Bで符号化された動きベクトルに対応する探索点での探索コストのみを小さくするように算出してもよい。例えば、当該探索点に関しては、洗練化部111Cは、他の探索点と同様の方法で算出した探索コストを、3/4に小さくした値を当該探索点の最終的な探索コストと設定してもよい。
ステップS73における探索の結果、探索前の動きベクトルと同じ値になる可能性もある。
ステップS74において、洗練化部111Cは、ステップS73で決定した整数画素精度での修正後の動きベクトルを初期値として、非整数画素精度での動きベクトル探索を行う。動きベクトルの探索方法としては、既知の手法を用いることができる。
また、洗練化部111Cは、実際に探索を行わずに、ステップS73の結果を入力として、パラボラフィッティング等のパラメトリックなモデルを用いて非整数画素精度でのベクトルを決定することもできる。
洗練化部111Cは、ステップS74において、非整数画素精度での修正後の動きベクトルを決定した後、ステップS45へ移り洗練化処理を終了する。ここでは、便宜上、非整数画素精度の修正後動きベクトルという表現を用いたが、ステップS74の探索結果により、結果的に、ステップS73で求めた整数画素精度の動きベクトルと同じ値になる可能性もある。
洗練化部111Cは、予め定めた閾値より大きなブロックを、小さなサブブロックに分割してサブブロックごとに洗練化処理を実行してもよい。例えば、洗練化部111Cは、洗練化処理の実行単位を16×16画素と設定しておき、ブロックの水平方向又は垂直方向のサイズが16画素より大きい場合、それぞれ16画素以下となるように分割することができる。この時、洗練化処理の基準となる動きベクトルとしては、同一ブロック内の全てのサブブロックについて、動きベクトル符号化部111Bで符号化された当該ブロックの動きベクトルを用いる。
サブブロックごとに処理を行う場合、洗練化部111Cは、図7の全ての手順をサブブロックごとに実行してもよい。また、洗練化部111Cは、図7の処理の一部のみをサブブロックごとに処理してもよい。具体的には、洗練化部111Cは、図7のステップS71及びS72については、ブロック毎に処理を行い、ステップS73及びS74について、サブブロックごとに処理してもよい。
予測信号生成部111Dは、洗練化部111Cから出力される修正された動きベクトルに基づいて予測信号を生成するように構成されている。
ここで、後述するように、予測信号生成部111Dは、上述の洗練化処理の過程で算出される情報(例えば、探索コスト)に基づいて、ブロック毎にBDOF処理を行うか否かについて判定するように構成されている。
具体的には、予測信号生成部111Dは、動きベクトルが修正されない場合には、動きベクトル符号化部111Bで符号化された動きベクトルに基づいて予測信号を生成するように構成されている。一方で、予測信号生成部111Dは、動きベクトルが修正される場合には、洗練化部111Cで修正された動きベクトルに基づいて予測信号を生成するように構成されている。
図8は、予測信号生成部111Dの処理手順の一例を示すフローチャートである。ここで、洗練化部111Cにてサブブロック単位で洗練化処理が行われた場合、予測信号生成部111Dの処理もサブブロック単位で実行される。その場合、以下の説明のブロックという単語は、適宜、サブブロックに読み替えることができる。
図8に示すように、ステップS81において、予測信号生成部111Dは、予測信号を生成する。
具体的には、予測信号生成部111Dは、動きベクトル符号化部111Bで符号化された動きベクトル或いは洗練化部111Cで符号化された動きベクトルを入力として、かかる動きベクトルが指す位置が非整数画素位置の場合は、参照フレームの画素値にフィルタを適用して非整数画素位置の画素を内挿する。ここで、具体的なフィルタについては、非特許文献1で開示されている最大8タップの水平垂直可分型のフィルタを適用することができる。
予測信号生成部111Dは、当該ブロックが双予測を行うブロックである場合は、一つ目(以後、L0と呼ぶ)の参照フレーム及び動きベクトルによる予測信号及び二つ目(以後、L1と呼ぶ)の参照フレーム及び動きベクトルによる予測信号の両方を生成する。
ステップS82において、予測信号生成部111Dは、ブロック毎に、後述するBDOF処理の適用条件が満足されているかどうかについて確認する。
かかる適用条件としては、少なくとも当該ブロックが双予測を行うブロックであることという条件を含む。
また、適用条件は、洗練化部111CのステップS73における整数画素位置探索において、上述の探索コストが最小となる探索点の探索コストが、予め定めた閾値よりも大きい又は予め定めた閾値以上であることという条件を含んでもよい。
また、所定条件は、当該ブロックが属するシーケンスのSPS141において、「sps_bdof_enabled_flag」の値が当該シーケンスにてBDOFを使用可能であるということを示していること(例えば、当該フラグの値が「1」であること)という条件を含んでもよい。
また、適用条件は、当該ブロックが属するスライスのスライスヘッダ143A/143Bにおいて、「slice_disable_bdof_dmvr_prof_flag」の値が当該スライスにおいてBDOF処理を使用可能であるということを示していること(例えば、当該フラグの値が「0」であること)という条件を含んでもよい。
また、適用条件は、L0側の参照フレーム及びL1側の参照フレームのいずれ一方が当該フレームに対して時間的に過去のフレームで、他方の参照フレームが当該フレームに対して時間的に未来のフレームであり、当該フレームからの時間的な距離(例えば、POCの差の絶対値)のL0側とL1側との比率が、予め定めた比率になっていることという条件を含んでもよい。
ここで、比率の決定方法は、例えば、後述のBDOF処理におけるL0側とL1側との勾配や輝度値を用いて演算する際の重み係数の逆数に比例するように決定してもよい。
例えば、L0側の重み係数を「2/3」とし、L1側の重み係数を「1/3」とする場合、参照フレームの距離の比率として、L0と当該フレーム間の距離を「1」とすると、L1と当該フレーム間の距離が「2」となる場合のみ、BDOF処理を適用するようにしてもよい。
同様に、例えば、L0側の重み係数を「1/2」とし、L1側の重み係数を「1/2」とする場合、参照フレームの距離の比率として、L0と当該フレーム間の距離を「1」とすると、L1と当該フレーム間の距離が「1」となる場合、すなわち、当該フレームとL0及びL1との間の距離が等しい場合のみ。BDOF処理を適用するようにしてもよい。
すなわち、予測信号生成部111Dは、かかる適用条件として、2つの参照フレーム(L0/L1)の画素値同士又は2つの参照フレーム(L0/L1)の画素値から算出した値同士を用いて演算する場合の重み係数の逆数に比例するように、2つの参照フレーム(L0/L1)と当該フレームとの時間的な距離に関する条件を備えてもよい。
また、予測信号生成部111Dは、かかる適用条件として、かかる重み係数が等しい場合、かかる時間的な距離に関する条件として、2つの参照フレーム(L0/L1)のそれぞれと当該フレームとの時間的な距離が等しいことを備えてもよい。
なお、ここでは、一例として重み係数が「1/2」の場合を説明したが、L0側及びL1側に同じ重み(例えば、「1」でもよい)が用いられている場合に、かかるフレームとL0及びL1との間の距離が等しい場合のみ、BDOF処理を適用するようにしてもよい。
かかる適用条件を満足すると判定された場合には、本処理手順は、ステップS83に移り、かかる適用条件が満足されていない場合、本処理手順は、ステップS84に移る。
ステップS83において、予測信号生成部111Dは、BDOF処理を実行して予測信号を生成する。BDOF処理の処理自体は、既知の手法を用いることができるため、概要のみを説明し、詳細についての説明は省略する。
第1に、予測信号生成部111Dは、当該ブロックの参照ブロック内の各画素について、垂直方向及び水平方向の輝度値の勾配を算出する。具体的な算出方法は、例えば、非特許文献1に記載の方法で算出できる。ここで、L0の水平方向の勾配を「gradientHL0」と呼び、L0の垂直方向の勾配を「gradientVL0」と呼び、L1の水平方向の勾配を「gradientHL1」と呼び、L1の垂直方向の勾配を「gradientVL1」と呼ぶこととする。
第2に、予測信号生成部111Dは、当該ブロックの補正MV(vx、vy)を算出する。具体的な算出方法は、例えば、非特許文献1に記載の方法で算出できる。ここで、上述の勾配の和(tempH、tempV)及びL0及びL1の参照ブロック間の輝度値差分(diff)について、以下のように算出し、非特許文献1に記載のように、上述の(vx、vy)の算出に用いてもよい。
diff=predSampleL0×weightL0-predSampleL1×weightL1
tempH=gradientHL0×weightL0+gradientHL1×weightL1
tempV=gradientVL0×weightL0+gradientVL1×weightL1
ここで、「predSampleL0」及び「predSampleL1」は、それぞれ、L0及びL1の参照ブロックの輝度値であり、「weightL0」及び「weightL1」は、それぞれ、上述の勾配及び輝度値差分算出時の重み係数である。
ここでは、「diff」、「tempH」、「tempV」の3つのパラメータを例に共通の重みを用いる例を説明したが、L0側の情報及びL1側の情報を加減乗除する際であれば、同様の重みを設定することができる。
また、かかる重みの逆数に比例して、上述の通り、BDOF処理の参照フレームとの距離に関する適用条件を設定してもよい。言い換えると、当該フレームとL0及びL1の各参照フレームとの距離の比の逆数に比例するように、上述のように、加減乗除の際の重みを設定してもよい。
このように設定することで、L0とL1との間について、勾配や輝度値等が線形に変化すると仮定した場合に、当該フレームの時間的な位置に適切な重み係数を設定することができる。また、重み係数に対応したBDOF処理の適用条件を設定することで、適切な重み係数を常に用いることを保証することができる。
第3に、予測信号生成部111Dは、上記で求めた勾配及び補正MVを用いて、各画素についての輝度値補正量「bdofOffset」について、例えば、以下のように算出する。
bdofOffset=vx×(weightL0×gradientHL0―weightL1×gradientHL1)+vy×(weightL0×gradientVL0―weightL1×gradientVL1)
第4に、予測信号生成部111Dは、例えば、非特許文献1に記載のように、「bdofOffset」を用いて、各画素の補正後の輝度値の予測値を算出することができる。
すなわち、予測信号生成部111Dは、BDOF処理において、2つの参照フレーム(L0/L1)の画素値同士又は2つの参照フレーム(L0/L1)の画素値から算出した値同士を用いて演算する場合の重み係数に基づいて、上述の適用条件に2つの参照フレームと当該フレームとの時間的な距離に関する条件を備えるように構成されている。
BDOF処理が実施された後、本処理手順は、ステップS85に移り処理を終了する。
ステップS84では、当該ブロックが、双予測を行うブロックであった場合、予測信号生成部111Dは、ステップS81で生成したL0及びL1の予測信号を合成して最終的な予測信号を生成する。具体的な合成方法については、既知の手法を用いることができるため、詳細は省略する。当該ブロックが、片予測を行うブロックであった場合は、予測信号生成部111Dは、ステップS81で生成した予測信号をそのまま最終的な予測信号とする。
予測信号生成部111Dは、以上の手順で最終的な予測信号を生成した後に、ステップS85へ移り処理を終了する。
アフィン動きベクトル算出部111Eは、動きベクトル探索部111Aにて当該ブロックでアフィン動き補償を行うと決定した場合に、動きベクトル符号化部111Bで符号化したコントロールポイント動きベクトルに基づいて当該ブロックを分割したサブブロック毎の動きベクトルを算出するように構成されている。
図9は、アフィン動きベクトル算出部111Eの処理手順の一例を示すフローチャートである。
図9に示すように、ステップS91において、アフィン動きベクトル算出部111Eは、「dHorX」、「dHorY」、「dVerX」及び「dVerY」の計4つのパラメータの値を計算する。
ここで、アフィン動きベクトル算出部111Eは、パラメータの計算には、動きベクトル符号化部111Bで符号化したコントロールポイント動きベクトルの値を用いる。
コントロールポイント動きベクトルは、上述のように、ブロック毎に2つ又は3つ存在する。図10に、コントロールポイント動きベクトルが3つ(「CPMV0」、「CPMV1」、「CPMV2」)である場合の例を示す。
ここで、図10において、実線が、当該ブロックの境界を示し、点線が、当該ブロックを分割したサブブロックの境界を示し、実線の矢印が、コントロールポイント動きベクトルを示し、点線の矢印が、各サブブロックの動きベクトルを示している。
コントロールポイント動きベクトルが、2つである場合は、図10のCPMV0とCPMV1のみが存在する状態である。コントロールポイント動きベクトルの値から、「dHorX」、「dHorY」、「dVerX」及び「dVerY」の計4つのパラメータの値を計算する具体的な方法は、既知の手法を用いることができるため、詳細についての説明は省略する。
ステップS92において、アフィン動きベクトル算出部111Eは、「fallbackMode」を当該ブロックに適用するかどうかを決定する。
ここで、「fallbackMode」は、当該ブロックを分割した全てのサブブロックにおいて、同一の動きベクトルを用いるモードである。「fallbackMode」の判定方法は、既知の手法を用いることができるため、詳細についての説明は省略する。「fallbackMode」を当該ブロックに適用する場合は、本処理手順は、ステップS93に進み、「fallbackMode」を当該ブロックに適用しない場合は、本処理手順は、ステップS94へ進む。
ステップS93では、アフィン動きベクトル算出部111Eは、「fallbackMode」を用いる場合の各サブブロックの動きベクトルを算出する。
上述の通り、「fallbackMode」の場合は、同一ブロック内の全てのサブブロックの動きベクトルの値は、同じになる。具体的な算出方法は、既知の手法を用いることができるため、詳細についての説明は省略する。
例えば、非特許文献1では、上述の「dHorX」、「dHorY」、「dVerX」及び「dVerY」の値と、当該ブロックの左上の座標を原点としたときのブロック中央の座標値(当該ブロックの高さと幅をそれぞれ「1/2」にした値)とを予め定めたモデルに代入し、動きベクトルを算出している。本処理手順は、ステップS93が完了した後、ステップS97へ移り処理を終了する。
ステップS94において、アフィン動きベクトル算出部111Eは、「fallbackMode」を適用しない場合の各サブブロックの動きベクトルを算出する。具体的な算出方法は、既知の手法を用いることができるため、詳細についての説明は省略する。
例えば、非特許文献1では、「dHorX」、「dHorY」、「dVerX」及び「dVerY」の値と、当該ブロックの左上の座標を原点としたときの各サブブロック中央の座標値とを予め定めたモデルに代入し、動きベクトルを算出している。本処理手順は、ステップS94が終了した後、ステップS95へ移る。
ステップS95において、アフィン動きベクトル算出部111Eは、当該ブロックでPROF処理を適用する条件が満足されているか否かについて判定する。
適用条件は、「sps_affine_prof_enabled_flag」の値が「1」であることという条件を含んでもよい。
また、適用条件は、「slice_disable_bdof_dmvr_prof_flag」の値が当該スライスにおいてPROF処理を使用可能であるということを示していること(例えば、当該フラグの値が「0」であること)という条件を含んでもよい。
さらに、適用条件は、当該ブロックに「fallbackMode」が適用されないことという条件を含んでもよい。
アフィン動きベクトル算出部111Eは、全ての適用条件が満足されていると判定するとき、当該ブロックにPROF処理を適用すると決定し、本処理手順は、ステップS96へ進む。それ以外の場合は、当該ブロックにPROF処理を適用しないと決定し、本処理手順は、ステップS97へ移り処理を終了する。
以上では、アフィン動きベクトル算出部111Eが、全ての適用条件が満足されているか否かについて判定する例を示したが、アフィン動きベクトル算出部111Eは、論理的に等価な別の方法で判定してもよい。
具体的には、上述の適用条件を全て反転させ、PROF処理を適用しない条件として定義し、アフィン動きベクトル算出部111Eは、どれか1つでも適用しない条件に当てはまる場合は、当該ブロックにPROF処理を適用しないと決定して、ステップS97へ進み、いずれにも当てはまらない場合は、当該ブロックにPROF処理を適用すると決定して、ステップS96へ進んでもよい。
上述の例に対応するPROF処理を適用しない条件は、以下のように定義できる。
かかる適用しない条件は、「sps_affine_prof_enabled_flag」の値が「0」であることという条件を含んでもよい。
また、かかる適用しない条件は、「slice_disable_bdof_dmvr_prof_flag」の値が当該スライスにおいてPROF処理を使用禁止であるということを示していること(例えば、当該フラグの値が「1」であること)という条件を含んでもよい。
さらに、かかる適用しない条件は、当該ブロックに「fallbackMode」が適用されることという条件を含んでもよい。
ステップS96において、アフィン動きベクトル算出部111Eは、PROF処理で用いる「diffMV」の値を算出する。「diffMV」の値は、例えば、各サブブロックの左上の座標を原点としたときの各画素位置について算出される。なお、当該ブロック内の各サブブロックのサイズが同じ場合(例えば、4×4画素)は、1つのサブブロック分の各画素位置についての「diffMV」を算出すれば、他のサブブロックでは、その値を流用することができる。
「diffMV」については、例えば、以下のように算出できる。
diffMV[x][y][0]=x×(dHorX<<2)+y×(dVerX<<2)-posOffsetX
diffMV[x][y][1]=x×(dHorY<<2)+y×(dVerY<<2)-posOffsetY
ここで、x、yは、各サブブロックの左上の座標を原点としたときの各画素位置(x,y)を意味し、[0]は、「diffMV」のx方向成分を意味し、[1]は、「diffMV」のy方向成分を意味している。
なお、以下の関係が成立する。
posOffsetX=6×dHorX+6×dVerX
posOffsetY=6×dHorY+6×dVerY
この後、アフィン動きベクトル算出部111Eは、非特許文献1に記載のように、右シフト及びクリッピング処理を行う。
「diffMV」が算出された後、本処理手順は、ステップS97へ移り処理を終了する。
以上の説明は、当該ブロックのうち1つの参照フレームについての処理である。例えば、参照フレームを2つ持つ双予測の場合は、L0及びL1について、上述のステップS91~S97の処理がそれぞれ実行される。よって、PROF処理の適用有無の判定結果や「diffMV」の算出結果は、L0及びL1について、それぞれ異なる可能性がある。
図11は、アフィン予測信号生成部111Fの処理の一例を示すフローチャートである。
アフィン予測信号生成部111Fは、「slice_disable_bdof_dmvr_prof_flag」が、スライスヘッダに対応するスライス内において、PROF処理が使用可であることを示す場合(フラグの値が「0」である場合)にPROF処理を行い、PROF処理が使用不可であることを示す場合(フラグの値が「0」である場合)にPROF処理を行わずに予測信号を生成するように構成されている。
なお、アフィン予測信号生成部111Fは、スライスヘッダに、「slice_disable_bdof_dmvr_prof_flag」が含まれていない場合、かかるフラグが使用可を示す(フラグの値が「0」である)と暗黙的に解釈して処理を行うように構成されていてもよい。
ステップS111において、アフィン予測信号生成部111Fは、予測信号を生成する。
具体的には、アフィン予測信号生成部111Fは、アフィン動きベクトル算出部111Eで算出されたサブブロック毎の動きベクトルを入力として、かかる動きベクトルが指す位置が非整数画素位置の場合は、参照フレームの画素値にフィルタを適用して非整数画素位置の画素を内挿する。ここで、具体的なフィルタについては、非特許文献1で開示されている最大6タップの水平垂直可分型のフィルタを適用することができる。
当該ブロックが双予測を行うブロックである場合は、アフィン予測信号生成部111Fは、L0及びL1の予測信号の両方を生成する。
ステップS112において、アフィン予測信号生成部111Fは、当該ブロックの当該予測方向(L0又はL1)において、PROF処理を適用するか否かについて判定する。かかる判定には、上述のステップS95での判定結果がそのまま用いられる。
当該ブロックの当該予測方向にPROF処理を適用すると判定された場合は、本処理手順は、ステップS113へ進む。一方、当該ブロックの当該予測方向にPROF処理を適用しないと判定された場合は、本処理手順は、ステップS114へ進む。
ステップS113において、アフィン予測信号生成部111Fは、PROF処理を実行する。PROF処理の具体的な処理は、既知の手法を用いることができるため、詳細は省略する。アフィン予測信号生成部111Fは、PROF処理により予測信号の補正を行う。
ステップS114において、アフィン予測信号生成部111Fは、当該ブロックが双予測を行うブロックであった場合、ステップS111で生成したL0とL1の予測信号、又は、かかる予測信号をステップS113で補正した予測信号を合成して、最終的な予測信号を生成する。具体的な合成方法については、既知の手法を用いることができるため、詳細は省略する。アフィン予測信号生成部111Fは、当該ブロックが片予測を行うブロックであった場合は、ステップS111で生成した予測信号、又は、かかる予測信号をステップS113で補正した予測信号を、そのまま最終的な予測信号とする。
最終的な予測信号の生成が完了した後、本処理手順は、ステップS115へ移り処理を終了する。
以上の例では、便宜上、予測信号生成部111Dとアフィン予測信号生成部111Fとを異なる処理ブロックとして説明したが、これらの一部の処理は、共通化可能であり、単一の処理ブロックとすることもできる。
例えば、ステップS81及びS111、並びに、ステップS84及びステップS114は、同一の処理とみなすことができる。
この場合、図8のステップS82でNoと判定された後に、図10のステップS112、S113及びS114を順に実行するようにすれば、図8及び図10のフローチャートを統合して単一の処理ブロックとみなすことができる。この時、BDOF処理及びPROF処理は、ブロック単位で排他的に適用されることとなる。
(インループフィルタ処理部150)
以下において、本実施形態に係るインループフィルタ処理部150について説明する。図12は、本実施形態に係るインループフィルタ処理部150を示す図である。
図12に示すように、インループフィルタ処理部150は、ブロック境界検出部151と、境界強度判定部153と、フィルタ決定部154と、フィルタ処理部155とを有する。
ここで、末尾に「A」が付されている構成は、垂直方向のブロック境界に対するデブロッキングフィルタ処理に関する構成であり、末尾に「B」が付されている構成は、水平方向のブロック境界に対するデブロッキングフィルタ処理に関する構成である。
以下、垂直方向のブロック境界に対するデブロッキングフィルタ処理が行われた後に、水平方向のブロック境界に対するデブロッキングフィルタ処理が行われるケースについて例示する。
デブロッキングフィルタ処理は、上述したように、符号化ブロックに対して適用されてもよく、予測ブロックに対して適用されてもよく、変換ブロックに対して適用されてもよい。また、デブロッキングフィルタ処理は、上記の各ブロックを分割したサブブロックに適用されてもよい。すなわち、対象ブロック及び隣接ブロックは、符号化ブロックであってもよく、予測ブロックであってもよく、変換ブロックであってもよく、これらを分割したサブブロックでもよい。
サブブロックの定義には、洗練化部111C及び予測信号生成部111Dの処理単位として説明したサブブロックが含まれる。また、サブブロックの定義には、アフィン動きベクトル算出部111E及びアフィン予測信号生成部111Eの処理単位として説明したサブブロックが含まれる。サブブロックにデブロッキングフィルタを適用する場合は、適宜、以下の説明のブロックをサブブロックに読み替えることができる。
垂直方向のブロック境界に対するデブロッキングフィルタ処理及び水平方向のブロック境界に対するデブロッキングフィルタ処理は、同様の処理であるため、以下においては、垂直方向のブロック境界に対するデブロッキングフィルタ処理について説明する。
ブロック境界検出部151Aは、ブロックサイズを示す制御データに基づいて、ブロックの境界を検出するように構成されている。ここで、ブロックは、符号化ブロック(CU)、予測ブロック(PU)、変換ブロック(TU)である。具体的な検出方法は、既知の手法が適用可能なため、詳細の説明は省略する。
境界強度判定部153Aは、対象ブロックと隣接ブロックとのブロック境界の境界強度を判定するように構成されている。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックがイントラ予測ブロックであるか否かについて示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの少なくともいずれか1つのブロックがイントラ予測ブロックである場合(すなわち、ブロック境界の両側のブロックの少なくともいずれかがイントラ予測ブロックである場合)に、ブロック境界の境界強度が「2」であると判定ように構成されていてもよい。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックに非零(ゼロ)の直交変換係数が含まれるか否か及びブロック境界が変換ブロックの境界であるか否かについて示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの少なくともいずれか1つのブロックが非零の直交変換係数を含み、かつ、ブロック境界が変換ブロックの境界である場合(すなわち、ブロック境界の両側のブロックの少なくともいずれかに非零の変換係数が存在し、TUの境界である場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上であるか否かについて示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合(すなわち、ブロック境界の両側のブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの予測で参照される参照ブロックが異なるか否かについて示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの予測で参照される参照ブロックが異なる場合(すなわち、ブロック境界の両側のブロックで参照画像が異なる場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの数が異なるか否かについて示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの数が異なる場合(すなわち、ブロック境界の両側のブロックで動きベクトルの数が異なる場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
例えば、図13に示すように、境界強度判定部153Aは、上述した条件がいずれも満たされない場合に、ブロック境界の境界強度が「0」であると判定するように構成されていてもよい。
なお、境界強度の値が大きいほど、ブロック境界で生じるブロック歪みが大きい可能性が高い。
上述の境界強度判定方法は、輝度信号及び色差信号に対して、共通の方法で判定してもよいし、一部異なる条件を用いて判定してもよい。
フィルタ決定部154Aは、ブロック境界に適用するフィルタ処理(例えば、デブロッキングフィルタ処理)の種類を決定するように構成されている。
例えば、フィルタ決定部154Aは、ブロック境界の境界強度や、対象ブロック及び隣接ブロックに含まれる量子化パラメータ等に基づいて、ブロック境界に対して、フィルタ処理を適用するか否か、弱フィルタ処理及び強フィルタ処理のいずれのフィルタ処理を適用するかについて決定するように構成されていてもよい。
フィルタ決定部154Aは、ブロック境界の境界強度が「0」である場合に、フィルタ処理を適用しないと決定するように構成されていてもよい。
フィルタ処理部155Aは、フィルタ決定部154Aの決定に基づいて、デブロッキング前画像に対する処理を行うように構成されている。デブロッキング前画像に対する処理は、フィルタ処理無し、弱フィルタ処理、強フィルタ処理等である。
(画像復号装置200)
以下、図14を参照して、本実施形態に係る画像復号装置200について説明する。図14は、本実施形態に係る画像復号装置200の機能ブロックの一例について示す図である。
図14に示すように、画像復号装置200は、復号部210と、逆変換・逆量子化部220と、加算器230と、インター予測部241と、イントラ予測部242と、インループフィルタ処理部250と、フレームバッファ260とを有する。
復号部210は、画像符号化装置100によって生成される符号化データを復号し、係数レベル値を復号するように構成されている。
ここで、例えば、復号は、符号化部140で行われるエントロピー符号化とは逆の手順のエントロピー復号である。
また、復号部210は、符号化データの復号処理によって制御データを取得するように構成されていてもよい。
なお、上述したように、制御データは、符号化ブロックサイズ、予測ブロックサイズ、変換ブロックサイズ等のサイズデータを含んでもよい。
また、上述したように、制御データは、シーケンスパラメータセット(SPS)、ピクチャパラメータセット(PPS)、スライスヘッダ等のヘッダ情報を含んでもよい。
例えば、復号部210は、スライスヘッダから、PROF処理の使用可否を制御するフラグ、或いは、DMVR処理、BDOF処理、PROF処理の使用可否を一括して制御するフラグ等を復号するように構成されていてもよい。
逆変換・逆量子化部220は、復号部210から出力される係数レベル値の逆変換処理を行うように構成されている。ここで、逆変換・逆量子化部220は、逆変換処理に先立って、係数レベル値の逆量子化を行うように構成されていてもよい。
ここで、逆変換処理及び逆量子化は、変換・量子化部131で行われる変換処理及び量子化とは逆の手順で行われる。
加算器230は、逆変換・逆量子化部220から出力される予測残差信号に予測信号を加算してフィルタ処理前復号信号を生成し、フィルタ処理前復号信号をイントラ予測部242及びインループフィルタ処理部250に出力するように構成されている。
ここで、フィルタ処理前復号信号は、イントラ予測部242で用いる参照ブロックを構成する。
インター予測部241は、インター予測部111と同様に、インター予測(フレーム間予測)によって予測信号を生成するように構成されている。
具体的には、インター予測部241は、符号化データから復号した動きベクトルと参照フレームに含まれる参照信号とに基づいて予測信号を予測ブロック毎に生成するように構成されている。インター予測部241は、予測信号を加算器230に出力するように構成されている。
イントラ予測部242は、イントラ予測部112と同様に、イントラ予測(フレーム内予測)によって予測信号を生成するように構成されている。
具体的には、イントラ予測部242は、対象フレームに含まれる参照ブロックを特定し、特定された参照ブロックに基づいて予測信号を予測ブロック毎に生成するように構成されている。イントラ予測部242は、予測信号を加算器230に出力するように構成されている。
インループフィルタ処理部250は、インループフィルタ処理部150と同様に、加算器230から出力されるフィルタ処理前復号信号に対してフィルタ処理を行うとともに、フィルタ処理後復号信号をフレームバッファ260に出力するように構成されている。
ここで、例えば、フィルタ処理は、ブロック(符号化ブロック、予測ブロック、変換ブロック或いはそれらを分割したサブブロック)の境界部分で生じる歪みを減少するデブロッキングフィルタ処理である。
フレームバッファ260は、フレームバッファ160と同様に、インター予測部241で用いる参照フレームを蓄積するように構成されている。
ここで、フィルタ処理後復号信号は、インター予測部241で用いる参照フレームを構成する。
(インター予測部241)
以下、図15を参照して、本実施形態に係るインター予測部241について説明する。図15は、本実施形態に係るインター予測部241の機能ブロックの一例について示す図である。
図15に示すように、インター予測部241は、動きベクトル復号部241Bと、洗練化部241Cと、予測信号生成部241Dと、アフィン動きベクトル算出部241Eと、アフィン予測信号生成部241Fとを有する。
インター予測部241は、動きベクトルに基づいて予測ブロックに含まれる予測信号を生成するように構成されている予測部の一例である。
動きベクトル復号部241Bは、画像符号化装置100から受信する制御データの復号によって動きベクトルを取得するように構成されている。
また、動きベクトル復号部241Bは、当該ブロックにアフィン動き補償を用いるか否かに関する情報も復号するように構成されている。
ここで、当該ブロックにアフィン動き補償を用いない場合は、洗練化処理部241Cと予測信号生成部241Dの処理を、当該ブロックにアフィン動き補償を用いる場合はアフィン動きベクトル算出部241Eとアフィン予測信号生成部241Fの処理を行う。
洗練化部241Cは、洗練化部111Cと同様に、動きベクトルを修正する洗練化処理を実行するように構成されている。
予測信号生成部241Dは、予測信号生成部111Dと同様に、動きベクトルに基づいて予測信号を生成するように構成されている。
アフィン動きベクトル算出部241Eは、アフィン動きベクトル算出部111Eと同様に、動きベクトル復号部241Bで復号されたコントロールポイント動きベクトルを用いて、各サブブロックの動きベクトルを算出するように構成されている。
アフィン予測信号生成部241Fは、アフィン予測信号生成部111Fと同様に、アフィン動きベクトル算出部241Eで算出された各サブブロックの動きベクトルを用いて予測信号を及びとアフィン予測信号生成部241Fは、予測信号生成部111D及びアフィン予測信号生成部111Fと同様に、同一の処理ブロックに統合することもできる。
(インループフィルタ処理部250)
以下において、本実施形態に係るインループフィルタ処理部250について説明する。図16は、本実施形態に係るインループフィルタ処理部250を示す図である。
図16に示すように、インループフィルタ処理部250は、ブロック境界検出部251と、境界強度判定部253と、フィルタ決定部254と、フィルタ処理部255とを有する。
ここで、末尾に「A」が付されている構成は、垂直方向のブロック境界に対するデブロッキングフィルタ処理に関する構成であり、末尾に「B」が付されている構成は、水平方向のブロック境界に対するデブロッキングフィルタ処理に関する構成である。
ここでは、垂直方向のブロック境界に対するデブロッキングフィルタ処理が行われた後に、水平方向のブロック境界に対するデブロッキングフィルタ処理が行われるケースについて例示する。
デブロッキングフィルタ処理は、上述したように、符号化ブロックに対して適用されてもよく、予測ブロックに対して適用されてもよく、変換ブロックに対して適用されてもよい。また、デブロッキングフィルタ処理は、上述の各ブロックを分割したサブブロックに適用されてもよい。すなわち、対象ブロック及び隣接ブロックは、符号化ブロックであってもよく、予測ブロックであってもよく、変換ブロックであってもよく、これらを分割したサブブロックでもよい。
垂直方向のブロック境界に対するデブロッキングフィルタ処理及び水平方向のブロック境界に対するデブロッキングフィルタ処理は、同様の処理であるため、以下においては、垂直方向のブロック境界に対するデブロッキングフィルタ処理について説明する。
ブロック境界検出部251Aは、ブロック境界検出部151Aと同様に、ブロックサイズを示す制御データに基づいて、ブロックの境界を検出するように構成されている。
境界強度判定部253Aは、境界強度判定部153Aと同様に、対象ブロックと隣接ブロックとのブロック境界の境界強度を判定するように構成されている。ブロック境界の境界強度の判定方法は、上述した通りである。
フィルタ決定部254Aは、フィルタ決定部154Aと同様に、ブロック境界に適用するデブロッキングフィルタ処理の種類を決定するように構成されている。デブロッキングフィルタ処理の種類の決定方法は、上述した通りである。
フィルタ処理部255Aは、フィルタ処理部155Aと同様に、フィルタ決定部254Aの決定に基づいて、デブロッキング前画像に対する処理を行うように構成されている。デブロッキング前画像に対する処理は、フィルタ処理無し、弱フィルタ処理、強フィルタ処理等である。
(変更例1)
以下、図17及び図18を参照して、上述の実施形態の変更例1について説明する。以下においては、上述の実施形態に対する相違点について主として説明する。上述の実施形態では、BDOF処理及びPROF処理について、それぞれ詳細な説明を省略したが、本変更例では、具体的な処理の一例について説明する。
第1に、ステップS83のBDOF処理の具体例について、図17を用いて説明する。
図17に示すように、ステップS171において、予測信号生成部111D/241Dは、BDOF処理を適用するブロック又はサブブロックに対応するL0及びL1の参照ブロック内の各画素について、水平方向及び垂直方向の輝度値勾配をそれぞれ算出する。
具体的には、予測信号生成部111D/241Dは、ブロック内の各画素位置(x,y)について、以下の式で、上述の勾配を算出する。
gradientHL0[x][y]=(predSamplesL0[hx+1][vy]>>shift1)-(predSamplesL0[hx-1][vy]>>shift1)
gradientV0[x][y]=(predSamplesL0[hx][vy+1>shift1)-(predSamplesL0[hx][vy-1]>>shift1)
gradientHL1[x][y]=(predSamplesL1hx+1][vy]>>shift1)-(predSamplesL1[hx-1][vy]>>shift1)
gradientV1[x][y]=(predSamplesL1[hx][vy+1]>shift1)-(predSamplesL0[hx][vy-1]>>shift1)
ここで「predSamplesL0」及び「predSamplesL1」は、ステップS81で算出したL0及びL1の予測信号である。また、[hx]及び[vy]は、以下の式で定義されている。
以下の式において、「nCbW」は、当該ブロックの幅であり、「nCbH」は、当該ブロックの高さであり、「Clip3(min,max,input)は、「input」の値を「min≦input≦max」となるようにクリップする関数である。
hx=Clip3(1,nCbW,x)
hy=Clip3(1,nCbH,y)
なお、「shift1」は、以下の式によって定義されている。
shift1=Max(6,bitDepth-6)
ここで、「bitDepth」は、画素値の処理を行う際のビット深度である。
ステップS172において、予測信号生成部111D/241Dは、補正MVを算出する。
ここで、第1に、予測信号生成部111D/241Dは、以下の3つのパラメータの値を、当該ブロック又はサブブロックの各画素について算出する。
diff[x][y]=(predSamplesL0[hx][vy]>>shift2)-(predSamplesL1[hx][vy]>>shift2)
tempH[x][y]=(gradientHL0[x][y]+gradientHL1[x][y])>>shift3
tempV[x][y]=(gradientVL0[x][y]+gradientVL1[x][y])>>shift3
ここで、「shift2」及び「shift3」は、以下の式によって定義されている。
shift2=Max(4,bitDepth-8)
shift3=Max(3,15-bitDepth)
第2に、予測信号生成部111D/241Dは、当該ブロック又はサブブロックを4×4画素ブロックに分割し、下記の通り、各4×4画素ブロック毎に、パラメータを算出する。
ここで、「xSb」及び「yXb」は、当該ブロック又はサブブロックの左上の画素を原点としたときの各4×4画素ブロックの左上の画素の座標である。また、「Sign(input)」は、「input」の値が正の場合は「1」を返し、「input」の値が負の場合は「-1」を返し、「input」の値が「0」の場合は「0」を返す関数である。
予測信号生成部111D/241Dは、以下の通り、上述のように算出した値を用いて、補正MV(vx,vy)を算出する。
vx=sGx2>0 ? Clip3(-mvRefineThres,mvRefineThres-1,-(sGxdI<<3)>>Floor(Log2(sGx2))):0
vy=sGx2>0 ? Clip3(-mvRefineThres,mvRefineThres-1,((sGydI<<3)-((vx×sGxGym)<<12+vx×sGxGys)>>1)>>Floor(Log2(sGx2))):0
ここで、「mvRefineThres」は、以下の式によって定義されている。
mvRefineThres=1<<Max(5,bitDepth-7)
以上の構成とすることで、補正MV(vx,vy)の各成分のビット幅を、符号込みで「1<<Max(5,bitDepth-7)+1」ビット以内に抑えることができる。
ステップS173において、予測信号生成部111D/241Dは、以下の通り、各画素の予測信号を補正する。
bdofOffset=(vx×(gradientHL0[x+1][y+1]-gradientHL1[x+1][y+1]))>>1+(vy×(gradientVL0[x+1][y+1]-gradientVL1[x+1][y+1]))>>1
pbSamples[x][y]=Clip3(0,(2bitDepth)-1,(predSamplesL0[x+1][y+1]+offset4+predSamplesL1[x+1][y+1]+bdofOffset)>>shift4)
ここで、「offset4」及び「shift4」は、以下の式によって定義されている。
offset4=1<<(shift4-1)
shift4=Max(3,15-bitDepth)
予測信号生成部111D/241Dは、以上の処理を全て行った後、ステップS174に進み処理を終了する。
次に、ステップS113のPROF処理について、図18を用いて具体例を説明する。
図18に示すように、ステップS181において、アフィン予測信号生成部111F/241Fは、PROF処理を適用するL0及びL1の参照ブロック内の各画素について、水平方向及び垂直方向の輝度値勾配をそれぞれ算出する。
具体的には、アフィン予測信号生成部111F/241Fは、以下の式で、ブロック内の各画素位置(x,y)について勾配を算出する。
gradientH[x][y]=(predSamples[x+2][y]>>shift1)-(predSamples[x][y]>>shift1)
gradientV[x][y]=(predSamples[x][y+2]>>shift1)-(predSamples[x][y]>>shift1)
ここで、「predSamples」は、ステップS111で生成したL0又はL1の予測信号である。ここで、
shift1=Max(6,bitDepth-6)
とする。
アフィン予測信号生成部111F/241Fは、L0及びL1の両方にPROF処理を適用する場合は、上述の「gradientH」及び「gradientV」を、L0とL1のそれぞれについて算出する。この場合、ステップS181での計算内容は、画素単位で見るとステップS171の計算内容と完全に同一となる。
ステップS182において、アフィン予測信号生成部111F/241Fは、補正MVを計算する。かかる処理は、実際はステップS96としてアフィン動きベクトル算出部111E/241Eの内部で行われるが、便宜上、ステップS182において行われるものとして説明する。実際は、アフィン予測信号生成部111F/241Fは、ステップS96で算出された値をそのまま用いればよい。
第1に、アフィン予測信号生成部111F/241Fは、上述のステップS96の説明の場合と同様に、「diffMv」の値を算出する。
diffMv[x][y][0]=x×(dHorX<<2)+y×(dVerX<<2)-posOffsetX
diffMv[x][y][1]=x×(dHorY<<2)+y×(dVerY<<2)-posOffsetY
第2に、アフィン予測信号生成部111F/241Fは、上述の「diffMv」の値を、それぞれ7ビットだけ右にシフトする。
第3に、アフィン予測信号生成部111F/241Fは、以下のように、クリッピング処理を行う。
diffMv[x][y][i]=Clip3(-dmvLimit,dmvLimit-1,diffMv[x][y][i])
ここで、
dmvLimit=1<<Max(5,bitDepth-7)
である。
以上のような構成とすることで、「diffMv」の各成分のビット幅を、符号込みで「1<<Max(5,bitDepth-7)+1」ビット以内に抑えることができる。これは、ステップS172で算出した補正MVと同一のビット幅である。
ステップS183において、アフィン予測信号生成部111F/241Fは、予測信号の補正を行う。
以下のように、アフィン予測信号生成部111F/241Fは、PROF処理を適用するブロック及び予測方向について予測信号「pbSamples」の値を補正する。
dI=gradientH[x][y]×diffMv[x][y][0]+gradientV[x][y]×diffMv[x][y][1]
pbSamples[x][y]=predSamples[x+1][y+1]+(dI>>1)
アフィン予測信号生成部111F/241Fは、L0及びL1の両方でPROF処理を適用する場合は、上述の処理をL0及びL1のそれぞれについて実行する。
アフィン予測信号生成部111F/241Fは、上述の補正が完了した後、ステップS184へ移動してPROF処理を終了する。
アフィン予測信号生成部111F/241Fは、PROF処理の完了後は、ステップS114で説明した予測値合成処理を実行する。予測値の合成は、例えば、以下の式で実行できる。
predSamples[x][y]=Clip3(0,(1<<bitDepth)-1,(predSamplesL0[x][y]+predSamplesL1[x][y]+offset2)>>shift2)
ここで、
offset2=1<<(shift2-1)
shift2=Max(3,15-bitDepth)
である。
なお、さらにL0側の予測信号「predSamplesL0」及びL1側の予測信号「predSamplesL1」の両方がPROF処理によって補正されていた場合、「predSamplesL0」及び「predSamplesL1」に、ステップS183の計算を代入すると、以下のように変形できる。
dI#Bi=(dI#L0>>1)+(dI#L1>>1)
pbSamples[x][y]=Clips(0,(1<<bitDepth)-1,(predSamplesL0#orig[x][y]+offset2+predSamplesL1#orig[x][y]+dI#Bi)>>shift2)
ここで、「dI#L0」及び「dI#L1」は、それぞれL0及びL1のdIの値であり、「predSamplesL0#orig」及び「predSamplesL1#orig」は、PROF処理による補正前の予測信号である。
以上で説明したBDOF処理及びPROF処理で算出される勾配及び補正MVの値は、それぞれビット幅が同一になるようにクリッピングされているため、そこから算出した「bdofOffset」及び「dI#Bi」のビット幅も同一となる。
すなわち、予測信号生成部予測信号生成部111D/241Dによって行われるBDOF処理中で算出するオフセット量及びアフィン予測信号生成部111F/241Fによって行われるPROF処理中で2つの参照フレーム(L0/L1)についてそれぞれ算出したオフセット量の合成後の値のビット幅が同一となるように演算してもよい。
また、PROF処理後の予測信号を合成する際の「offset2」及び「shift2」の値と、BDOF処理の「offset4」及び「shift4」の値も同一である。よって、BDOF処理時及びPROF処理を、L0及びL1の両方に適用した場合の予測値生成処理は、完全に同一の式となる。
BDOF処理及びPROF処理を、以上のような構成とすることで、以下の通りとなる。
第1に、ステップS171及びステップS181の勾配算出処理を全く同じ処理とすることができる。
すなわち、予測信号生成部111D/241Dによって行われるBDOF処理中の勾配算出処理及びアフィン予測信号生成部111F/241Fによって行われるPROF処理中の勾配算出処理を、PROF処理が2つの参照フレーム(L0/L1)の両方に適用された場合に同一の処理とすることができる。
第2に、ステップS172及びステップS182の出力である補正MVのビット幅を全く同一とすることができる。
すなわち、予測信号生成部111D/241Dによって行われるBDOF処理中の補正MV量及びアフィン予測信号生成部111F/241Fによって行われるPROF処理中で用いる補正MV量が、それぞれ同一のビット幅になるようにそれぞれクリッピング処理を行うことができる。
第3に、ステップS173の予測値補正処理と、ステップS183及びステップS114の予測値補正及び予測値合成処理とを、全く同じ処理とすることができる。
すなわち、予測信号生成部111D/241Dによって行われるオフセット量を用いた最終的な予測信号生成処理及びアフィン予測信号生成部111F/241Fによって行われるオフセット量の合成後の値を用いた最終的な予測信号生成処理を同一の処理とすることができる。
BDOF処理及びPROF処理は、上述のように、ブロック毎に排他的に適用されるため、上述の同一の処理部分は、ハードウェア上で実装した場合に、BDOF処理及びPROF処理で、処理回路を共有することが可能になる。これにより、回路規模の削減が期待できる。
(変更例2)
以下、図19及び図20を参照して、上述の実施形態の変更例2について説明する。以下においては、上述の実施形態に対する相違点について主として説明する。本変更例では、ブロック境界検出部151/251でのブロック境界検出方法及び境界強度判定部153/253での境界強度の判定方法について、上述の実施形態とは異なる例を説明する。
以下では、ブロック境界検出部151Aについて説明するが、ブロック境界検出部151B/251A/251Bにおいても同様の処理でブロック境界を検出することができる。
図19は、ブロック境界検出部151Aの処理の一例を示すフローチャートである。以下、CU単位で処理を行う場合を例に説明する。
ステップS191において、ブロック境界検出部151Aは、CU境界を検出する。ブロック境界検出部151Aは、垂直方向の境界を検出する処理ブロックであるため、当該CUの左側の垂直方向の境界をフィルタリング処理対象のブロック境界として検出する。
なお、「ブロック境界として検出する」とは、例えば、画面内の当該画素位置が境界か否かについて示す二次元のフラグの配列(例えば、「edgeFalgs[x][y]」)を用意しておき、境界として検出した画素位置のフラグ値を「1」とし、そうでない画素位置のフラグ値を「0」とすることに相当する。
ここで、当該CUの左側の垂直方向の境界が、ピクチャ境界やスライス境界やタイル境界等の符号化単位の境界に位置する場合は、ブロック境界検出部151Aは、当該境界をブロック境界として検出しないこととしてもよい。
ブロック境界検出部151Aは、上記の手順で、CU境界を検出した後、ステップS192へ移る。
ステップS192において、ブロック境界検出部151Aは、TU境界(変換ブロック境界)を検出する。
ブロック境界検出部151Aは、当該CUの左側の垂直方向の境界を起点として、水平方向の座標を4画素ずつ、垂直方向の画素位置を1画素ずつ増加させながら、各画素位置がTU境界かどうかを確認する。当該画素位置が、TU境界であった場合、ブロック境界検出部151Aは、当該画素位置をブロック境界として検出する。
ブロック境界検出部151Aは、上記の手順で、TU境界を検出した後、ステップS193へ移る。
ステップS193において、ブロック境界検出部151Aは、サブブロック境界を検出する。
ステップS193で検出対象とするサブブロック境界は、例えば、インター予測を行ったCUのサブブロック境界としてもよい。
この時、上述のサブブロック境界には、洗練化部111C/241Cで実行されるDMVR処理におけるサブブロック(例えば、16×16画素サイズ)の境界、及び、アフィン動きベクトル算出部111E/241E及びアフィン予測信号生成部111F/241Fで行われるアフィン動き補償におけるサブブロック(例えば、4×4画素サイズ)の境界の両方が含まれてもよい。
ステップS193で検出対象とするサブブロック境界は、例えば、アフィン動き補償又は「merge#subblock」が適用されたCUのサブブロック境界としてもよい。
なお、アフィン動き補償のサブブロックは、当該CUでPROF処理が適用される場合は、PROF処理のサブブロックと一致する。
ここで、ステップS193でアフィン動き補償のサブブロック境界を検出対象とした場合、ブロック境界検出部151Aは、当該CUでPROF処理が適用される場合には、アフィン動き補償のサブブロック境界及びPROF処理のサブブロック境界を検出対象から除外してもよい。
すなわち、ブロック境界検出部151Aは、当該CUでアフィン動き補償が適用され且つ当該CUでPROF処理が適用されない場合のみ、アフィン動き補償のサブブロック境界を検出対象としてもよい。勿論、ブロック境界検出部151Aは、PROF処理が適用されるCUについても、アフィン動き補償のサブブロック境界及びPROF処理のサブブロック境界を検出対象としてもよい。
なお、ブロック境界検出部151Aは、双予測を行うブロックのサブブロック境界については、L0又はL1の少なくともいずれかでPROF処理が適用されているときに、「PROF処理が適用されるCU」とみなしてもよい。また、ブロック境界検出部151Aは、L0及びL1の両方でPROF処理が適用されているときのみ、「PROF処理が適用されるCU」とみなしてもよい。以下の説明においても同様に解釈できる。
ブロック境界検出部151Aは、当該CUの左側の垂直方向の境界を起点として、水平方向の座標を、以下の方法で算出したサブブロックサイズずつ、垂直方向の画素位置を1画素ずつ増加させながら、各画素位置がサブブロック境界かどうかを確認する。
ブロック境界検出部151Aは、当該画素位置がサブブロック境界であった場合、当該画素位置をブロック境界として検出する。ここで、ブロック境界検出部151Aは、当該位置がサブブロック境界であっても、当該CUにPROF処理が適用されている場合には、サブブロック境界として検出しないという処理としてもよい。
上記のサブブロックサイズは、例えば、以下のように算出できる。
サブブロックサイズ=Max(8,(nCbW/NumSbX))
ここで、「nCbW」は、当該CUの幅(水平方向の画素数)であり、「NumSbX」は、当該CU内の水平方向に含まれるサブブロックの数である。
上述の式が用いられて場合、サブブロック境界は、当該CUの左側の垂直方向の境界を起点として、最も細かい場合で水平方向に8画素おきの間隔でサブブロック境界かどうかを判定することとなる。
また、上述のサブブロックサイズは、例えば、以下のように算出してもよい。
サブブロックサイズ=Max(4,(nCbW/NumSbX))
この場合、サブブロック境界は、当該CUの左側の垂直方向の境界を起点として、最も細かい場合で水平方向に4画素おきの間隔でサブブロック境界かどうかを判定することとなる。
すなわち、ブロック境界検出部151Aは、対象ブロックの左端又は上端の座標を基準として、最小で4画素おきの間隔にて、対象画素位置がサブブロック境界であるかどうかについて判定するように構成されている。
ブロック境界検出部151Aは、以上の手順で、サブブロック境界を検出した後に、ステップS194へ移り処理を終了する。
以上では、CU境界、TU境界、サブブロック境界をそれぞれ区別せずに単純にブロック境界として検出する例を説明したが、それぞれを区別して記憶しておいてもよい。
例えば、CU境界、TU境界、サブブロック境界という区別で記憶してもよいし、TU境界、動きベクトル境界として区別してもよい。この時、CU境界は、TU境界及び動きベクトル境界の両方として検出される。また、TU境界は、TU境界として検出され、サブブロック境界は、動きベクトル境界として検出される。この区別は、例えば、下記の境界強度判定部153Aで用いることができる。
以下では、境界強度判定部153Aについて説明するが、境界強度判定部153B/253A/253Bにおいても全く同じ判定を行うことができる。
境界強度判定部153Aは、対象画素位置がブロック境界でない場合に、境界強度を「0」と判定するように構成されていてもよい。
すなわち、ブロック境界検出部151は、PROF処理が適用されたブロック内のサブブロックをブロック境界として検出しないように構成されており、境界強度判定部153Aは、ブロック境界として検出されなかった画素位置の境界強度を「0」と判定するように構成されており、フィルタ決定部154は、境界強度が「0」の場合には、ブロック境界にデブロッキングフィルタを適用しないと決定するように構成されていてもよい。
境界強度判定部153Aは、対象ブロック及び隣接ブロックがイントラ予測ブロックであるか否かを示す制御データに基づいてブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図20に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの少なくともいずれか1つのブロックがイントラ予測ブロックである場合(すなわち、ブロック境界の両側のブロックの少なくともいずれかがイントラ予測ブロックである場合)に、ブロック境界の境界強度が「2」であると判定ように構成されていてもよい。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックに非零(ゼロ)の直交変換係数が含まれるか否か及びブロック境界が変換ブロックの境界であるか否かを示す制御データに基づいてブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図20に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの少なくともいずれか1つのブロックが非零の直交変換係数を含み、かつ、ブロック境界が変換ブロックの境界である場合(すなわち、ブロック境界の両側のブロックの少なくともいずれかに非零の変換係数が存在し、TUの境界である場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上であるか否かを示す制御データに基づいてブロック境界の境界強度を判定するように構成されていてもよい。その際、当該のブロック境界がPROF処理を適用するブロック内のサブブロック境界であるかどうかに基づいてブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図20に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合(すなわち、ブロック境界の両側のブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合)、かつ、当該のブロック境界がステップS95においてPROF処理を適用すると判定されたブロックのサブブロック(4×4画素ブロック)境界ではない場合に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
すなわち、境界強度判定部153Aは、ブロック境界毎に境界強度を判定するように構成されており、かかるブロック境界の両側のブロックの動きベクトルの差の絶対値が1/2画素以上であり、且つ、かかるブロック境界がPROF処理が適用されたサブブロック境界ではない場合に、境界強度を「1」と判定するように構成されていてもよい。
ここで、フィルタ決定部154は、境界強度が「0」の場合には、ブロック境界にデブロッキングフィルタを適用しないと決定するように構成されていてもよい。
例えば、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合(すなわち、ブロック境界の両側のブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合)、かつ、当該のブロック境界の両側のブロックがステップS95においてPROF処理を適用すると判定されたブロックではない場合に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
例えば、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合(すなわち、ブロック境界の両側のブロックの動きベクトルの差の絶対値が閾値(例えば、1/2画素)以上である場合)、かつ、当該のブロック境界のうち少なくともどちらかのブロックがステップS95においてPROF処理を適用すると判定されたブロックではない場合に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
なお、双予測を行うブロックのサブブロック境界については、L0又はL1の少なくともいずれかでPROF処理が適用されているときに、「PROF処理を適用すると判定されたブロック」とみなしてもよい。すなわち、この場合はPROF処理がL0及びL1の両方で適用さなかった場合は、動きベクトルの差が閾値以上の場合は境界強度を「1」と判定する。
すなわち、境界強度判定部153Aは、対象ブロックが双予測である場合で且つ2つの参照フレームのうちの少なくともいずれか1つにPROF処理が適用された場合に、対象ブロックにPROF処理が適用されたとみなすように構成されていてもよい。
また、L0とL1の両方でPROF処理が適用されているときのみ、「PROF処理を適用すると判定されたブロック」とみなしてもよい。すなわち、この場合はPROF処理がL0又はL1のみで適用された場合で、且つ、動きベクトルの差が閾値以上の場合は、境界強度を「1」と判定する。
また、別の例として、PROF処理が適用されているブロック境界では、境界強度の判定において、動きベクトルの差を判定しない或いは動きベクトルの差を「0」とみなす、といった判定をすることもできる。具体例としては、以下のように判定できる。
当該ブロックが片予測を行うブロックで、且つ、当該ブロックでPROFが適用される場合、サブブロック境界における境界強度の判定では、動きベクトルの差を判定しない或いは動きベクトルの差を「0」とみなす。
当該ブロックが双予測を行うブロックで、且つ、L0側の参照フレーム及びL1側の参照フレームが異なる場合、L0側及びL1側のうち、PROFが適用される予測方向(L0のみ、L1のみ又は両方)において、動きベクトルの差を判定しない或いは動きベクトルの差を「0」とみなす。
当該ブロックが双予測を行うブロックで、且つ、L0側の参照フレーム及びL1側の参照フレームが同じフレームの場合、L0側でPROFが適用される場合に、当該サブブロック境界の両側のL0の動きベクトル同士の差を判定しない又は当該サブブロック境界の両側のL0の動きベクトル同士の差を「0」とみなす。
同様に、L1側でPROFが適用される場合に、当該サブブロック境界の両側のL1の動きベクトル同士の差を判定しない又は当該サブブロック境界の両側のL1の動きベクトル同士の差を「0」とみなす。
この場合、L0とL1との間の動きベクトルの差は、従来通り、境界強度の判定に用いられる。具体的には、例えば、当該サブブロック境界の左側のサブブロックのL0側の動きベクトルと当該サブブロック境界の右側のサブブロックのL1側の動きベクトルとの差は、境界強度の判定に用いられる。
すなわち、境界強度判定部153Aは、対象境界の両側ブロックの同一の予測方向同士の動きベクトルの差を判定する際、当該予測方向にPROF処理が適用された場合に、当該予測方向同士の動きベクトルの差を判定しない或いは当該予測方向同士の動きベクトルの差を「0」とみなすように構成されていてもよい。
または、当該ブロックが双予測を行うブロックで、且つ、L0側の参照フレームとL1側の参照フレームが同じフレームの場合、当該サブブロック境界の両側の動きベクトルがそれぞれPROFを適用する場合に、動きベクトルの差を判定しない或いは動きベクトルの差を「0」とみなすこともできる。
この場合、例えば、L0側及びL1側の両方でPROFが適用されている場合、L0とL1間の動きベクトルの差も判定しない或いはL0とL1間の動きベクトルの差を「0」とみなす点が、上述の例と異なる。
また、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの予測で参照される参照ブロックが異なるか否かを示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図20に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの予測で参照される参照ブロックが異なる場合(すなわち、ブロック境界の両側のブロックで参照画像が異なる場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの数が異なるか否かを示す制御データに基づいて、ブロック境界の境界強度を判定するように構成されていてもよい。
例えば、図20に示すように、境界強度判定部153Aは、対象ブロック及び隣接ブロックの動きベクトルの数が異なる場合(すなわち、ブロック境界の両側のブロックで動きベクトルの数が異なる場合)に、ブロック境界の境界強度が「1」であると判定するように構成されていてもよい。
以上では、動きベクトルや参照ブロックを用いて境界強度を判定する方法の例について説明したが、動きベクトルや参照ブロックを用いた判定を行うのは、上述のCU境界、サブブロック境界又は動きベクトル境界として検出されたブロック境界のみとしてもよい。
つまり、TU境界であって、サブブロック境界や動きベクトル境界ではないブロック境界においては、動きベクトルや参照ブロックを用いた判定をスキップするようにしてもよい。この時、TU境界では、境界の両側のブロックの少なくともいずれかに、非零の直交変換係数が存在するか否かのみを確認することとなる。
例えば、図20に示すように、境界強度判定部153Aは、上述した条件がいずれも満たされない場合に、ブロック境界の境界強度が「0」であると判定するように構成されていてもよい。
すなわち、アフィン予測信号生成部111F/241Fは、ブロック毎にPROF処理の適否を判定し、かかるPROF処理の適用時には、ブロックを分割したサブブロック毎にPROF処理を行うように構成されている。
また、インループフィルタ処理部150/250は、ブロック境界毎にデブロッキングフィルタの適否を判定し、PROF処理が適用されたブロックのサブブロック境界についてはデブロッキングフィルタを適用しないと決定するように構成されている。
以上のような構成とすることで、PROF処理が適用されたブロック境界又はサブブロック境界の境界強度が「0」となり、デブロッキングフィルタが適用されなくなる。PROF処理は、主観画質向上効果があるため、このような構成とすることでデブロッキングフィルタによってブロック境界の画素値を補正することで、かえって主観画質を損なってしまうことを防ぐことができる。
また、上述の画像符号化装置100及び画像復号装置200は、コンピュータに各機能(各工程)を実行させるプログラムであって実現されていてもよい。
なお、上記の各実施形態では、本発明を画像符号化装置100及び画像復号装置200への適用を例にして説明したが、本発明は、かかる例のみに限定されるものではなく、画像符号化装置100及び画像復号装置200の各機能を備えた画像符号化/復号システムにも同様に適用できる。
本発明によれば、BDOF処理及びPROF処理内の各変数のビット幅を揃えて回路を共通化することによって回路規模を削減することができる。