以下、この発明による画像処理方法および画像処理装置の実施形態を、撮像装置および撮像方法に適用した場合を例にとって、図を参照しながら説明する。
[この発明による画像処理方法の実施形態の概要]
以下に説明する実施形態は、主として静止画の手ぶれ補正システムに、この発明を適用した場合である。
この実施形態においては、入力画像フレームを参照フレームとして、この入力画像フレームと、入力画像フレームよりも前の元フレーム、例えば1フレーム遅延させた元フレームとの間で動きベクトル検出を行なう。そして、この実施形態における静止画についての手ぶれ補正は、連続的に撮影した複数枚の画像、例えば3fpsの画像を、手ぶれ補正を行いながら重ね合わせることにより行なう。
このように、この実施形態においては、撮影した静止画の手ぶれ補正を、連写した複数の画像について手ぶれ補正をかけながら重ね合わせて行くため、ピクセル精度(1画素精度)に近い精度が求められる。そして、この実施形態においては、手ぶれ動きベクトルとしてのフレーム間の水平方向および垂直方向の平行移動成分と同時に、フレーム間の回転成分も検出し、フレームの平行移動と共に回転移動させて、複数フレームを重ね合わせるようにする。
なお、以下に説明する実施形態は、静止画用に限定されるわけではなく、本質的には動画にも適用可能である。動画の場合には、リアルタイム性のため、後述する加算枚数(重ね合わせるフレーム数)に上限はあるが、フレーム毎にこの実施形態の手法を用いることにより、ノイズ・リダクション効果の高い動画を生成するシステムへの応用も、全く同じ手段で実現できる。
以下に説明する実施形態においても、上述したブロックマッチングを用いて、2フレーム間の動きベクトルを算出するに当たって、前述したように、元フレームについて、複数個のターゲットフレームを設定して、その複数個のターゲットフレームのそれぞれについてブロックマッチングを施す。
以下に説明する実施形態においては、元フレームに、例えば16個のターゲットブロックTGi(i=0,1,2,・・・,15)を設定し、参照フレーム102には、図2に示すように、元フレームの16個のターゲットブロックTGiに対応する16個の射影イメージ104i(i=0,1,2,・・・,15)を設定する。そして、それぞれの射影イメージに対するサーチ範囲105i(i=0,1,2,・・・,15)を設定し、それぞれのサーチ範囲105i(i=0,1,2,・・・,15)において、対応するターゲットブロックについてのSADテーブルTBLi(i=0,1,2,・・・,15)を作成する。
そして、この実施形態では、作成されたSADテーブルTBLiのそれぞれから、各ターゲットブロックについての動きベクトル、すなわち、ブロック毎動きベクトルBLK_Viを検出する。
そして、基本的には、これらの複数個のブロック毎動きベクトルBLK_Viから、元フレームに対する参照フレームの平行移動成分を算出すると共に、回転角を算出し、その算出した平行移動成分および回転角を用いて、参照フレームを元フレームに重ね合わせるようにする。元フレームが、1フレーム毎に順次に次のフレームに更新される場合には、以上の処理を繰り返して、順次にフレームを重ね合わせることにより、手ぶれの除去された高品質の画像が得られることになる。
この場合において、2枚以上の複数枚のフレームを重ね合わせる際には、実際には、図3に示すように、1枚目の画面(フレーム)を基準画面として、以降のフレームを重ね合わせることになる。このため、2枚目以降の、重ね合わせるフレームについての1フレーム前のフレームとの間の平行移動量と回転角とは、順次に積算されて、1枚目のフレーム(基準画面)に対する平行移動量および回転角とされる。
[平行移動量および回転角度の算出方法の第1の例]
ブロックマッチング(ブロックマッチングを、この明細書では検波と呼ぶことにする)を用いて元フレームと参照フレームとの間の平行移動量および回転角度を求める方法の一つは、元フレームに対する参照フレーム全体としてのグローバル動きベクトルから求める方法である。すなわち、グローバル動きベクトルは、前のフレームに対する当該フレームの動きであるので、そのまま平行移動量とすることができる。
すなわち、グローバル動きベクトルの水平方向(x方向)の成分が水平方向の平行移動量であり、また、グローバル動きベクトルの垂直方向(y方向)の成分が垂直方向の平行移動量である。
また、前のフレームについて求められたグローバル動きベクトルに対する、今回の注目フレーム(参照フレーム)について求められたグローバル動きベクトルの相対的な回転角度は、今回の注目フレームの前のフレーム(元フレーム)に対する相対的な回転角度となる。
この場合におけるグローバル動きベクトルの算出方法としては、従来のブロックマッチングの場合と同様に、16個のターゲットブロックについて検出されたブロック毎動きブロックBLK_Viについて多数決を取り、多数決トップ(大きさおよび方向が同一または同等であるブロック毎動きベクトルの数が最大)のブロック毎動きベクトルを、グローバル動きベクトルとして算出する方法を採用することができる。
しかし、この多数決トップのブロック毎動きベクトルをグローバル動きベクトルとする場合には、被写体が動画の場合であって、当該動画撮影中の被写体が、例えば、細かい波面のある水面や木や草が風になびく情景などのときには、誤ったグローバル動きベクトル(手ぶれベクトル)を検出してしまう場合が多いという問題がある。最近のデジタルカメラにおいては、静止画のみでなく、動画を撮像記録の対象とするものも多いので、多数決方式によりグローバル動きベクトルを算出する方法は、実装上は、好ましくない。
そこで、この実施形態では、次に説明するような合算SAD値を用いる合算SADテーブルから、グローバル動きベクトルを算出するようにする。
すなわち、この実施形態では、前述のようにして作成した16個のターゲットブロックについてのSADテーブルTBLiについて、図2に示すように、16個のSADテーブルTBLiを重ね合わせるように縦方向に並べたときに、SADテーブルTBLiのそれぞれを求めるサーチ範囲内で、互いに対応する参照ブロック位置のSAD値を合算し、合算差分絶対値和(合算SAD値という)を求める。そして、その合算SAD値からなるSADテーブルとして、一つのサーチ範囲内の複数参照ブロック位置分についての合算SADテーブルSUM_TBLを生成する。
ここで、合算SADテーブルSUM_TBLの座標位置(x,y)の合算SAD値SUM_TBL(x,y)は、各SADテーブルTBLiの対応する座標位置(x,y)のSAD値をTBLi(x,y)とすると、
SUM_TBL(x,y)=TBL1(x,y)+TBL2(x,y)+・・・
+TBL16(x,y)
=ΣTBLi(x,y)
となる(図4の(式3)参照)。
そして、この実施形態では、合算SADテーブルSUM_TBLから、元画面に対する参照画面の動きベクトル(グローバル動きベクトル;撮像装置における手ぶれベクトルとなる)を検出する。
合算SADテーブルSUM_TBLからグローバル動きベクトルを算出する方法としては、合算SADテーブルSUM_TBLにおいて合算SAD値の最小値の位置を検出し、その検出した合算SAD値の最小値位置に対応する参照ベクトルを、グローバル動きベクトルとして検出する従来の方法を用いることができる。
しかし、この最小値の合算SAD値を用いる方法では、1画素単位の精度の動きベクトルしか得られないので、この実施形態では、合算SAD値の最小値位置の合算SAD値およびその近傍の複数個の合算SAD値を用いて、近似曲面補間を行うことで、グローバル動きベクトルを算出する。すなわち、合算SAD値の最小値位置の合算SAD値およびその近傍の複数個の合算SAD値を用いて、近似高次曲面を生成し、その近似高次曲面の極小値位置を検出することで、1画素単位以下の小数点精度で、グローバル動きベクトルを算出することができるようにしている。この近似曲面補間処理については、後で詳細に説明する。
こうして合算SADテーブルから求められるグローバル動きベクトルは、合算SAD値からなる合算SADテーブルが、フレーム全体をまとめてブロックマッチングした結果と等価になるため、多数決方式が苦手とする前述したような動画の被写体の場合にも、誤りの少ないグローバル動きベクトルが得られる。
そこで、この合算SADテーブルから求められるグローバル動きベクトルから、元フレームに対する平行移動量と回転角を求めて、上述のようなフレームの重ね合わせをすることができる。
なお、このときに求めるグローバル動きベクトルとしては、合算SADテーブルから求める合算動きベクトルに限られるものではなく、例えば多数決方式により多数決トップのブロック毎動きベクトルをグローバル動きベクトルとするようにしてもよいが、上述のような理由で合算動きベクトルが好ましい。
[平行移動量および回転角度の算出方法の第2の例]
平行移動量および回転角度を算出する方法としては、グローバル動きベクトルを算出し、その算出したグローバル動きベクトルを用いて平行移動量や回転角度を算出するのではなく、参照フレームについて算出される複数個のブロック毎動きベクトルからフレームについての平行移動量および回転角を求める方法を採用することもできる。
フレームの平行移動量は、原理的には、16個のブロック毎動きベクトルの水平方向および垂直方向の移動量の平均値として求める。ここで、複数のターゲットブロックに対応する複数の射影イメージに関するサーチ範囲を検波枠と称することとしたとき、この検波枠番号i(=0,1,2,・・・,15)は、一つの参照フレーム上において、図5のように付与することができる。
そして、検波枠番号iのブロック毎動きベクトルの水平方向成分をVxi、垂直方向成分をVyiとして、そのブロック毎動きベクトルを(Vxi、Vyi)と表すとすると、水平方向(x方向)の平行移動量α、および垂直方向(y方向)の平行移動量βは、図6の(式4)および(式5)に示すように、16個のブロック毎動きベクトルの水平方向成分および垂直方向成分の平均値とすることができる。
また、フレームの回転角γは、原理的には、16個のブロック毎動きベクトルを用いて次のようにして求めることができる。
すなわち、まず、図5と同様に図7(A)に示すように一つの参照フレームについての検波枠番号を定義する。このとき、図7(A)に示すように、一つの検波枠のサイズを、横(水平方向)2a、縦(垂直方向)2bとする。ここで、
a=(1参照ブロックの水平画素数)+(隣接参照ブロックとの水平間隔(画素数))
b=(1参照ブロックの垂直画素数)+(隣接参照ブロックとの垂直間隔(画素数))
である。
次に、検波枠番号0〜15のすべての検波枠の中心Ocを原点として、図7(B)に示すように、座標系を取る。そして、検波枠番号iに対応する値Pxiおよび値Pyiを、図7(C)および(D)に示すように定義する。この値Pxiおよび値Pyiは、すべての検波枠の中心Ocからの各検波枠の中心までの水平方向(x方向)および垂直方向(y方向)の距離の重みを表している。
この値Pxiおよび値Pyiを用いると、各検波枠番号iの検波枠の中心座標は、(Pxi・a,Pyi・b)で表すことができる。
したがって、フレームについての平行移動量を(α,β)、回転角度をγとすると、検波枠番号iの理論的なブロック毎動きベクトルWiは、図8(A)に示す(式6)に示すようなものとすることができる。
実際に検出された検波枠番号iのブロック毎動きベクトルBLK_Viを、Viと略記すると、理論的なブロック毎動きベクトルWiと実際に検出されたブロック毎動きベクトルViとの間のエラーεi2は、図8(B)の(式7)のようになるので、それを回転角度γで偏微分すると、図8(C)の(式8)のようになる。
なお、図8において、「δF(γ)/δγ」は、関数F(γ)に関する回転角度γについての偏微分を意味している。
参照フレームについて実際に検出されたブロック毎動きベクトルが実際の回転角度γを正しく含んでいるとすれば、参照フレームの複数個のすべてのブロック毎動きベクトルViについてのエラーの総和Σεi2の回転角度γによる偏微分の値は、ゼロとなるはずであるので、回転角度γは、図8(D)の(式9)のようになる。
したがって、求めるべき参照フレームについて回転角度γは、図8(E)に示す(式10)から求めることができる。
なお、(式6)の一番上の式における第1項における、三角関数を要素とする2×2の行列は、回転角度γだけ回転させるための回転行列である。この実施形態では、この三角関数を要素とする回転行列は、以下に説明するような理由から、(式6)の2行目の式に示されるように、近似したものを用いるようにしている。
すなわち、発明者は、幾つかのビデオカメラやデジタルカメラを用いた、複数の被験者による手ぶれの回転角度の計測を行なった。その結果、複数の被験者による手ぶれによる回転角度γの最大値γ_maxは、例えば3fpsの場合には、
γ_max[rad]≒arctan1/64=0.0156237...
・・・(式11)
であることが分かった。
したがって、手ぶれによる回転角度γを、最大値γ_max以下と想定すると、cosγ≒1、sinγ≒γであるとすることができるので、回転行列は、(式6)の2行目の式のように表すことができる。
つまり、図9(A)に示すように、画素のアスペクト比(画素の縦横比)を1:1としたとき、画面の水平方向に64画素進んだときに、1画素上下に変動する傾きを、一般の手ぶれによる回転角度の上限と見なせることが分かった。
図9(B)に示すように、現在考えられているデジタルカメラのイメージャの画素数の上限に近い値、1200万画素(横×縦=x_size×y_size=4092×3072画素)を想定したとき、この画像(画面)をγ_maxの角度を回転させると、図9(B)に示すように、回転後の画像の水平幅x_minは、図9(B)の元画像の4096から僅かに小さくなり、約4095.5となる。
すなわち、
x_min=4096×cosγ_max
=4096×cos1/64
=4095.5000...
≒4096
となる。
したがって、手ぶれによる回転角度γを、最大値γ_max以下と想定すると、前記(式11)に示すように、回転角度γは非常に小さいので、cosγ≒1、sinγ≒γであるとすることができ、回転行列Rは、図10(A)の(式12)のように表すことができる。
そして、上述の図9の説明から、手ぶれによる回転角度を、γ_maxを上限とした回転においては、回転行列Rとして三角関数を正確に用いた場合と、図10(A)のような近似値を用いた場合とで、最大でも0.5画素程度しか誤差が生じないことが分かる。
回転行列Rとして三角関数を用いて、回転角度γから回転移動量を検出するためには、通常は、三角関数cosやsinの値をテーブル情報として用意しておく必要があるが、そのテーブル情報についてはコストがかかる上に、回転行列による座標変換には、僅かな縮小変換も含まれるので、忠実に実現しようとすると低コスト化の支障になる。
これに対して、この実施形態においては、上述したように、cosγ≒1、sinγ≒γと近似した回転行列Rを用いるようにするので、三角関数cosやsinのテーブル情報は不要になり、低コスト化を実現することができる。
以上のようにして求めた平行移動量(α、β)と、回転角度γとを用いると、平行移動によりずれた画面の基準点(画面の左上の位置)を(x0、y0)とすると、参照フレーム上の画素位置(x、y)に対応する加算結果の画像の画素位置(基準画像の画素位置に対応)(X,Y)は、図10(B)の(式13)に従う。つまり、参照フレーム上の画素位置(x,y)の画素は、(α、β)の平行移動および回転角度γの回転により、(式13)に示される加算結果の画像の画素位置(X,Y)に変移する。
したがって、この(式13)を変形することにより、加算結果の画像(基準画像)の画素位置(X,Y)に対応する参照フレームの画素位置(x,y)を求めることにより、基準画像に重ね合わせるように、参照フレームの画像(画面)を平行移動および回転させて、参照フレームをメモリから読み出すようにすることができる。
そして、参照フレームの画像を(α、β)だけ平行移動させると共に、回転角度γだけ回転させてメモリから読み出した参照フレームの画像を、基準画像あるいは基準画像に対してそれ以前の参照フレームを重ね合わせて加算した加算結果の画像に、重ね合わせて加算することにより、目的とする静止画出力画像が得られる。
図11に、参照フレームFLrefを回転角度γだけ回転させて、基準画像のフレームFLoに合致させるように、参照フレームの画像をメモリから読み出すイメージを示す。図10(B)に示した加算結果の画像の画素位置(X,Y)の計算式の、それぞれ参照画像(参照フレーム)の画素位置(x、y)の当該x,yの係数が1であることから、この実施形態の回転移動には拡大および縮小を伴わないことが分かる。
図11に示すように、この実施形態では、画像の回転というよりは、平行四辺形への変形により回転演算を実現することができ、コストをかけずに効率良く、メモリ読み出しアクセスができるようになる。
[より高精度の平行移動量および回転角度の算出方法の例]
ところで、静止画の場合には、このグローバル動きベクトルや複数個のブロック毎動きベクトルから求められた平行移動量や回転角度を用いたとしても、精度が足りないおそれがある。
そこで、この実施形態では、この点にかんがみ、さらに、より高精度で平行移動量や回転角度を算出し、その高精度の平行移動量および回転角度を用いてフレーム画像の重ね合わせができるように考慮している。
前述もしたように、動被写体などのために、一つの参照フレームについて求められた複数のブロック毎動きベクトルのすべてが、手ぶれベクトルの検出という観点からは信頼性の高いものとなっているわけではない。
そこで、この実施形態では、一つの参照フレームについて求められた複数のブロック毎動きベクトルについて、次のようにして信頼性の判定を行い、信頼性が高いと判定されたブロック毎動きベクトルのみを用いて平行移動量および回転角度の算出を行うことにより、算出される平行移動量および回転角度の精度を向上させるようにしている。
すなわち、この実施形態では、手ぶれによる画面全体の動きベクトルではない動被写体による動きベクトル成分を、できるだけ排除することにより、より精度の高い平行移動量および回転角度の算出ができるようにしている。
そのために、この実施形態では、当該参照フレームについて算出したグローバル動きベクトル、この例では合算SADテーブルから求めたグローバル動きベクトル(以下、これを合算動きベクトルという)SUM_Vと、各ターゲットブロックについてのSADテーブルTBLi(i=0,1,2,・・・,15)から求められたブロック毎動きベクトルBLK_Viとを比較して、両者が同一または近似している信頼性が高いブロック毎動きベクトルを探す。
信頼性の高いブロック毎動きベクトルの数が少なく、予め定めた閾値未満であるときには、この実施形態では、当該フレームは重ね合わせるフレームとは用いないと決定して、この実施形態における静止画処理を、当該フレームについてはスキップして、次のフレームの処理に移行する。
信頼性の高いブロック毎動きベクトルの数が、前記閾値以上であるときには、当該信頼性の高いブロック毎動きベクトルが算出されたターゲットブロックについてのSADテーブルから、後述するような1画素未満の精度の高精度ブロック毎動きベクトルの算出を行う。そして、算出した高精度ブロック毎動きベクトルのみを用いて、前述した平行移動量の算出および回転角度の検出を行う。
この場合において、平行移動量の算出の際には、上述の第1の例および第2の例を用いることができる。
例えば上述の第2の例を用いる場合においては、図5に示す16個の検波枠のうちの、信頼性の高い検波枠番号iの検波枠のみについて求められた高精度ブロック毎動きベクトルを用いて平行移動量を算出するのである。ただし、この実施形態では、平行移動量の算出に当たっては、信頼性が低く平行移動量の算出から除外された検波枠番号qの検波枠のみではなく、当該除外された検波枠番号qに対して、すべての検波枠の中心Ocに対して点対称の位置にある検波枠番号(15−q)の検波枠のブロック毎動きベクトルも、平行移動量の算出対象から除外する。
これは、この実施形態では、フレームの回転を考慮しているため、中心Ocに対して点対称の位置にある一方の検波枠のブロック毎動きベクトルの信頼性が低いとして、それを平行移動量の演算対象から除外したときには、点対称の位置にある他方のブロック毎動きベクトルをも平行移動量の演算対象から除外しないと、平行移動量の算出結果に誤差が生じてしまうことになるからである。
これに対して、回転角度の演算時には、信頼性が低いとされた検波枠のブロック毎動きベクトルのみを、回転角度の演算対象から除外するだけで、その除外した検波枠と点対称の位置にある検波枠の高精度ブロック毎動きベクトルは、回転角度の演算対象に含めるようにする。
以上のようにして、信頼性の高い検波枠のみを用いてフレームの平行移動量および回転角度を算出することにより、高精度で平行移動量および回転角度を算出することができると期待できる。
以上説明したフレーム単位の信頼性の判定、つまり、フレーム内複数ブロック毎動きベクトルの信頼性の判定は、次のようにして行う。
まず、元フレームに設定された複数個、この例では16個のターゲットブロックTGi(i=0,1,2,・・・,15)のそれぞれに対するSADテーブルTBLiを求め、その最小SAD値MINiの座標位置からブロック毎動きベクトルBLK_Vi(図12(A)参照)を求める。次に、前述した(式3)にしたがって、16個のSADテーブルTBLiから合算SADテーブルSUM_TBLを求め、その最小SAD値MINsの座標位置から合算動きベクトルSUM_V(図12(B)参照)を求める。
次に、この実施形態においては、合算動きベクトルSUM_V、すなわち、合算SADテーブルSUM_TBLの最小SAD値MINsの座標位置を基準に、16個のターゲットブロックのそれぞれの動きベクトルBLK_Vi(すなわち、合算SADテーブルSUM_TBLの最小SAD値MINsの座標位置)と、それぞれのSAD値とから、当該16個のターゲットブロックのそれぞれについて、図13に示すような条件の判定を行い、図13に示すようなラベル付けおよびスコア(評価点)の算出を行う。
図14に、このラベル付けおよびスコア算出の処理の一例のフローチャートを示す。この図14の処理は、1枚の参照フレームについての処理であり、この図14の処理が1フレーム毎に繰り返されるものである。
まず、ラベル付けおよびスコアの算出を行う対象ターゲットブロックについて求められた動きベクトルBLK_Viと、合算動きベクトルSUM_Vとが等しいかどうかを第1の条件とする判定をする(ステップS11)。これは、対象ターゲットブロックのSADテーブルTBLiの最小SAD値MINiの座標位置と、合算SADテーブルSUM_TBLの最小SAD値MINsの座標位置が等しいか否かを条件判定することに等しい。
対象ターゲットブロックについて、この第1の条件に合致すると判定されると、当該対象ターゲットブロックについは「TOP」というラベルが付与され、この例では最大のスコア値として「4」が割り当てられる(ステップS12)。
対象ターゲットブロックについて、第1の条件には合致しないと判定されると、第2の条件に合致するかどうかの判定をする(ステップS13)。この第2の条件は、対象ターゲットブロックについて求められた動きベクトルBLK_Viと、合算動きベクトルSUM_Vとが同一ではないが、SADテーブル上で最も隣接するものとなっているかどうかであり、具体的には、対象ターゲットブロックのSADテーブルTBLiの最小SAD値MINiの座標位置と、合算SADテーブルSUM_TBLの最小SAD値MINsの座標位置が、上下、左右、斜めの方向に1座標値だけ異なる隣接するものであるかどうかである。
対象ターゲットブロックについて、この第2の条件に合致すると判定されると、当該対象ターゲットブロックについは「NEXT_TOP」というラベルが付与され、この例ではスコア値として「2」が割り当てられる(ステップS14)。
対象ターゲットブロックについて、第2の条件には合致しないと判定されると、第3の条件に合致するかどうかの判定をする(ステップS15)。この第3の条件は、対象ターゲットブロックのSADテーブルにおいて、動きベクトルBLK_Viとなる座標位置のSAD値(最小SAD値MINi)と、合算動きベクトルSUM_Vとなる合算SADテーブル上の座標位置(最小SAD値MINsの座標位置)に対応する座標位置のSAD値との差が、所定の閾値以下であるかどうかである。ここで、所定の閾値は、1画素あたりに換算したときの閾値とすることが望ましい。これは、この実施形態では、1画素精度の手ぶれ補正を想定しているためである。
対象ターゲットブロックについて、この第3の条件に合致すると判定されると、当該対象ターゲットブロックについは「NEAR_TOP」というラベルが付与され、この例ではスコア値として「1」が割り当てられる(ステップS16)。
対象ターゲットブロックについて、第3の条件には合致しないと判定されると、当該対象ターゲットブロックについは「OTHERS」というラベルが付与され、この例ではスコア値として「0」が割り当てられる(ステップS17)。
ステップS12、ステップS14、ステップS16およびステップS17のラベル付けおよびスコアの割り当てが終了した後には、割り当てられたスコアを累積加算して、合計スコアsum_scoreを算出する(ステップS18)。
次に、1フレーム内の16個のすべてのターゲットブロックについて上記の処理が終了したか否かを判別し(ステップS19)、終了していなければ、次のターゲットブロックのラベル付けおよびスコア算出を指示し(ステップS20)、その後、ステップS11に戻って、上述した処理を繰り返す。
1フレーム内の16個のすべてのターゲットブロックについて上記の処理が終了したと判別したときには、この1フレーム内の16個のターゲットブロックについてラベル付けおよびスコア算出の処理ルーチンを終了する。このときにステップS18で算出されている合計スコアsum_scoreは、16個のターゲットブロックのすべてのスコアの合計となっている。
なお、図14のフローチャートは一例であり、第1の条件、第2の条件および第3の条件の合致判定は、順序不動であり、いずれを先に行ってもよい。
以上のような1フレーム内の16個のターゲットブロックについてラベル付けおよびスコア算出の処理ルーチンが終了したら、算出した合計スコアsum_scoreと、信頼性についての閾値とを比較する。このとき、合計スコアsum_scoreが閾値よりも小さいときには、当該フレームで求められる動きベクトルは、グローバル動きベクトルの検出のためには信頼性が低いと判定することができる。
あるいは、第1の条件および第2の条件を満足するため信頼性が高いとして付与された、ラベルが「TOP」および「NEXT_TOP」のターゲットブロックのブロック毎動きベクトルの数を算出し、その数が、予め定められた閾値数未満であるときに、当該フレームで求められる動きベクトルは、グローバル動きベクトルの検出のためには信頼性が低いと判定するようにしてもよい。
合計スコアsum_scoreが閾値以上であること、あるいはラベルが「TOP」および「NEXT_TOP」のターゲットブロックのブロック毎動きベクトルの数が予め定められた閾値数以上であることは、当該フレームで求められるグローバル動きベクトルの検出は、一応の信頼性が得られると判定できることになる。
したがって、合計スコアsum_scoreが閾値以上であると判定されたとき、または、ラベルが「TOP」および「NEXT_TOP」のターゲットブロックのブロック毎動きベクトルの数が予め定められた閾値数以上であるときには、高い第1の条件および第2の条件を満足する信頼性の高いターゲットブロック(ラベル「TOP」およびラベル「NEXT_TOP」)のSADテーブルのSAD値のみを用いて合算SADテーブルを再度生成して、その再度生成した合算SADテーブルに基づいてグローバル動きベクトルとしての合算動きベクトルを再度算出し、その再算出した合算動きベクトルからフレームの平行移動量および回転角度を算出するようにすることができる。
このときに求めるグローバル動きベクトルとしては、合算SADテーブルから求める合算動きベクトルに限られるものではなく、例えば信頼性の高いブロック毎動きベクトルについて多数決をとることにより得られるものであっても良い。
また、上述したように、グローバル動きベクトルから平行移動量および回転角を算出するのではなく、信頼性の高いラベル「TOP」およびラベル「NEXT_TOP」のブロック毎動きベクトルのみを用いて、図6〜図8を用いて説明した(式4)〜(式10)に基づいて、平行移動量(α,β)および回転角度γを求めることができる。
上述もしたように、この実施形態では、信頼性の高いラベル「TOP」およびラベル「NEXT_TOP」のブロック毎動きベクトルのみを用いて平行移動量(α,β)および回転角度γを算出する方法を採用する。
しかし、この実施形態では、より高い信頼性を得るために、さらに次のような処理を施すようにする。
すなわち、この実施形態では、各ターゲットブロックに対するサーチ範囲を、徐々に絞り込んで、ブロックマッチング処理(ここでは、参照フレーム全体についてのブロックマッチングを検波と呼ぶことにする)を複数段階行うようにする。以下の実施形態では、ブロックマッチング(検波)は、2段階で行う。
そして、図15(A)に示すように、各ターゲットブロックTGi毎の1回目のサーチ範囲SR_1は最大にして、上述のような複数個のブロック毎動きベクトルBLK_Viを求める。そして、1回目の検波が終了して複数個のターゲットブロックについてのブロック毎動きベクトルを算出したら、それらの複数個のブロック毎動きベクトルを評価して、評価値の高いブロック毎動きベクトルを探索し、その評価値の高いブロック毎動きベクトルのみを用いて、前述した(式4)および(式5)を実行し、1回目の平行移動量(α,β)を求める。そして、この1回目の平行移動量から、各ターゲットブロックについての2回目のサーチ範囲を定める。
あるいは、評価値の高いブロックのみからグローバル動きベクトル(手ぶれベクトル)を算出し、そのグローバル動きベクトルから1回目の平行移動量を算出し、その1回目の平行移動量から、各ターゲットブロックについての2回目のサーチ範囲を定めるようにしてもよい。
図15(A)に示すように、1回目の処理で設定されたサーチ範囲SR_1において、各ターゲットブロックTGiについての動きベクトルBLK_Viが算出され、それら複数個のブロック毎動きベクトルから平行移動量が算出され、あるいはグローバル動きベクトルから平行移動量が算出されると、その算出された平行移動量から、参照フレームと元フレームとの間で、相関のあるブロック範囲がおおよそ検出できる。
そこで、各ターゲットブロックについての2回目の検波処理のサーチ範囲SR_2としては、図15(B)に示すように、その相関のあるブロック範囲を中心とした、1回目よりも狭い範囲に絞ったサーチ範囲を設定することができる。この場合、図15(B)に示すように、1回目のサーチ範囲SR_1の中心位置POi_1と、2回目のサーチ範囲SR_2の中心位置POi_2との間の位置ずれ(サーチ範囲オフセット)が、1回目で検出された平行移動量(グローバル動きベクトルに対応)に相当している。
このように、各ターゲットブロックに対して、絞り込んだサーチ範囲SR_2として検波処理をすることにより、2回目の検波の結果は、1段階検波処理よりも高精度のブロックマッチング結果が得られる。
そこで、この実施形態では、この2回目の検波で得られたブロック毎動きベクトルのうちで、高評価のブロック毎動きベクトルを用いて、上述のようにして、フレームについての平行移動量および回転角度の算出を行うことにより、高精度の平行移動量および回転角度を得ることができる。
ところで、この実施形態で用いる合算SADテーブルは、ブロック毎のSADテーブルではなく、フレーム全体をまとめてブロックマッチングした結果とほぼ等価である。通常の被写体においては、従来技術で説明した多数決により勝ち残った動きベクトル、つまり多数決トップの動きベクトルと、合算SADテーブルから求められる合算動きベクトルは、等しいものとなる。しかし、複数枚のフレームを重ね合わせる場合において、他人がフラッシュを炊いたりしてフレーム全体が明滅する場合や水面の波面等の被写体の場合、多数決の結果は、信頼性が低く、ランダムに近い動きベクトルとなるのに対し、合算動きベクトルは、比較的正解に近い結果を導き出す可能性が高い。
したがって、合算SADテーブルから求めた合算動きベクトルと、多数決により決定したグローバル動きベクトルという、両者の結果を比較することにより、少なくとも、現在のフレームの結果の信頼性を、定量的に判定することが可能となる。従来提案では、各ブロックの動きベクトルの信頼性を判定することに主眼が置かれていたが、この実施形態では、フレーム全体の信頼性を重視し、疑わしきは重ね合わせ対象から除外する、という方針のもと、違和感の少ない、安定した手ぶれ補正システムを実現する点が特徴である。
この点を考慮して、この実施形態の一つの方法では、従来のブロックマッチングの場合と同様に、16個のターゲットブロックについて検出されたブロック毎動きブロックBLK_Viについて多数決を取り、多数決トップ(大きさおよび方向が同一または同等であるブロック毎動きベクトルの数が最大)の動きベクトルを算出する。
そして、この検出した多数決トップの動きベクトルを、図13における合算動きベクトルに代わる基準として用いて、16個のターゲットブロックについて検出されたブロック毎動きブロックBLK_Viと、それぞれのSAD値とから、図13に示したようなラベル付けおよびスコア割り当てを行う。
これは、図13において、合算動きベクトルSUM_Vに代えて、多数決トップの動きベクトルが用いられることに等しい。
すなわち、第1の条件は、ラベル付けおよびスコアの算出を行う対象ターゲットブロックについて求められた動きベクトルBLK_Viと、多数決トップの動きベクトルとが等しいかどうかである。つまり、対象ターゲットブロックのSADテーブルTBLiの最小SAD値MINiの座標位置と、多数決トップの動きベクトルとなる座標位置とが等しいか否かを条件判定するものである。
また、第2の条件は、対象ターゲットブロックについて求められた動きベクトルBLK_Viと、多数決トップの動きベクトルとが同一ではないが、SADテーブル上で最も隣接するものとなっているかどうかであり、具体的には、対象ターゲットブロックのSADテーブルTBLiの最小SAD値MINiの座標位置と、多数決トップの動きベクトルに対応する座標位置とが、上下、左右、斜めの方向に1座標値だけ異なる隣接するものであるかどうかである。
また、第3の条件は、対象ターゲットブロックのSADテーブルにおいて、動きベクトルBLK_Viとなる座標位置のSAD値(最小SAD値MINi)と、多数決トップの動きベクトルに対応するSADテーブル上の座標位置のSAD値との差が、所定の閾値以下であるかどうかである。
以上のようにして、1フレームについての16個のターゲットブロックについての動きベクトルについて、その多数決トップの動きベクトルを基準にしたラベル付けおよびスコア割り当てを行う。そして、割り当てられたスコアの合計スコアmany_scoreを算出する。
そして、この実施形態では、合算動きベクトルSUM_Vに対応する最小SAD値の座標位置と、多数決トップの動きベクトルに対応するSAD値の座標位置との差が所定以内、例えば前記差が1隣接画素以内であって、前記合計スコアsum_scoreが所定の閾値以上、かつ、前記合計スコアmany_scoreが所定の閾値以上、であるときに、当該フレームについて求められる動きベクトルは信頼性が高いと判定する。
逆に、合算動きベクトルSUM_Vに対応する最小SAD値の座標位置と、多数決トップの動きベクトルに対応するSAD値の座標位置との差が所定以内、例えば前記差が1隣接画素以内でないときには、当該フレームからは信頼性の高い手ぶれベクトルが検出できないと判定して、当該フレームは、複数枚のフレームの重ね合わせ対象から除外する。
また、合計スコアsum_scoreが所定の閾値未満、または、前記合計スコアmany_scoreが所定の閾値未満であるときにも、当該フレームからは信頼性の高い手ぶれベクトルが検出できないと判定して、当該フレームは、複数枚のフレームの重ね合わせ対象から除外する。
そして、前記ように信頼性が高いと判定されたときにのみ、この例では、合算動きベクトルを基準にしてラベル付けされたターゲットブロックのラベルのうち、「TOP」および「NEXT_Top」が付与されたターゲットブロックについてのSADテーブルのSAD値のみを用いて、再合算SADテーブルRSUM_TBLを生成する。
そして、この再合算SADテーブルRSUM_TBLの最小SAD値およびその近傍座標位置のSAD値について、近似曲面補間を適用してグローバル動きベクトル(合算動きベクトル)を算出するものである。そして、算出した合算動きベクトルを用いて2回目検波の際のサーチ範囲を決定し、あるいは、平行移動量および回転角度を算出する。
または、「TOP」および「NEXT_Top」が付与されたターゲットブロックについてのブロック毎動きベクトルのみを用いて、前記(式4)、(式5)を用いて、平行移動量を算出して2回目検波の際のサーチ範囲を決定し、または、前記(式4)〜前記(式10)を基にした演算をして、平行移動量および回転角度を算出する。
なお、従来から提案されている、時間軸方向の動きベクトルの周波数から、動きベクトル(グローバル動きベクトル)を予測する手法と、上述したこの発明の実施形態の手法とを組み合わせることにより、更なる信頼性並びに精度の向上を図るようにしても良い。
上述したように、この実施形態では、1フレーム内の複数個のターゲットブロックのそれぞれについて、SADテーブルを生成し、ブロック毎動きベクトルを算出するようにする。この場合に、この実施形態では、現在の500万画素オーバーの撮像素子を用いる撮像装置に適用しようとすると、1画面分の画素数に比例してSADテーブルの規模が増加するため、現実的な回路規模で実現するのが困難であるという問題がある。
実現できるレベルの現実的な提案としては、前述した特許文献3(特開2005−38396公報)を挙げることができる。この特許文献3に示されたものは、画像を縮小変換したサイズで動ベクトルを求める手段と、同一のSADテーブルを複数のブロックで共有する手段から構成される。画像の縮小変換と、SADテーブルの複数ブロックでの共有化は、SADテーブルサイズの削減を実現するための、非常に良い手法であり、MPEG(Moving Picture Experts Group)画像圧縮方式における動きベクトル検出やシーンチェンジ検出等、他分野でも使われている。
しかし、この特許文献3のアルゴリズムの問題点として、画像の縮小変換と、その際のメモリ(DRAM(Dynamic RAM(Random Access Memory)))アクセスに、時間とメモリ容量を消費することと、SADテーブルを複数ブロックで時分割アクセスする手法のため、メモリアクセスが非常に増加し、この処理にも時間を要してしまうという課題がある。動画の手ぶれ補正においては、リアルタイム性と同時にシステム遅延時間の短縮が求められるため、この処理時間の問題が課題となってしまうのである。
多人数評価の結果、例えば3フレーム/秒(3fps)の静止画の場合における手ぶれ範囲は、全フレームを100%として±10%程度であることが判明している。既に高級機では世に出ている1200万画素を仮定し、現状で提案されている技術のまま、必要なSADテーブルサイズを見積もると、約80メガビットである。しかも、現実的な処理速度を満たそうとすると、このSADテーブル情報を格納するメモリは、内蔵SRAM(Static RAM(Random Access Memory))であることが求められる。半導体プロセスルールが進んだとは言え、このサイズは、ほぼ3桁程度、現実的なレベルからはかけ離れている。
また、元画像を縮小変換する際には、エイリアシング(折り返し歪み)や、低照度ノイズ除去のためのローパスフィルタを、縮小処理の前処理として実装するが必要である。しかし、縮小倍率に応じて、ローパスフィルタの特性が変化する上、特に、垂直方向のローパスフィルタの場合、多タップのデジタルフィルタとした場合に、多くのラインメモリと演算ロジックを必要としなければならず、回路規模増加の問題が生じる。
そこで、この実施形態では、以上の点にかんがみ、ブロックマッチングを用いて2フレーム間のグローバル動きベクトルを算出する場合において、SADテーブルサイズの大幅な削減が可能である画像処理方法および装置を用いる。
また、特許文献3に記載された画像の縮小変換によるSADテーブルの削減手法に関して、画像の縮小変換に伴う処理時間の増大並びにメモリ容量の消費と、画像の縮小変換に伴うエイリアシング回避のための適切なローパスフィルタの実装に伴う回路増大という、2つの問題を提起した。この実施形態では、これらの問題点をも解決することができるようにしている。
すなわち、この実施形態では、ターゲットブロックと参照ブロック間において求められるSAD値を、参照ブロックの参照ベクトルに対応して記憶するのではなく、当該参照ベクトルを縮小し、その縮小した参照縮小ベクトルに対応する、当該参照縮小ベクトルの近傍の複数の参照ベクトルに分散加算して記憶するようにする。
これにより、従来のSADテーブルに比較して、SADテーブルのサイズを大幅に縮小すると共に、画像の縮小変換に伴う処理時間の増大並びにメモリ容量の消費と、画像の縮小変換に伴うエイリアシング回避のための適切なローパスフィルタの実装に伴う回路増大という、2つの問題を解決するようにしている、
図16〜図18は、この実施形態で用いる新規なブロックマッチング方法の概要を説明するための図である。図16は、従来のSADテーブルTBLoと、実施形態の画像処理方法において生成される縮小SADテーブルTBLsとの関係を示すものである。
この実施形態においても、図81に示したように、従来と同様に参照フレームにおいて、元フレームに設定された複数個、この例では16個のターゲットブロックの位置のそれぞれを中心として複数個のサーチ範囲が設定される。そして、この複数個のサーチ範囲のそれぞれにおいて、前述したような複数の参照ブロックが設定され、各参照ブロック内の画素とターゲットブロック内の対応する画素の輝度値の差分の絶対値の総和、つまり、SAD値が求められる。
従来は、求められたSAD値は、図16に示すように、対象となっている参照ブロックの参照ベクトルRVに対応するアドレスのテーブル要素tblとしてSADテーブルTBLoに書き込まれる。
したがって、従来のブロックマッチングでは、ターゲットブロックと参照ブロックとのフレーム画像上における位置ずれ量を表わす参照ベクトルRVと、SADテーブルTBLoの各テーブル要素である参照ブロックのSAD値とは、1対1に対応している。すなわち、従来のSADテーブルTBLoでは、サーチ範囲で取り得る参照ベクトルRVと等しい数のSAD値のテーブル要素数を備えるものとなっている。
これに対して、この実施形態におけるブロックマッチングでは、図16および図17(A)、(B)に示すように、対象となっている参照ブロックの参照ベクトルRVは、縮小率1/n(nは自然数)で縮小されて参照縮小ベクトルCVとされる。
ここで、以下の説明においては、説明の便宜上、水平方向縮小倍率と垂直方向の縮小倍率とを同じとしているが、水平方向縮小倍率と垂直方向の縮小倍率とは独立の異なる値でも良い。また、後で述べるが、水平方向縮小倍率と垂直方向の縮小倍率とを独立に任意の自然数分の1として設定できるようにしておく方が、柔軟性も高く好都合である。
この実施形態においても、前述の従来例で説明したのと同様に、サーチ範囲の中心とされるターゲットブロックの位置を基準位置(0,0)とし、参照ベクトルは、当該基準位置からの画素単位の水平方向および垂直方向のずれ量(vx,vy)(vx、vyは、整数)を指し示すものとされ、参照ベクトルRVのそれぞれは、参照ベクトル(vx,vy)で表される。
参照ベクトル(vx,vy)が、水平方向および垂直方向のそれぞれについて1/nに縮小された参照縮小ベクトル(vx/n,vy/n)で示される位置(vx/n,vy/n)は、整数ではなく、小数成分が発生することがある。このため、この実施形態では、縮小前の元の参照ベクトルRVに対応して求められたSAD値を、参照縮小ベクトルCVに最も近い1つの参照ベクトルに対応するテーブル要素として記憶してしまうと誤差が生じることになる。
そこで、この実施形態では、まず、参照縮小ベクトルCVで示される位置(vx/n,vy/n)の近傍の複数の参照ベクトルで示される複数の位置(テーブル要素)を検出する。そして、参照ベクトルRVの参照ブロックについて求められたSAD値は、その検出した近傍の複数の参照ベクトルに対応するSAD値に分散して加算するようにする。
この場合に、この実施形態では、参照縮小ベクトルCVで示される位置の近傍の周囲の複数個の参照ベクトルで示される位置に対応するテーブル要素tblに書き込むべき成分として分散加算する値は、縮小前の元の参照ベクトルRVに対応して求められたSAD値から、参照縮小ベクトルとその近傍の参照ベクトルとのそれぞれが示す位置の関係を用いて、前記近傍の参照ベクトルのそれぞれに対応して分散加算するSAD値を算出し、算出したSAD値のそれぞれを、対応する参照ベクトルのテーブル要素成分として加算するようにする。
ここで、分散するだけでなく加算するというのは、参照縮小ベクトルの近傍の複数の参照ベクトルは、異なる複数の参照縮小ベクトルについて重複して検出されることになるので、1つの参照ベクトルについて、重複したSAD値は加算するという意味である。
なお、参照縮小ベクトルCVが示す位置(vx/n,vy/n)が、参照ベクトルが示す位置に一致する場合、つまり、vx/nおよびvy/nの値が整数であるときには、周辺の複数の参照ベクトルを検出する必要はなく、当該位置(vx/n,vy/n)を示す参照ベクトルに対応して、縮小前の元の参照ベクトルRVに対応して求められたSAD値を記憶するようにするものである。
次に、具体例を挙げて、以上の処理を説明する。例えば、ターゲットブロックの位置を基準(0,0)としたときに、図17(A)に示すように、(−3,−5)の位置を示す参照ブロックRVを、水平方向および垂直方向に、1/n=1/4倍に縮小すると、その参照縮小ベクトルCVで示される位置は、図17(B)に示すように、(−0.75,−1.25)となる。
したがって、参照縮小ベクトルCVで示される位置は小数成分が発生し、参照ベクトルで示される位置とは一致しない。
そこで、この場合には、図18に示すように、当該参照縮小ベクトルCVが示す位置の近傍位置を示す複数個の近傍参照ベクトルが検出される。図18の例では、1つの参照縮小ベクトルCVに対して、4個の近傍参照ベクトルNV1,NV2,NV3,NV4が検出される。
そして、前述したように、この実施形態では、参照ベクトルRVの参照ブロックについて求められたSAD値は、これら4個の近傍参照ベクトルNV1,NV2,NV3,NV4に対応するSAD値として分散加算される。
この場合に、この実施形態では、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれに分散加算するSAD値は、参照縮小ベクトルCVで示される位置P0(図18において×印として示す)と、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4(図18において○印として示す)との位置関係を用いて線形加重分散値として算出する。
図18の例の場合には、参照縮小ベクトルCVで示される位置P0は、周辺近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4を、水平方向に1:3、垂直方向に3:1に内分する位置にある。
そこで、縮小前の元の参照ベクトルRVに対応して求められたSAD値をSαとしたとき、周辺近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4に対応するSADテーブル要素に分散加算する値SADp1,SADp2,SADp3,SADp4のそれぞれは、
SADp1=Sα×9/16
SADp2=Sα×3/16
SADp3=Sα×3/16
SADp4=Sα×1/16
となる。
そして、この実施形態では、求められた値SADp1,SADp2,SADp3,SADp4のそれぞれを、近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4に対応するSADテーブル要素にそれぞれ加算する。
この実施形態では、以上の処理を、サーチ範囲内のすべての参照ブロックについて行なう。
以上のことから、この実施形態では、参照ベクトルRVを1/nに縮小する場合には、全ての参照ベクトルに1対1に対応する従来サイズのSADテーブルTBLoに対して、水平方向に1/n、また、垂直方向に1/nに縮小した縮小SADテーブルTBLsを用意して、この縮小SADテーブルTBLsのテーブル要素として、参照縮小ベクトルCVの近傍の参照ベクトルに対応するSAD値を求めるようにすれば良い(図16参照)。
したがって、この実施形態の場合には、縮小SADテーブルTBLsのテーブル要素の数は、従来のSADテーブルTBLoのテーブル要素数の1/n2となり、テーブルサイズを大幅に小さくすることが可能である。
なお、上述の実施形態の説明においては、参照縮小ベクトルCVの近傍の4個の参照ベクトルを検出し、当該4個の近傍参照ベクトルに対応するSADテーブル要素に対して、対照の参照ブロック(参照ベクトルRV)について算出したSAD値を線形加重分散加算するようにしたが、参照縮小ベクトルCVの近傍の複数の参照ベクトルの選び方およびその近傍参照ベクトルに対応するSADテーブル要素に対する分散加算の方法は、上述の例に限られるものではない。
例えば、参照縮小ベクトルCVの近傍の9個もしくは16個の参照ベクトルを検出し、当該9個もしくは16個の近傍参照ベクトルに対応するSADテーブル要素に対して、いわゆるキュービック(Cubic)補間による分散加算を行なうようにすれば、より精度は高くなる。しかし、リアルタイム性と演算回路の削減を重視すると、上述した近傍4個の参照ベクトルに対応するテーブル要素への線形加重分散加算が、より有効である。
この実施形態においても、参照ブロックをサーチ範囲内で遍く移動させ、全ての参照ブロックのSAD値に対してSADテーブル(この実施形態では縮小SADテーブル)への代入を行う点は、従来手法と同じである。
ただし、従来は、参照ベクトルとSADテーブル要素のアドレスが1対1に対応していたため、SADテーブルへは単なる代入で済んだが、この実施形態による手法では、参照ブロックについて算出したSAD値を分散加算させるため、縮小SADテーブルにおいて、参照ベクトル(縮小参照ベクトル)とテーブルアドレスは1対1ではない。したがって、この実施形態の手法の場合には、SAD値のテーブルアドレスへの単なる代入ではなく、加算して代入する、いわゆる代入加算である必要がある。また、そのため、SADテーブル(縮小SADテーブル)の各テーブル要素は、最初に初期化(0クリア)しておかなければならない。
ところで、従来のブロックマッチングでは、以上のようにして完成させたSADテーブルにおいて、SAD値が最小値となるテーブル要素を探索し、その最小値となるテーブル要素のテーブルアドレスを、参照ベクトルに変換すれば、動ベクトルの検出を完了した。
これに対して、この実施形態による手法では、SADテーブルは、参照ベクトルを縮小した縮小参照ベクトルに対応した縮小SADテーブルであるため、当該縮小SADテーブルの最小値がそのまま正確な動きベクトルには対応していない。
もっとも、ある程度の誤差を許す装置の場合には、縮小SADテーブルの最小値となるテーブル要素のテーブルアドレスを、参照ベクトルに変換したものを、さらに縮小率1/nの逆数倍、つまりn倍することで、動きベクトルを算出するようにすることもできる。
しかし、より正確な動きベクトルを算出するようにする場合には、以下に説明するように、縮小SADテーブルのテーブル要素値に対して補間処理を施すことで、元のベクトル精度で、正確な動きベクトル(ブロック毎動きベクトル)を検出するようにする。
なお、上述の説明において、縮小参照ベクトルを用いない従来の参照ベクトルを用いるブロックマッチング手法を用いて複数個のターゲットブロックについてのSADテーブルを求め、そして、求めた複数個のSADテーブルの対応する座標位置のSAD値を合算することで合算SADテーブルを求め、その合算SADテーブルについて、近似曲線補間を行うことによりグローバル動きベクトルを算出することを記述したが、以下に説明する補間処理は、この場合の近似曲線補間として用いることができるものでもある。
[より正確な動きベクトルを算出するための補間処理の第1の例]
より正確な動きベクトルを算出するための補間処理の第1の例は、縮小SADテーブルにおける複数個のSADテーブル要素値(SAD値)を、1つの2次曲面で近似する手法である。
すなわち、縮小SADテーブルにおいて、SAD値が最小値となるテーブル要素(整数精度最小値テーブル要素(整数精度テーブルアドレス))と、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素とを求め、それらのテーブル要素のSAD値を用いて、最小自乗法によりSAD値の2次曲面を決定し、この2次曲面の最小値となるSAD値を検出し、当該検出した最小値となるSAD値に対応する位置(参照フレーム上において、基準位置に対してずれた位置)を検出し、当該検出した位置を小数精度の最小値テーブルアドレス(縮小SADテーブルにおいてSAD値が最小値となるベクトル(最小値ベクトルという)に対応)とする。
この場合、一意の2次曲面を定めるためには、図19(A)または(B)に示すように、整数精度最小値テーブル要素tmと、当該テーブル要素tmをその両側から挟む位置の、当該テーブル要素tmの近傍の4個の整数精度テーブル要素t1,t2,t3,t4が最低限必要である。
そして、図20に示すように、参照フレームのサーチ範囲内の縮小SADテーブルに対応する参照縮小ベクトルの範囲内において、ターゲットフレームの位置を基準位置(0,0)として、水平方向および垂直方向のずれ量(参照縮小ベクトルに対応)の軸vx/nおよび軸vy/nを考えると共に、これらの軸vx/nおよび軸vy/nに垂直な軸として、SAD値の軸を考え、これら3軸からなる座標空間を想定する。
そして、例えば、整数精度最小値テーブル要素tmのSAD値と、当該整数精度最小値テーブル要素tmを挟む2個のテーブル要素t1、t3のSAD値とから、図20の座標空間において2次曲線を生成する。また、整数精度最小値テーブル要素tmのSAD値と、当該最小値テーブル要素tmを挟む他の2個のテーブル要素t2、t4のSAD値とから、図20の座標空間において、他の2次曲線を生成する。そして、これら2個の2次曲線を含む2次曲面201を、最小自乗法により求め、その2次曲面201を、図20に示すように、座標空間において生成する。
そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図20の位置203)を検出し、当該検出した位置(vx/n,vy/n)を、小数精度のテーブル要素(テーブルアドレス)として検出する。そして、検出した小数精度テーブル要素に対応するベクトル(最小値ベクトル)204を、図21に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
例えば、図22に示すように、参照ベクトルを1/4に縮小した場合における縮小SADテーブルTBLsの、小数精度テーブル要素の最小値アドレスから求められる最小値ベクトル204が、(−0.777,−1.492)の場合に、これらを4倍した(−3.108,−5.968)が、動きベクトル205となる。この動きベクトル205は、元画像のスケールにおける動きベクトルを再現したものとなっている。
以上の説明は、整数精度最小値テーブル要素tmと、その近傍の4テーブル要素を用いた場合として説明したが、SAD値の2次曲面を最小自乗法により求めるためには、より多くの複数近傍テーブル要素を用いたほうがよい。そこで、一般には、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=m×m個(mは3以上の整数)の矩形領域のテーブル要素を用いるようにする。
しかし、この複数近傍テーブル要素の数は、多ければ良いというものではなく、広い範囲のテーブル要素を用いると、演算量の増加を招く上、画像パターンに依存するローカルミニマムの偽値を使用してしまう可能性も高まるので、適切な複数近傍テーブル要素の数からなる矩形領域のテーブル要素を用いるようにする。
適切な複数近傍テーブル要素の数からなる矩形領域のテーブル要素の例として、この実施形態では、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域のテーブル要素を用いるようにする例と、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域のテーブル要素を用いるようにする例とについて説明する。
[3×3個の矩形領域のテーブル要素を用いる例]
図23に、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域(図23で塗りを付して示してある)のテーブル要素を用いるようにする例を示す。
この図23の例の場合には、図23(A)に示すように、整数精度最小値テーブル要素tmと、その近傍の8個の近傍テーブル要素のSAD値を用いて、図23(B)に示すような2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図23(B)の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図21に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、SAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図21に示すように、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標を考える。この場合、周辺の8個のテーブル要素の位置は、3個のx軸方向の位置、すなわち、x=−1、x=0、x=1と、3個のY軸方向の位置、すなわち、y=−1、y=0、y=1との繰り合わせで表され、(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(0,1)、(−1,1)、(0,1)、(1,1)の8位置となる。
そして、図24のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、右下の位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx、dy)は、図25に示す(式A)および(式B)により、求めることができる。
図25の(式A)および(式B)において、
x=−1のとき、Kx=−1
x=0のとき、Kx=0
x=0のとき、Kx=1
となる。また、
y=−1のとき、Ky=−1
y=0のとき、Ky=0
y=0のとき、Ky=1
となる。
こうして求められた小数精度の位置(dx,dy)は、整数精度最小値テーブル要素tmの位置を原点(0,0)とする位置であるので、この小数精度の位置(dx,dy)と整数精度最小値テーブル要素tmの位置とから、求めるサーチ範囲の中心位置からの位置203を検出することができる。
[4×4個の矩形領域のテーブル要素を用いる例]
図26に、整数精度最小値テーブル要素tmをほぼ中心として、その周囲の水平方向×垂直方向=4×4個の矩形領域のテーブル要素(図26で塗りを付して示してある)を用いるようにする例を示す。
この場合に、整数精度最小値テーブル要素tmと、その近傍の8テーブル要素(3×3)や、その近傍の24テーブル要素(5×5)のように、前記mの値が奇数である場合には、整数精度最小値テーブル要素tmは、常に、使用する矩形領域の複数のテーブル要素の中心になるため、使用するテーブル範囲は単純に決定する。
これに対して、近傍の15テーブル要素(4×4)のように、mが偶数である場合には、整数精度最小値テーブル要素tmは、使用する矩形領域の複数のテーブル要素の中心位置とはならないので、若干の工夫が必要となる。
つまり、整数精度最小値テーブル要素tmから見て、水平方向に左右の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4列目として採用する。同様に、垂直方向に上下の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4行目として採用する。
図26の例では、整数精度最小値テーブル要素tmの水平方向に左右の隣接テーブル要素のSAD値は、「177」と「173」であるので、SAD値が小さい右隣の値「173」のテーブル要素のさらに右隣の列を第4列目として採用する。また、整数精度最小値テーブル要素tmの垂直方向に上下の隣接テーブル要素のSAD値は、「168」と「182」であるので、SAD値が小さい上隣の値「168」のテーブル要素のさらに上隣の行を第4行目として採用する。
そして、図26の例の場合には、整数精度最小値テーブル要素tmと、その近傍の15個の近傍テーブル要素のSAD値を用いて、2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図26の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図21に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、この例の場合におけるSAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図27に示すように、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標を考える。
この例の場合には、16テーブル要素からなる矩形領域中における整数精度最小値テーブル要素tmの位置に応じて、図27(A),(B),(C),(D)のような4通りのテーブル要素配置を考える必要がある。
この場合、周辺の15個のテーブル要素の位置は、図27(A),(B),(C),(D)から分かるように、4個のx軸方向の位置、すなわち、x=−1、x=0、x=1、x=2またはx=−2と、4個のY軸方向の位置、すなわち、y=−1、y=0、y=1、y=2またはy=−2との繰り合わせで表される15位置となる。
そして、図27のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx,dy)は、図28に示す(式C)および(式D)により、求めることができる。
ここで、図28の(式C)および(式D)において、KxおよびKyは、図29に示すように、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(Kx,Ky)座標を考えたときの、前記図17(A),(B),(C),(D)に示した4通りのテーブル要素配置に応じた値となる。
すなわち、前記図27(A)に対応する場合には、
x=−2のとき、Kx=−1.5
x=−1のとき、Kx=−0.5
x=0のとき、Kx=0.5
x=1のとき、Kx=1.5
となる。また、
y=−2のとき、Ky=−1.5
y=−1のとき、Ky=−0.5
y=0のとき、Ky=0.5
y=1のとき、Ky=1.5
となる。
また、前記図27(B)に対応する場合には、
x=−2のとき、Kx=−1.5
x=−1のとき、Kx=−0.5
x=0のとき、Kx=0.5
x=1のとき、Kx=1.5
となる。また、
y=−1のとき、Ky=−1.5
y=0のとき、Ky=−0.5
y=1のとき、Ky=0.5
y=2のとき、Ky=1.5
となる。
また、前記図27(C)に対応する場合には、
x=−1のとき、Kx=−1.5
x=0のとき、Kx=−0.5
x=1のとき、Kx=0.5
x=2のとき、Kx=1.5
となる。また、
y=−2のとき、Ky=−1.5
y=−1のとき、Ky=−0.5
y=0のとき、Ky=0.5
y=1のとき、Ky=1.5
となる。
また、前記図27(D)に対応する場合には、
x=−1のとき、Kx=−1.5
x=0のとき、Kx=−0.5
x=1のとき、Kx=0.5
x=2のとき、Kx=1.5
となる。また、
y=−1のとき、Ky=−1.5
y=0のとき、Ky=−0.5
y=1のとき、Ky=0.5
y=2のとき、Ky=1.5
となる。
また、図28の(式C)および(式D)におけるΔxおよびΔyは、(Kx,Ky)座標に対する図27(A),(B),(C),(D)の各テーブル要素配置における(x,y)座標とのずれ量を表しており、図29から分かるように、
図27(A)に対応する場合には、Δx=−0.5、Δy=−0.5、
図27(B)に対応する場合には、Δx=−0.5、Δy=0.5、
図27(C)に対応する場合には、Δx=0.5、Δy=−0.5、
図27(D)に対応する場合には、Δx=0.5、Δy=0.5、
となる。
こうして求められた小数精度の位置(dx,dy)は、整数精度最小値テーブル要素tmの位置を原点(0,0)とする位置であるので、この小数精度の位置(dx,dy)と整数精度最小値テーブル要素tmの位置とから、求めるサーチ範囲の中心位置からの位置203を検出することができる。
[より正確な動きベクトルを算出するための補間処理の第2の例]
より正確な動きベクトルを算出するための補間処理の第2の例は、縮小SADテーブルにおける整数精度最小値テーブル要素を含む複数個の水平方向のテーブル要素のSAD値を用いて水平方向の3次曲線を生成すると共に、整数精度最小値テーブル要素を含む複数個の垂直方向のテーブル要素のSAD値を用いて垂直方向の3次曲線を生成し、それぞれの3次曲線の極小値となる位置(vx,vy)を検出して、検出した位置を小数精度の最小値アドレスとするものである。
図30は、この第2の例を説明するための図である。前述の第1の例と同様にして、整数精度最小値テーブル要素tmと、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素、図30の例では、4×4=16個のテーブル要素を求める(図30(A)で塗りを付した部分参照)。
次に、第1の例と同様にして、図30(B)に示すように、参照フレームのサーチ範囲内の縮小SADテーブルに対応する参照縮小ベクトルの範囲内において、ターゲットフレームの位置を基準位置(0,0)として、水平方向および垂直方向のずれ量(参照縮小ベクトルに対応)の軸vx/nおよび軸vy/nを考えると共に、これらの軸vx/nおよび軸vy/nに垂直な軸として、SAD値の軸を考え、これら3軸からなる座標空間を想定する。
次に、整数精度最小値テーブル要素tmの周囲の16個のテーブル要素のうち、整数精度最小値テーブル要素tmを含む4個の水平方向のテーブル要素のSAD値を用いて、前記座標空間に水平方向の3次曲線206を生成する。この水平方向の3次曲線206の極小値に対応する水平方向の位置vx/nとして、小数精度最小値テーブル要素位置の水平方向位置を検出する。
次に、整数精度最小値テーブル要素tmの周囲の16個のテーブル要素のうち、整数精度最小値テーブル要素tmを含む4個の垂直方向のテーブル要素のSAD値を用いて、前記座標空間に垂直方向の3次曲線207を生成する。この垂直方向の3次曲線207の極小値に対応する垂直方向の位置vy/nとして、小数精度最小値テーブル要素位置の垂直方向位置を検出する。
以上により求めた小数精度最小値テーブル要素位置の水平方向の位置と、垂直方向の位置から、小数精度最小値テーブル要素位置(小数精度最小値テーブルアドレス)208を検出する。そして、当該検出した小数精度テーブル要素位置208に対応するベクトル(最小値ベクトル)209を、前述した図21に示すようにn倍して、元の大きさ精度の動きベクトルを得る。
すなわち、第2の例は、第1の例で説明した方法により、水平方向、垂直方向のそれぞれの4個のテーブル要素を確定し、図30(B)に示すように、水平方向、垂直方向のそれぞれで、3次曲線を一意に定める手法である。
ここで、SAD値の3次曲線206および209の最小値202に対応する位置208の算出方法は、次のようになる。すなわち、水平方向または垂直方向のいずれかの方向における3次曲線において、最小値の近傍の4点のSAD値を、前記水平方向または垂直方向のいずれかの方向に沿った順番に、S0、S1、S2、S3としたとき、小数精度の最小値が、図31に示す3つの区間Ra,Rb,Rcのいずれにあるかにより、最小値を取る小数成分uを算出する式が異なる。
ここで、区間RaはSAD値S0となる位置とSAD値S1となる位置との間の区間、RbはSAD値S1となる位置とSAD値S2となる位置との間の区間、RcはSAD値S2となる位置とSAD値S3となる位置との間の区間である。
そして、小数精度の最小値が、図31に示す区間Raにあるときには、図32の(式E)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
また、同様に、小数精度の最小値が、図31に示す区間Rbにあるときには、図32の(式F)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
さらに、小数精度の最小値が、図31に示す区間Rcにあるときには、図32の(式G)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
そして、小数精度の最小値が、図31に示す3つの区間Ra,Rb,Rcのいずれにあるかの判別は、次のようにして行なう。
すなわち、図33は、その判別を説明するための図である。図33(A),(B),(C)に示すように、先ず、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とを検出し、小数精度の最小値は、検出された整数精度のSAD値の最小値Sminの位置と、2番目に小さい整数精度のSAD値Sn2の位置との間の区間に存在するとして検出する。次に、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とが、図31に示したSAD値S0、S1、S2、S3のいずれの位置となっているかにより、検出した区間が区間Ra,Rb,Rcのいずれであるかの判別を行なう。
なお、図33(D)に示すように、整数精度のSAD値の最小値SminがSAD値のまたは位置にあって、4個のテーブル要素値の端に位置する場合には、最小位置が推定できないとして、この実施形態では、エラーとして扱い、最小値位置の算出は行なわないようにする。もっとも、この図33(D)のような場合においても、最小値位置を算出するようにしてもよい。
以上のようにして、この実施形態によれば、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いて、元の画像スケールにおける動きベクトルを算出することができる。この場合に、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いているにも関わらず、従来とほぼ同様のベクトル検出結果が得られることを図31に示す。
図34の横軸は、水平方向または垂直方向の一方についての1次元方向の縮小倍率nであり、また、縦軸は、検出される動きベクトルについての誤差(ベクトル誤差)を示している。図34のベクトル誤差の数値は画素数で表されている。
図34において、曲線301は、縮小倍率に対するベクトル誤差の平均値である。また、曲線302は、縮小倍率に対するベクトル誤差の分散σの3倍値(3σ(99.7%))を示している。曲線303は、曲線302の近似曲線を示している。
図34は、1次元方向の縮小倍率nに対するベクトル誤差を示しているが、SADテーブルは2次元のため、図34に示されるものの2乗の割合でテーブルサイズ(テーブル要素数)が削減されるのに対し、ベクトル誤差は、線形程度にしか増加しないことから、この実施形態による手法の有用性が分かる。
また、n=64(縮小率1/64)倍の縮小倍率でも、ベクトル誤差は小さく、全く異なる動きベクトルを算出出力とするような破綻は見られないことから、実質、1/4096に、SADテーブルのサイズを削減可能であると言える。
また、前述したように、動画の手ぶれ補正においては、リアルタイム性とシステム遅延の削減が強く求められるのに対し、精度については、破綻した全く異なる動きベクトルが検出される場合を除き、ある程度のベクトル検出誤差に対して寛容である。したがって、破綻しないままSADテーブルのサイズを大きく削減することができる、この実施形態は有用性が高いと言える。
そして、この実施形態では、前述したように、参照フレーム102を複数の領域、この例では16領域に分割し、それぞれの分割領域において動きベクトル(ブロック毎動きベクトル)205を検出するようにする。これは、前述したように、フレーム内には動く被写体が含まれる可能性も高いため、例えば、図35のように参照フレーム102の1フレーム内において16個の動きベクトル205を検出し、過去のフレームにおけるそれらの動きベクトル205からの推移も加味しながら統計的に処理することで、1フレームについて1つのグローバル動きベクトル、即ち、フレームの手ぶれベクトルを確定するようにするためである。
この場合、図35に示すように、1回目の検波においては、検出したい16個の動きベクトル205の基準位置PO1〜PO16のそれぞれを中心とするサーチ範囲SR1,SR2,・・・,SR16を定め、各サーチ範囲において、ターゲットブロックの射影イメージブロックIB1,IB2,・・・,IB16を想定する。
そして、この射影イメージブロックIB1,IB2,・・・,IB16と同じ大きさの参照ブロックを設定し、各サーチ範囲SR1,SR2,・・・,SR16内を、設定した参照ブロックを移動させて、上述と同様にして、縮小SADテーブルを生成すると共に、各サーチ範囲SR1,SR2,・・・,SR16における動きベクトル205を検出するようにする。したがって、この実施形態では、SADテーブルTBLiは、縮小SADテーブルの構成である。
そして、この実施形態では、16個のサーチ範囲のターゲットブロックについて求めた16個の縮小SADテーブルを、図2に示したように、重ね合わせるように並べて、サーチ範囲内で互いに対応する参照ブロック位置、つまり、縮小SADテーブルで同じ座標位置のSAD値を合算し、合算SAD値を求める。そして、その合算SAD値からなるSADテーブルとして、一つのサーチ範囲内の複数参照ブロック位置分についての合算縮小SADテーブルを生成する。したがって、この実施形態では、合算SADテーブルSUM_TBLは、合算縮小SADテーブルの構成である。
そして、この実施形態では、この縮小SADテーブルTBLi、この縮小SADテーブルTBLiについて上述のような近似補間処理をすることで求められるブロック毎動きベクトル205、および合算SADテーブルSUM_TBLを用いて、図13〜図14に示したような信頼性の判定処理、および信頼性の高いブロック毎動きベクトルが得られるターゲットブロックについての再合算SADテーブルRSUM_TBLの生成、さらに、生成した再合算SADテーブルRSUM_TBLの最小SAD値およびその近傍の複数個のSAD値を用いた曲線近似補間処理をすることにより、高精度のグローバル動きベクトルを算出する。
以上説明した実施形態の縮小SADテーブルを用いる画像処理方法は、従来手法として説明した特許文献3に記載された画像を縮小変換したサイズで動きベクトルを算出する手法に比べて、次に挙げる2つの点において、大きく異なるメリットを有するものである。
まず、第一に、この実施形態による手法は、特許文献3に記載された従来手法と異なり、画像を縮小変換するプロセスを全く必要としない。この実施形態による手法においては、参照ブロックについて算出したSAD値を、SADテーブル(縮小SADテーブル)に代入加算する際に、同時に縮小倍率に相当するアドレス変換を行なうからである。
これにより、この実施形態による手法においては、特許文献3に記載された従来手法のような画像の縮小変換のためのロジックも、縮小した画像をメモリに格納する時間およびバンド幅の浪費も、縮小画像をメモリに貼る領域確保も必要ない、というメリットを有する。
特許文献3に記載された従来手法のもう1つ重要な問題点として、前述も使用にしたように、画像を縮小変換する際のエイリアシング(折り返し歪み)や、低照度ノイズ除去のためのローパスフィルタの存在の問題がある。すなわち、画像縮小する際には、適切なローパスフィルタを通してからリサンプリングを行なわなければならず、さもないと、不要なエイリアシングが発生し、その縮小画像を用いた動きベクトルの精度が著しく損なわれるからである。
縮小変換の際の理想的なローパスフィルタの特性としては、sinc関数に類似した関数であることが、理論的に証明されている。sinc関数自体は、sin(xπ)/(xπ)の形で表されるカットオフ周波数f/2の無限タップのFIR(Finite Impulse Response)フィルタであるが、縮小倍率1/nのときの理想的なカットオフ周波数f/(2n)のローパスフィルタとしては、sin(xπ/n)/(xπ/n)と表される。しかし、これもsinc関数の一形態として良い。
図36〜図38の上側には、それぞれ縮小倍率が1/2倍、1/4倍、1/8倍のときのsinc関数(ローパスフィルタの理想特性)の形状を示す。この図36〜図38から、縮小倍率が大きくなればなる程、関数がタップ軸方向に拡大して行くことが分かる。つまり、無限タップのsinc関数を主要な係数のみで近似する場合にも、FIRフィルタのタップ数を増加させなければならないと言える。
また、一般的に、より低い帯域のカットオフ周波数を実現するフィルタは、フィルタ形状よりもタップ数が、その性能に対して支配的になって行くことが知られている。
したがって、特許文献3に記載の従来手法の縮小画像を用いる動きベクトル演算手法の場合、画像の縮小倍率が大きくなればなる程、そのSADテーブル削減効果が大きいにも関わらず、画像生成する際の前処理用フィルタとしてのローパスフィルタは、縮小倍率が大きくなればなる程、コストが増加してしまう、という矛盾を併せ持つのである。
一般に、高次タップのFIRフィルタを実現する場合、演算ロジックのコストがタップ数の2乗に比例して増加するため、問題となるが、より大きい問題は、垂直フィルタ実現のためのラインメモリ数の増加である。近年のデジタルスチルカメラにおいては、画素数向上に伴うラインメモリのサイズ削減のため、いわゆる短冊処理を行なっているが、例え、1ライン当たりのサイズを削減したとしても、ラインメモリそのものの本数が増加することは、物理レイアウトエリアで換算されるトータルコストを著しく押し上げる。
以上、述べたように、特許文献3に記載の従来手法の画像縮小によるアプローチは、特に垂直ローパスフィルタの実現において、大きな壁が立ちはだかっていることが分かる。それに対し、この実施形態の手法は、全く異なる形で簡潔にこの問題を解決している。
図36〜図38の下側に、この実施形態による手法におけるローパスフィルタのイメージを示す。この実施形態による手法においては、画像縮小処理を伴っていないが、縮小SADテーブルの生成演算過程におけるローパスフィルタのイメージを図示したものである。
図36〜図38の下側に示されるように、このローパスフィルタの特性は、sinc関数の主要係数部分を線形で近似した、シンプルなフィルタ特性ではあるものの、縮小倍率に連動してタップ数が増加していることが分かる。これは、先に述べた、カットオフ周波数が低くなる程、ローパスフィルタの性能はタップ数が支配的になる、という事実に好適である。つまり、実施形態の線形加重分散加算を行なう処理のような、この実施形態におけるSAD値の分散加算を行なう処理そのものが、倍率連動の高性能ローパスフィルタを、シンプルな回路で実現していることと等価なのである。
このローパスフィルタに絡んで、他にもメリットがある。特許文献3に記載の従来手法では、ローパスフィルタをかけた後、リサンプリングすることで画像を縮小するが、この時点で相当数の画像情報が失われる。つまり、ローパスフィルタの演算において、画像情報の輝度値の語長は大幅に丸められてメモリに格納され、殆どの画素情報の下位ビットは、縮小後の画像に影響を与えないのである。
一方、この実施形態による手法においては、全ての画素の輝度値の全ビット情報を、遍く平等に使用してSAD値を演算し、その分散加算値を求めて縮小SADテーブルに加算する。縮小SADテーブルの各テーブル要素値の語長さえ増やせば、最終的なSAD値の出力まで、一切の丸め誤差を含まない形で演算可能である。縮小SADテーブルの面積はフレームメモリに比較して小さいため、縮小SADテーブルの語長拡張は大きな問題にならない。その結果として、縮小SADテーブル並びに動きベクトル検出を、高精度に実現できるのである。
[この発明による画像処理装置の第1の実施形態]
次に、この発明による画像処理方法を用いた画像処理装置の第1の実施形態として、撮像装置の場合を例にとって、図を参照しながら説明する。図1は、この発明の画像処理装置の実施形態としての撮像装置の一例のブロック図を示すものである。
この図1の第1の実施形態は、静止画の手ぶれ補正システムに、この発明を適用した場合である。なお、この実施形態は、静止画用に限定されるわけではなく、本質的には動画にも適用可能である。動画の場合には、リアルタイム性のため加算枚数(フレーム数)に上限はあるが、フレーム毎に本手法を用いることにより、ノイズ・リダクション効果の高い動画を生成するシステムへの応用も、全く同じ手段で実現できる。
この第1の実施形態においては、入力画像フレームを参照フレームとして、この入力画像フレームと、フレームメモリ内の入力画像フレームを1フレーム遅延させた画像フレームとの間で動きベクトル検出を行なう。そして、この第1の実施形態における静止画についての手ぶれ補正は、連続的に撮影した複数枚の画像、例えば3fpsの画像を、手ぶれ補正を行いながら重ね合わせることにより行なう。
このように、第1の実施形態においては、撮影した静止画の手ぶれ補正を、連写した複数の画像について手ぶれ補正をかけながら重ね合わせて行くため、ピクセル精度(1画素精度)に近い精度が求められる。つまり、第1の実施形態においては、前述したように、手ぶれ動きベクトルとしてのフレーム間の水平方向および垂直方向の平行移動成分と同時に、フレーム間の回転成分も検出するようにする。
図1に示すように、この実施形態の撮像装置は、システムバス2にCPU(Central Processing Unit)1が接続されると共に、システムバス2に、撮像信号処理系10や、ユーザ操作入力部3、画像メモリ部4、記録再生装置部5などが接続されて構成されている。なお、この明細書においては、CPU1は、種々のソフトウエア処理を行なうプログラムを記憶するROM(Read Only Memory)やワークエリア用RAM(Random Access Memory)などを含むものとしている。
ユーザ操作入力部3を通じた撮像記録開始操作を受けて、図1の例の撮像装置は、後述するような撮像画像データの記録処理を行なう。また、ユーザ操作入力部3を通じた撮像記録画像の再生開始操作を受けて、図1の例の撮像装置は、記録再生装置部5の記録媒体に記録された撮像画像データの再生処理を行なう。
図1に示すように、撮像レンズ10Lを備えるカメラ光学系(図示は省略)を通じた被写体からの入射光は、撮像素子11に照射されて撮像される。この例では、撮像素子11は、CCD(Charge Coupled Device)イメージャで構成されている。なお、撮像素子11は、CMOS(Complementary Metal Oxide Semiconductor)イメージャで構成してもよい。
この例の撮像装置においては、撮像記録開始操作がなされると、撮像素子11からは、タイミング信号発生部12からのタイミング信号によりサンプリングされることにより、赤(R)、緑(G)、青(B)の3原色から構成されるベイヤー配列のRAW信号であるアナログ撮像信号が出力される。出力されたアナログ撮像信号は、前処理部13に供給され、欠陥補正やγ補正等の前処理が施され、データ変換部14に供給される。
データ変換部14は、これに入力されたアナログ撮像信号から、輝度信号成分Yと、色差信号成分Cb/Crとにより構成されるデジタル撮像信号(YCデータ)に変換し、そのデジタル撮像信号をシステムバス2を介して、画像メモリ部4に供給する。
画像メモリ部4は、この図1の例においては、3個のフレームメモリ41,42および43からなり、データ変換部14からのデジタル撮像信号は、先ず、フレームメモリ41に格納される。そして、1フレーム経過すると、フレームメモリ41に記憶されているデジタル撮像信号が、フレームメモリ42に転送されると共に、フレームメモリ41には、データ変換部14からの新たなフレームのデジタル撮像信号が書き込まれる。したがって、フレームメモリ42には、フレームメモリ41に格納されているフレーム画像よりも1フレーム分前のフレーム画像が格納されている。
そして、手ぶれベクトル検出部15は、システムバス2を介して、これら2個のフレームメモリ41およびフレームメモリ42をアクセスして、その格納データを読み出し、前述したような、1フレーム当たり16個のSADテーブル生成処理、ブロック毎動きベクトル検出処理、合算SADテーブル生成処理、再合算SADテーブル生成処理、グローバル動きベクトル検出処理などの処理、さらにフレームについての平行移動量および回転角度の算出処理を実行する。
この場合、フレームメモリ42に格納されているフレーム画像は、元フレームの画像とされ、また、フレームメモリ41に格納されているフレーム画像は、参照フレームの画像とされる。なお、実際には、フレームメモリ41と42とは、ダブルバッファとしてローテーションされる。
この第1の実施形態における手ぶれベクトル検出部15においては、前述したように、サーチ範囲を絞りながら、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、縮小SADテーブルおよび合算SADテーブルを用いた動きベクトル検出処理を繰り返すようにする。
特に、静止画についての手ぶれベクトル検出および手ぶれ補正処理においては、リアルタイム性の制約が少なく、画素数が多く、高精度の動きベクトルの検出が必要であるので、複数段階の階層的な動きベクトル検出処理が非常に有効である。
この第1の実施形態においては、画像メモリ4には、複数枚のフレームを回転および平行移動させて重ね合わせた結果を記憶するためのフレームメモリ43を設ける。前述したように、画像フレームの重ね合わせは、1枚目の基準画像(図3の画像フレーム120参照)に対して行うようにする。
複数枚のフレームを回転および平行移動させて重ね合わせる基準となる1枚目のフレームの画像データは、図1において破線で示すように、フレームメモリ43にも書き込まれる。
そして、2枚目以降の画像フレームについては、フレームメモリ42に格納された後、フレームメモリ41に格納されている画像データを用いて、常に1フレーム前の画像との相対的な手ぶれベクトルの検出が、手ぶれベクトル検出部15で実行される。このとき、1枚目の基準画像との相対手ぶれを算出するために、それまでの手ぶれベクトルを積分しておくようにする。また、手ぶれベクトル検出部15では、2枚目以降の画像フレームの、1枚目の基準画像フレームに対する相対的な回転角度が検出される。
手ぶれベクトル検出部15は、検出した1枚目の画像フレームに対する2枚目以降の画像フレームのそれぞれについての相対的な手ぶれベクトルと回転角度の情報をCPU1に供給する。
そして、フレームメモリ42に格納されている2枚目以降の画像は、算出された1枚目のフレームの基準画像との相対手ぶれ成分(平行移動量の成分)を相殺するように、CPU1の制御により、フレームメモリ42から読み出されて、回転・平行移動加算部19に供給される。このフレームメモリ42からの相対手ぶれ成分にしたがった切り出しにより、回転平行移動加算部19には、手ぶれによる平行移動量が除去された状態で供給される。
回転・平行移動加算部19では、CPU1からの制御信号により、1枚目の基準画像フレームに対する相対回転角度に応じてフレームメモリ42から読み出された2枚目以降の画像フレームのそれぞれが回転させられて、フレームメモリ43から読み出された画像フレームに対して加算もしくは平均化される。その加算もしくは平均結果の画像フレームは、フレームメモリ43に書き戻される。
そして、フレームメモリ44の画像フレームのデータは、CPU1の制御指示に応じた所定の解像度および所定の画像サイズとなるように切り出されて解像度変換部16に供給される。解像度変換部16は、CPU1からの制御を受けて、CPU1の制御指示に応じた所定の解像度および所定の画像サイズの画像データを生成して、出力する処理を実行する。
この解像度変換部16からの手ぶれが除去された画像データは、NTSC(National Television System Committee)エンコーダ18によりNTSC方式の標準カラー映像信号に変換され、電子式ビューファインダーを構成するモニターディスプレイ6に供給され、撮影時の画像がその表示画面にモニター表示される。
このモニター表示と並行して、解像度変換部16からの手ぶれが除去された画像データはコーデック部17で記録変調などのコーディング処理された後、記録再生装置部5に供給されて、DVD(Digital Versatile Disc)などの光ディスクやハードディスクなどの記録媒体に記録される。
この記録再生装置部5の記録媒体に記録された撮像画像データは、ユーザ操作入力部3を通じた再生開始操作に応じて読み出され、コーデック部17に供給されて、再生デコードされる。そして、再生デコードされた画像データはNTSCエンコーダ18を通じてモニターディスプレイ6に供給され、再生画像がその表示画面に表示される。なお、図1では、図示を省略したが、NTSCエンコーダ18からの出力映像信号は、映像出力端子を通じて外部に導出することが可能とされている。
上述した手ぶれベクトル検出部15は、ハードウエアにより構成することできるし、また、DSP(Digital Signal Processor)を用いて構成することもできる。さらには、CPU1によりソフトウエア処理とすることもできる。また、ハードウエアやDSP処理と、CPU1によるソフトウエア処理との組み合わせとすることもできる。
手ぶれベクトル検出部15では、相対的なフレーム間のブロック毎動きベクトルおよびグローバル動きベクトルの算出のみを行い、相対的な高精度のグローバル動きベクトルや平行移動量、回転角度の算出、また、1枚目に対する平行移動量および回転角度の算出処理は、CPU1が実行するようにしても良い。
なお、この実施形態では、回転・平行移動加算部19においては、後述するように、「単純加算」、「平均加算」、「トーナメント加算」の3通りのフレーム加算処理方法が、実行できるようにされている。そして、ユーザ操作入力部3には、それら3通りのフレーム加算処理方法のいずれを実行するかを指定する選択指定操作手段(図1では図示を省略)が設けられ、CPU1は、ユーザのこの選択指定操作手段を通じた選択指定に応じた選択制御信号を回転・平行移動加算部19に供給する。回転・平行移動加算部19は、3通りのフレーム加算処理方法のうちの、CPU1からの選択制御信号により指定されるフレーム加算処理方法を実行する。
[手ぶれベクトル検出部15における処理動作]
[第1の例]
この実施形態における手ぶれベクトル検出部15における処理動作の流れの第1の例を、図39〜図42のフローチャートを参照して、以下に説明する。この第1の例は、参照フレームについてのグローバル動きベクトルから平行移動量および回転角度を算出するようにする場合である。
なお、この図39〜図42は、一つの参照フレームについての処理であり、この図39〜図42の処理ルーチンが各参照フレームにおいて実行されるものである。この場合に、ステップS31の1回目のサーチ範囲の設定処理は、最初の参照フレームについて設定したら、その後の参照フレームにおいては省略することができる。
まず、1回目検波について説明する。前述の図35に示したように、16個のターゲットブロックについての16個のサーチ範囲について、それぞれのターゲットブロックの中心位置を、それぞれのサーチ範囲の中心としてサーチ範囲のオフセットをゼロに設定すると共に、それぞれのサーチ範囲を、この実施形態において想定される最大範囲に設定する(図39のステップS31)。
次に、16個のターゲットブロックについて、それぞれ設定されたサーチ範囲において前述した縮小SADテーブルおよびブロック毎動きベクトルの算出処理を実行する(ステップS32)。このステップS32の詳細処理ルーチンは後述する。
そして、16個のターゲットブロックについての縮小SADテーブルの生成が終了すると、16個の縮小SADテーブルにおいて、図4に示した(式3)により、サーチ範囲のそれぞれで対応する参照ブロック位置のSAD値を合算する処理を行い、縮小SADテーブルと同一サイズである一つのサーチ範囲内の複数参照ブロック位置分の合算縮小SADテーブルを生成する(ステップS33)。
次に、生成した合算縮小SADテーブルにおいて、最小SAD値を検出し、検出した最小SAD値とその近傍の複数SAD値を用いて、前述した近似曲面補間の処理を行って、合算動きベクトルを算出する(ステップS34)。
次に、ステップS34で算出された合算動きベクトルを基準にして、16個の縮小SADテーブルのSAD値と、ブロック毎動きベクトルとから、図13に示した条件の判定を行い、16個のターゲットブロックのそれぞれについての縮小SADテーブルについての前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付けおよび当該参照フレームについての合計スコアsum_scoreの算出処理を行う。そして、算出されたそれらのラベル付け結果および合計スコアsum_scoreを保持する(ステップS35)。なお、このとき、「NEAR_TOP」、「OTHERS」のラベル付けをしたターゲットブロックについては、信頼性が低いため使用しないことを意味するマスクフラグが設定される。
次に、ステップS32で算出された16個のブロック毎動きベクトルについて多数決を取り(ステップS36)、多数決トップのブロック毎動きベクトルを基準にして、16個の縮小SADテーブルのSAD値と、ブロック毎動きベクトルとから、前述したような図12に対応する条件の判定を行い、16個のターゲットブロックのそれぞれについてのSADテーブルについての前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付けおよび当該参照フレームについての合計スコアmany_scoreの算出処理を行い、算出されたそれらのラベル付け結果および合計スコアmany_scoreを保持する(ステップS37)。
そして、ステップS34で算出した合算動きベクトルと、ステップS36での多数決処理の結果、検出される多数決トップの動きベクトルとを比較し、両動きベクトルが縮小SADテーブル上の座標位置として、1隣接以内(座標位置が上下左右斜め方向に1位置しか違わない)であるか否か判別する(ステップS38)。
ステップS38で、合算動きベクトルと多数決トップの動きベクトルとの差異が1隣接以内ではないと判別したときには、当該参照フレームのグローバル動きベクトルは信頼性が無いと判断して、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする(ステップS39)。そして、この処理ルーチンを終了する。
また、ステップS38で、合算動きベクトルと多数決トップの動きベクトルとの差異が1隣接以内であると判別したときには、ステップS35で求められた合計スコアsum_scoreが予め定められた所定の閾値θth1以上であり、かつ、ステップS37で求められた合計スコアmany_scoreが予め定められた所定の閾値θth2以上であるか否か判別する(図40のステップS41)。
ステップS41で、合計スコアsum_scoreおよび合計スコアmany_scoreの一方または両者が、閾値θth1および閾値θth2以上である条件を満足しなかったときには、ステップS39に進んで、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする。そして、この処理ルーチンを終了する。
また、ステップS41で、合計スコアsum_scoreおよび合計スコアmany_scoreの両者が、閾値θth1および閾値θth2以上である条件を満足したときには、ステップS35でラベル付けされたターゲットブロックに対するSADテーブルのうち、「TOP」および「NEXT_TOP」のラベルが付与されたSADテーブルのSAD値のみを用いて、合算SAD値を再算出し、合算縮小SADテーブルを再算出する(ステップS42)。
そして、再作成により求めた再合算縮小SADテーブルにおける最小SAD値の座標位置およびその近傍座標位置の複数個のSAD値を用いて近似曲面補間処理を行う(ステップS43)。この例では、このステップS43では、図23を用いて説明した3×3個の矩形領域のテーブル要素を用いる近似曲面補間処理を実行する。
そして、この近似曲面補間処理の結果として検出される動きベクトルを、グローバル動きベクトルとして、2回目検波の際のサーチ範囲オフセットを設定するために用いるために確保する(ステップS44)。
次に、手ぶれベクトル検出部15は、図41および図42に示す2回目検波を続いて実行する。
すなわち、16個のターゲットブロックについての16個のサーチ範囲を、図15(B)に示したように、ステップS39で確保した1回目検波で得られたグローバル動きベクトル分、つまり、平行移動量分だけオフセットした位置を中心としたものとし、かつ、1回目検波時よりも狭い範囲として設定する(図41のステップS51)。
次に、16個のターゲットブロックについて、それぞれ設定されたサーチ範囲において前述した縮小SADテーブルおよびブロック毎動きベクトルの算出処理を実行する(ステップS52)。
そして、ステップS52での複数個のターゲットブロックについての縮小SADテーブルの生成が終了すると、1回目検波でマスクフラグが立てられたターゲットブロックを除く、ラベル「TOP」および「NEXT_TOP」のターゲットブロックについての縮小SADテーブルにおいて、図4に示した(式3)により、サーチ範囲のそれぞれで対応する参照ブロック位置のSAD値を合算する処理を行い、縮小SADテーブルと同一サイズである一つのサーチ範囲内の複数参照ブロック位置分の合算縮小SADテーブルを生成する(ステップS53)。なお、ステップS52の縮小SADテーブルおよびブロック毎動きベクトルの算出処理を、1回目検波でマスクフラグが立てられたターゲットブロックを除く、ラベル「TOP」および「NEXT_TOP」のターゲットブロックについてのみ行うようにしても良い。
次に、ステップS53で生成した合算縮小SADテーブルにおいて、最小SAD値を検出し、検出した最小SAD値とその近傍の複数SAD値を用いて、前述した近似曲面補間の処理を行って、小数精度の合算動きベクトルを算出する(ステップS54)。
次に、ステップS54で算出された合算動きベクトルを基準にして、1回目検波でマスクフラグが立てられていないターゲットブロックについての縮小SADテーブルのSAD値と、そのブロック毎動きベクトルとから、図13に示した条件の判定を行い、前記のターゲットブロックのそれぞれについての縮小SADテーブルについての前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付けおよび当該参照フレームについての合計スコアsum_scoreの算出処理を再度行い、算出されたそれらのラベル付け結果および合計スコアsum_scoreを保持する(ステップS55)。なお、この際にも、新たに「NEAR_TOP」、「OTHERS」のラベル付けがなされたターゲットブロックについては、信頼性が低いため使用しないことを意味するマスクフラグが設定される。
次に、ステップS52で算出されたブロック毎動きベクトルのうちの、1回目検波でマスクフラグが立てられていないターゲットブロックについてのブロック毎動きベクトルについて多数決を取り(ステップS56)、その結果としての多数決トップのブロック毎動きベクトルを基準にして、前記マスクフラグが立てられていないターゲットブロックの縮小SADテーブルのSAD値と、そのブロック毎動きベクトルとから、前述したような図9に対応する条件の判定を行い、前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付けおよび当該参照フレームについての合計スコアmany_scoreの算出処理を行い、算出されたそれらのラベル付け結果および合計スコアmany_scoreを保持する(ステップS57)。
そして、ステップS54で算出した合算動きベクトルと、ステップS56での多数決処理の結果、検出される多数決トップの動きベクトルとを比較し、両動きベクトルが縮小SADテーブル上の座標位置として、1隣接以内(座標位置が上下左右斜め方向に1位置しか違わない)であるか否か判別する(ステップS58)。
ステップS58で、合算動きベクトルと多数決トップの動きベクトルとの差異が1隣接以内ではないと判別したときには、当該参照フレームのグローバル動きベクトルは信頼性が無いと判断して、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする(ステップS59)。そして、この処理ルーチンを終了する。
また、ステップS58で、合算動きベクトルと多数決トップの動きベクトルとの差異が1隣接以内であると判別したときには、ステップS55で求められた合計スコアsum_scoreが予め定められた所定の閾値θth3以上であり、かつ、ステップS37で求められた合計スコアmany_scoreが予め定められた所定の閾値θth4以上であるか否か判別する(図42のステップS61)。
ステップS61で、合計スコアsum_scoreおよび合計スコアmany_scoreの一方または両者が、閾値θth3および閾値θth4以上である条件を満足しなかったときには、ステップS59に進んで、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする。そして、この処理ルーチンを終了する。
また、ステップS61で、合計スコアsum_scoreおよび合計スコアmany_scoreの両者が、閾値θth3および閾値θth4以上である条件を満足したときには、ステップS55でラベル付けされたターゲットブロックに対するSADテーブルのうち、「TOP」および「NEXT_TOP」のラベルが付与されたSADテーブルのSAD値のみを用いて、合算SAD値を再算出し、合算縮小SADテーブルを再算出する(ステップS62)。
そして、再作成により求めた再合算縮小SADテーブルにおける最小SAD値の座標位置およびその近傍座標位置の複数個のSAD値を用いて近似曲面補間処理を行い、グローバル動きベクトルとしての合算動きベクトルを算出し、保持する(ステップS63)。この例では、このステップS63では、図23を用いて説明した3×3個の矩形領域のテーブル要素を用いる近似曲面補間処理を実行する。
そして、算出された合算動きベクトルにより、当該フレームの静止画についての一つ前フレームに対する相対的な平行移動量を決定し、この決定した平行移動量を積算することにより、1枚目のフレームに対する平行移動量を算出する(ステップS64)。
次に、一つ前のフレームについて同様にして検出されて保持されている合算動きベクトルと、ステップS63で検出された当該フレームの合算動きベクトルとの間の回転角度として、当該フレームの静止画についての一つ前のフレームに対する相対的な回転角度を算出し、この算出した回転角度を積算することにより、1枚目のフレームに対する回転角度を算出する(ステップS65)。
手ぶれベクトル検出部15は、以上により手ぶれによるフレーム単位の平行移動量および回転角度の算出処理を終了し、算出結果の平行移動量および回転角度をCPU1に供給する。そして、算出結果の平行移動量および回転角度が用いられて、回転・平行移動加算部19で、1枚目のフレームに対する重ね合わせの処理が実行される。
なお、上述の説明では、ステップS64およびステップS65では、1枚目のフレームに対する平行移動量および回転角度をも算出するようにしたが、これらのステップS64およびステップS65では、一つ前のフレームに対する相対的な平行移動量および回転角度の算出のみを行うようにして、1枚目のフレームに対する平行移動量および回転角度の算出は、CPU1が行うようにしても良い。
以上で、1つの参照フレームについての手ぶれベクトル検出部15における処理動作は終了となる。
なお、図39および図40、また、図41および図42のフローチャートにおいて、ステップS31〜ステップS34までの処理、また、ステップS51〜ステップS54までの処理を手ぶれベクトル検出部15で行い、それ以降の処理をCPU1がソフトウエアにより処理するように構成してもよい。
また、手ぶれベクトル(グローバル動きベクトル)の検出に際しては、上述のようにしてグローバル動きベクトルを確保する処理手法に、さらに、従来から提案されている時間軸方向の動きベクトルの周波数から、グローバル動きベクトルを予測する手法を組み合わせることにより、更なる信頼性並びに精度の向上を図るようにしても良い。
また、上述の例では、再合成縮小SADテーブルは、ステップS35またはステップS55でラベル付けをした各ブロックのうちの「TOP」および「NEXT_TOP」のラベルが付与されたブロックの縮小SADテーブルのSAD値のみを用いるようにしたが、ステップS37またはステップS57でラベル付けした各ブロックのうちの「TOP」および「NEXT_TOP」のラベルが付与されたブロックの縮小SADテーブルのSAD値のみを用いるようにしても良いし、さらには、ステップS35またはステップS55とステップS37またはステップS57の両方でラベル付けをした各ブロックのうちの「TOP」および「NEXT_TOP」のラベルが付与されたブロックの縮小SADテーブルのSAD値を用いて、再合算縮小SADテーブルを生成するようにしても良い。
また、上述の例においては、各ブロック毎動きベクトルに付与したラベルに対応するスコアの合計sum_scoreおよびmany_scoreを、動きベクトルを算出している対象の参照フレームについてのグローバル動きベクトルの評価判定の一つの材料としたが、この合計スコアの代わりに、ブロック毎動きベクトルに付与されたラベルが「TOP」および「NEXT_TOP」の数が所定の閾値以上であるか否かを評価判定の材料とし、ラベルが「TOP」および「NEXT_TOP」の数が所定の閾値以上であれば、高評価であると判定するようにしても良い。
[第2の例]
この実施形態における手ぶれベクトル検出部15における処理動作の流れの第2の例を、図43〜図45のフローチャートを参照して、以下に説明する。この第2の例は、参照フレームについてのブロック毎動きベクトルのうちの、信頼性の高いブロック毎動きベクトルのみを用いて、前述した図5〜図8に示したような手法により、参照フレームについての平行移動量および回転角度を算出するようにする場合である。
この図43〜図45の処理も、一つの参照フレームについての処理であり、この図43〜図45の処理ルーチンが各参照フレームにおいて実行されるものである。この場合に、ステップS71の1回目のサーチ範囲の設定処理は、最初の参照フレームについて設定したら、その後の参照フレームにおいては省略することができる。
まず、1回目検波について説明する。前述の図35に示したように、16個のターゲットブロックについての16個のサーチ範囲について、それぞれのターゲットブロックの中心位置を、それぞれのサーチ範囲の中心としてサーチ範囲のオフセットをゼロに設定すると共に、それぞれのサーチ範囲を、この実施形態において想定される最大範囲に設定する(図43のステップS71)。
次に、16個のターゲットブロックについて、それぞれ設定されたサーチ範囲において前述した縮小SADテーブルおよびブロック毎動きベクトルの算出処理を実行する(ステップS72)。このステップS72の詳細処理ルーチンは後述する。
そして、16個のターゲットブロックについての縮小SADテーブルの生成が終了すると、16個の縮小SADテーブルにおいて、図4に示した(式3)により、サーチ範囲のそれぞれで対応する参照ブロック位置のSAD値を合算する処理を行い、縮小SADテーブルと同一サイズである一つのサーチ範囲内の複数参照ブロック位置分の合算縮小SADテーブルを生成する(ステップS73)。
次に、生成した合算縮小SADテーブルにおいて、最小SAD値を検出し、検出した最小SAD値とその近傍の複数SAD値を用いて、前述した近似曲面補間の処理を行って、合算動きベクトルを算出する(ステップS74)。
次に、ステップS74で算出された合算動きベクトルを基準にして、16個の縮小SADテーブルのSAD値と、ブロック毎動きベクトルとから、図13に示した条件の判定を行い、16個のターゲットブロックのそれぞれについての縮小SADテーブルについての前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付けを行う。このとき、「NEAR_TOP」、「OTHERS」のラベル付けをしたターゲットブロックについては、信頼性が低いため使用しないことを意味するマスクフラグを立てる(ステップS75)。
次に、ラベル「TOP」が付与されたターゲットブロックの数が、予め定められた所定の閾値θth5未満であるか否か判別する(ステップS76)。ラベル「TOP」が付与されたターゲットブロックの数が、閾値θth5未満であると判別したときには、ラベル「NEXT_TOP」が付与されたターゲットブロックの数が、予め定められた所定の閾値θth6未満であるか否か判別する(ステップS77)。
このステップS77で、ラベル「NEXT_TOP」が付与されたターゲットブロックの数が、閾値θth6未満であると判別したときには、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする(ステップS78)。そして、この処理ルーチンを終了する。
また、ステップS76でラベル「TOP」が付与されたターゲットブロックの数が、閾値θth5以上であると判別したとき、また、ステップS77でラベル「NEXT_TOP」が付与されたターゲットブロックの数が、閾値θth6以上であると判別したときには、マスクフラグが立っていないラベルが「TOP」および「NEXT_TOP」のターゲットブロックの縮小SADテーブルについて、前述した図20、図23、図26、図30により説明したような近似曲面補間の処理を行って、高精度(小数点精度)のブロック毎動きベクトルを算出する(ステップS79)。
次に、前述の図5および図6を用いて説明したようにして、ステップS79で算出された信頼性の高いブロック毎動きベクトルのみを用いて当該フレームについての前フレームに対する平行移動量の算出を行う(ステップS80)。ここで、算出された平行移動量は、前述の第1の例におけるグローバル動きベクトルに対応するものであり、これは2回目検波の際のサーチ範囲のオフセットの設定に利用される。以上で、1回目検波の処理は終了である。
次に、手ぶれベクトル検出部15は、図44および図45に示す2回目検波を続いて実行する。
すなわち、16個のターゲットブロックについての16個のサーチ範囲を、図15(B)に示したように、ステップS80で確保した1回目検波で得られた平行移動量分だけオフセットした位置を中心としたものとし、かつ、1回目検波時よりも狭い範囲として設定する(図44のステップS81)。
次に、16個のターゲットブロックについて、それぞれ設定されたサーチ範囲において前述した縮小SADテーブルおよびブロック毎動きベクトルの算出処理を実行する(ステップS82)。
そして、ステップS82での複数個のターゲットブロックについての縮小SADテーブルの生成が終了すると、1回目検波でマスクフラグが立てられたターゲットブロックを除く、ラベル「TOP」および「NEXT_TOP」のターゲットブロックについての縮小SADテーブルにおいて、図4に示した(式3)により、サーチ範囲のそれぞれで対応する参照ブロック位置のSAD値を合算する処理を行い、縮小SADテーブルと同一サイズである一つのサーチ範囲内の複数参照ブロック位置分の合算縮小SADテーブルを生成する(ステップS83)。なお、ステップS82の縮小SADテーブルおよびブロック毎動きベクトルの算出処理を、1回目検波でマスクフラグが立てられたターゲットブロックを除く、ラベル「TOP」および「NEXT_TOP」のターゲットブロックについてのみ行うようにしても良い。
次に、ステップS83で生成した合算縮小SADテーブルにおいて、最小SAD値を検出し、検出した最小SAD値とその近傍の複数SAD値を用いて、前述した近似曲面補間の処理を行って、小数精度の合算動きベクトルを算出する(ステップS84)。
次に、ステップS84で算出された合算動きベクトルを基準にして、1回目検波でマスクフラグが立てられていないターゲットブロックについての縮小SADテーブルのSAD値と、そのブロック毎動きベクトルとから、図13に示した条件の判定を行い、前記のターゲットブロックのそれぞれについての縮小SADテーブルについての前述したような「TOP」、「NEXT_TOP」、「NEAR_TOP」、「OTHERS」のラベル付け行うとともに、「NEAR_TOP」、「OTHERS」のラベル付けをしたターゲットブロックについては、信頼性が低いため使用しないことを意味するマスクフラグを立てる(ステップS85)。
次に、マスクフラグが立てられていないターゲットブロックの数が、予め定められている所定の閾値θth7未満であるか否か判別し(ステップS86)、所定の閾値θth7未満であると判別したときには、当該参照フレームは、静止画手ぶれ補正のための重ね合わせ処理をするフレームから除外し、その後の処理をスキップする(ステップS87)。そして、この処理ルーチンを終了する。
ステップS86で、マスクフラグが立てられていないターゲットブロックの数が、予め定められている所定の閾値θth7以上であると判別したときには、マスクフラグが立っていないラベルが「TOP」および「NEXT_TOP」のターゲットブロックの縮小SADテーブルについて、前述した図20、図23、図26、図30により説明したような近似曲面補間の処理を行って、高精度(小数点精度)のブロック毎動きベクトルを算出する(ステップS88)。
次に、前述の図5および図6を用いて説明したようにして、ステップS88で算出された信頼性の高いブロック毎動きベクトルのみを用いて当該フレームについての前フレームに対する平行移動量(α,β)の算出を行う(図45のステップS91)。
また、前述の図6〜図8を用いて説明したようにして、ステップS88で算出された信頼性の高いブロック毎動きベクトルのみを用いて当該フレームについての前フレームに対する回転角度γの算出を行う(ステップS92)。
次に、ステップS91で求められた平行移動量(α,β)と、ステップS92で求められた回転角度γとを元にして、各ターゲットブロックについての理想的なブロック毎動きベクトルを算出し、その理想的なブロック毎動きベクトルと、実際に算出された各ターゲットブロックについてのブロック毎動きベクトルViとの誤差ERRiを計算するとともに、その総和ΣERRiを算出する(ステップS93)。ここで、誤差ERRiは、図46の(式H)により算出することができる。そして、算出された誤差の総和ΣERRiは、当該フレームの誤差の総和となる。
なお、前述の(式6)について説明したように、複数の被験者による手ぶれによる回転角度の測定値は、非常に小さいことが確認されており、このため、回転行列Rについては、cosγ≒1、sinγ≒γであるとすることができるので、図46のように表すことができるものである。
次に、ステップS93で算出された誤差の総和ΣERRiが、予め定められている所定の閾値θth8未満であるか否か判別し(ステップS94)、所定の閾値θth8未満ではないと判別したときには、ステップS93で算出された各ターゲットブロックについてのブロック毎動きベクトルViの誤差ERRiのうちで、最大値となっているターゲットブロックについてマスクフラグを立てる(ステップS95)。
そして、ステップS95の次には、図44のステップS83に戻り、マスクフラグが立てられたターゲットブロックを除くターゲットブロックについての縮小SADテーブルにおいて、図4に示した(式3)により、サーチ範囲のそれぞれで対応する参照ブロック位置のSAD値を合算する処理を再度行い、縮小SADテーブルと同一サイズである一つのサーチ範囲内の複数参照ブロック位置分の合算縮小SADテーブルを生成する。そして、前述したステップS84以降の処理を繰り返すようにする。
また、ステップS94で、ステップS93で算出された誤差の総和ΣERRiが、所定の閾値θth8未満であると判別したときには、ステップS91およびステップS92で算出された平行移動量(α,β)および回転角度γを、手ぶれ成分として確定し、この2回目検波処理を終了する。
そして、手ぶれベクトル検出部15は、算出結果の平行移動量および回転角度をCPU1に供給する。CPU1は、受け取った算出結果の平行移動量および回転角度から、1枚目のフレームに対する平行移動量および回転角度を算出し、それを回転・平行移動加算部19に渡す。そして、回転・平行移動加算部19では、受け取った平行移動量および回転角度を用いて、1枚目のフレームに対する重ね合わせの処理を実行する。
なお、この第2の例においても、手ぶれベクトル検出部15で、1枚目のフレームに対する平行移動量および回転角度を算出してもよい。
また、この例においても、図43のステップS71〜ステップS74までの処理、および図44のステップS81〜ステップS84までの処理を手ぶれベクトル検出部15で行い、それ以降の処理をCPU1がソフトウエアにより処理するように構成してもよい。
また、上述の例では、ブロック毎動きベクトルの信頼性の判定を行うグローバル動きベクトルは、合算動きベクトルを用いるようにしたが、多数決トップの動きベクトルを基準に用いても良い。
なお、1回目検波の場合には、上述した図38に示したような第1の例の方法を用いて、グローバル動きベクトルとしての合算動きベクトルから第2の検波のサーチ範囲オフセットを定め、2回目検波は、図44および図45を用いて説明した第2の例の方法を用いるようにしても良い。
すなわち、1回目検波の場合、元々、各ブロック毎動きベクトルの精度がそれほど期待できないため、図5および図6を用いた平行移動量を求める手法を用いずに、ラベル「TOP」および「NEXT_TOP」のターゲットブロックについてのブロックマッチングの結果から求めたグローバル動きベクトルにより、2回目の検波のサーチ範囲オフセットを定めるようにしても良い。
一般に、手ぶれに回転成分が含まれている場合には、より確度の高い手ぶれの平行移動成分の算出方法として、図5および図6を用いて説明した手法が有効であるが、この手法が活かせるのは、精度の高いブロック毎動きベクトルが得られる2回目以降の検波時であるからである。
なお、1回目検波の後、グローバル動きベクトルや平行移動量のみにより2回目検波のサーチオフセットを定めるのではなく、1回目検波の後、前のフレームのグローバル動きベクトルとの間での回転角度や、前述した図7および図8を用いて説明した回転角度の算出方法により回転角度までも算出しておき、2回目検波のサーチ範囲オフセットを、回転角度にも併せて、各ターゲットブロック毎に独立して設定するようにしても良い。このようにした場合には、よりサーチ範囲を限定することができて、精度や処理速度の向上が期待できる。
また、上述の説明では、1回目検波および2回目検波の両方において、合算動きベクトルに近似するブロック毎動きベクトルを有効なブロック毎動きベクトルとしたが、2回目検波では、1回目検波でマスクフラグが立てられたターゲットブロック以外のすべてのターゲットブロックについてのブロック毎動きベクトルを有効とするようにしてもよい。2回目検波では、各ブロック毎動きベクトルの精度が高く、手ぶれの回転成分まで検出可能であるため、これらは平均化された合算動きベクトルトルと類似するとは限らない場合があるからである。
上述した手ぶれベクトル検出処理は、静止画の場合には、動画に比較して処理時間に余裕がある代わりに精度が要求されるため、非常に有効である。より精度を高めるために、上述のような2回検波ではなく、3回以上の複数回の検波を行うようにしても良い。その場合には、最終回までは、サーチ範囲オフセットを伴うサーチ範囲の絞り込み、および高信頼度のブロック毎動きベクトルの探索を行い、最終回において、例えば図44および図45に示したようにして、平行移動量および回転角度の算出をする。
[ステップS32、S52、S72、S82の処理ルーチン例]
次に、図39のステップS32、図41のステップS52、図43のステップS72および図44のステップS82における各ターゲットブロックについての縮小SADテーブル生成処理およびブロック毎動きベクトル算出の処理ルーチンの例を説明する。
<第1の例>
図47および図48は、ステップS32、S52、S72、S82における各ターゲットブロックについての縮小SADテーブルおよびブロック毎動きベクトル算出処理ルーチンの第1の例を示すものである。
先ず、前述の図35に示したようなサーチ範囲SR内の1つの参照ブロック位置に対応する参照ベクトル(vx、vy)を指定する(ステップS101)。前述したように、(vx,vy)は、ターゲットブロックのフレーム上の位置(サーチ範囲の中心位置である)を基準位置(0,0)としたときに、指定された参照ベクトルにより示される位置を示し、vxは指定された参照ベクトルによる、基準位置からの水平方向のずれ量成分であり、また、vyは指定された参照ベクトルによる、基準位置からの垂直方向成分のずれ量成分である。そして、前述の従来例で述べたのと同様に、ずれ量vx、vyは、画素を単位とした値とされている。
ここで、サーチ範囲の中心位置を前記基準位置(0,0)とし、サーチ範囲を、水平方向には±Rx、垂直方向には±Ryとしたとき、
−Rx≦vx≦+Rx、−Ry≦vy≦+Ry
とされるものである。
次に、ターゲットブロックIo内の1つの画素の座標(x,y)を指定する(ステップS102)。次に、ターゲットブロックIo内の指定された1つの座標(x,y)の画素値Io(x,y)と、参照ブロックIi内の対応する画素位置の画素値Ii(x+vx,y+vy)との差分絶対値αを、前述した(式1)に示したようにして算出する(ステップS103)。
そして、算出した差分絶対値αを、当該参照ブロックIiの参照ベクトル(vx,vy)が指し示すアドレス(テーブル要素)の、それまでのSAD値に加算し、その加算であるSAD値を、当該アドレスに書き戻すようにする(ステップS104)。すなわち、参照ベクトル(vx,vy)に対応するSAD値を、SAD(vx,vy)と表したとき、これを、前述した(式2)、すなわち、
SAD(vx,vy)=Σα=Σ|Io(x,y)−Ii(x+vx,y+vy)|
・・・(式2)
として算出し、当該参照ベクトル(vx,vy)が指し示すアドレスに書き込むようにする。
次に、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記のステップS102〜ステップS104の演算を行なったか否かを判別し(ステップS105)、ターゲットブロックIo内の全ての座標(x,y)の画素については、未だ、その演算は終了していないと判別したときには、ステップS102に戻り、ターゲットブロックIo内の次の座標(x,y)の画素位置を指定し、このステップS102以降の処理を繰り返す。
以上のステップS101〜ステップS105までの処理は、図80に示したフローチャートのステップS1〜ステップS5と全く同様である。
この実施形態では、ステップS105で、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったと判別したときには、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS106)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS107)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS104で求めたSAD値から、線形加重分散値として求める(ステップS108)。そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS109)。
このステップS109が終了すると、注目中の参照ブロックについてのSAD値の算出が終了したと判別して、サーチ範囲内の全ての参照ブロック、すなわち、全ての参照ベクトル(vx,vy)についての上記のステップS101からステップS109までの演算処理を完了したか否か判別する(図48のステップS111)。
ステップS111で、未だ、上記の演算処理を完了していない参照ベクトル(vx,vy)があると判別すると、ステップS101に戻り、上記の演算処理を完了していない次の参照ベクトル(vx,vy)を設定して、このステップS101以降の処理を繰り返す。
そして、ステップS111で、上記の演算処理を完了していない参照ベクトル(vx,vy)はサーチ範囲内になくなったと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS112)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS113)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS114)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求めるべく動きベクトル(px×n,py×n)を算出する(ステップS115)。
以上で、1つのターゲットブロックに対する、この実施形態におけるブロックマッチングによる動きベクトルの検出処理は、終了となる。図35に示したような、1フレームについて設定した複数個、この例では、16個のターゲットブロックについての縮小SADテーブルおよび動きベクトルを算出する場合、対象とするターゲットブロックを変える毎に、サーチ範囲および縮小倍率1/nを再設定して、上述の図47および図48に示した処理を、各分割領域について繰り返すものである。
なお、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
なお、図47および図48のフローチャートにおいて、ステップS101〜ステップS111までの処理を手ぶれベクトル検出部15で行い、それ以降の処理をCPU1がソフトウエアにより処理するように構成してもよい。
<第2の例>
上述の第1の例においては、1つの参照ブロック(参照ベクトル)について、そのSAD値を求めた後、そのSAD値から、参照縮小ベクトルの近傍の複数参照ベクトルについての分散加算値を求め、分散加算処理を行なうようにした。
これに対して、この第2の例においては、参照ブロック内の各画素の、ターゲットブロックの画素との差分を検出したときに、その差分値から、参照縮小ベクトルの近傍の複数参照ベクトルについての分散加算値(SAD値ではなく差分値)を求め、求めた差分値を分散加算処理するようにする。この第2の例によれば、1つの参照ブロック内のすべての画素についての差分演算を終了したときには、縮小SADテーブルが生成されることになる。
図49および図50は、この第2の例による動きベクトル検出処理のフローチャートを示すものである。
図49のステップS121〜ステップS123までの処理は、図47のステップS101〜ステップS103までの処理と全く同様であるので、ここでは、その詳細な説明は省略する。
この第2の例においては、ステップS123で、座標(x,y)の画素についての参照ブロックとターゲットブロック間での差分値αが算出すると、次には、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS124)。
次に、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS125)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき差分値を、前述したように、ステップS123で求めた差分値αから、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、線形加重分散値(差分値)として求める(ステップS126)。
そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するテーブル要素値に加算する(ステップS127)。
このステップS127が終了したら、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記のステップS122〜ステップS127の演算を行なったか否かを判別し(ステップS128)、ターゲットブロックIo内の全ての座標(x,y)の画素については、未だ、その演算は終了していないと判別したときには、ステップS122に戻り、ターゲットブロックIo内の次の座標(x,y)の画素位置を指定し、このステップS122以降の処理を繰り返す。
ステップS128で、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったと判別したときには、注目中の参照ブロックについてのSAD値の算出が終了したと判別して、サーチ範囲内の全ての参照ブロック、すなわち、全ての参照ベクトル(vx,vy)についての上記のステップS121からステップS128までの演算処理を完了したか否か判別する(図50のステップS131)。
ステップS131で、未だ、上記の演算処理を完了していない参照ベクトル(vx,vy)があると判別すると、ステップS121に戻り、上記の演算処理を完了していない次の参照ベクトル(vx,vy)を設定して、このステップS121以降の処理を繰り返す。
そして、ステップS121で、上記の演算処理を完了していない参照ベクトル(vx,vy)はサーチ範囲内になくなったと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS132)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS133)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS134)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求めるべく動きベクトル(px×n,py×n)を算出する(ステップS135)。
以上で、1つのターゲットブロックに対する、この第2の例におけるブロックマッチングによる動きベクトルの検出処理は、終了となる。図35に示したような、1フレームについて設定した複数個、この例では、16個のターゲットブロックについての縮小SADテーブルおよび動きベクトルを算出する場合、対象とするターゲットブロックを変える毎に、サーチ範囲および縮小倍率1/nを再設定して、上述の図49および図50に示した処理を、各分割領域について繰り返すものである。
なお、この第2の例においても、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
なお、図49および図50のフローチャートにおいて、ステップS121〜ステップS131までの処理を手ぶれベクトル検出部15で行い、それ以降の処理をCPU1がソフトウエアにより処理するように構成してもよい。
<第3の例>
図34に示したように、この実施形態による動きベクトルの検出手法を用いた場合には、参照ベクトルの縮小倍率が1/64の場合でも、全く異なる動きベクトルを出力するような破綻は見られないことから、実質的に1/4096に、SADテーブルを削減可能である。
つまり、1/4096に削減した縮小SADテーブルを用意しておき、縮小倍率1/64で1回目の動きベクトルを算出する。次に、1回目で検出したその動きベクトルを中心にしてサーチ範囲を狭め、2回目の検出を、1回目よりも小さい例えば縮小倍率1/8で行なうようにすればよい。すなわち、1回目と2回目とで縮小倍率を変えて、1回目のベクトル誤差範囲内に収まるように、2回目の縮小倍率を設定すれば、かなりの高精度で、動きベクトル検出が可能である。
この第3の例の場合における動きベクトル検出処理を、図51〜図54のフローチャートを参照しながら説明する。
この図51〜図54に示す第3の例は、基本的な動き検出処理として上述した第1の例を用いている。したがって、図51のステップS141〜ステップS149の処理ステップおよび図52のステップS151〜ステップS155までの処理ステップは、図47のステップS101〜ステップS109の処理ステップおよび図48のステップS111〜ステップS115までの処理ステップと全く同様である。
この第3の例においては、図52のステップS155で動きベクトルを算出したら、そこで処理を終了するのではなく、当該ステップS155で算出した動きベクトルは、1回目の動きベクトルとして、次のステップS156において、この1回目で算出した動きベクトルに基づき、同じ参照フレーム内で、サーチ範囲を絞り、また、参照ベクトルの縮小倍率を、1回目の縮小倍率1/naよりも小さい縮小倍率1/nb(ここで、na>nbである)に変更する。
すなわち、図55に示すように、1回目の処理で設定されたサーチ範囲SR_1において、ターゲットブロックTBについての動きベクトルBLK_Viが算出されると、その算出された動きベクトルBLK_Viから、参照フレームと元フレームとの間で、相関のあるブロック範囲がおおよそ検出できる。そこで、2回目の処理のサーチ範囲SR_2としては、図55の下側に示すように、その相関のあるブロック範囲を中心とした、絞ったサーチ範囲を設定することができる。この場合、図52に示すように、1回目のサーチ範囲SR_1の中心位置POi_1と、2回目のサーチ範囲SR_2の中心位置POi_2との間の位置ずれ(サーチ範囲オフセット)が、1回目で検出された動きベクトルBLK_Viに相当している。
そして、この実施形態では、さらに、1回目よりも参照ベクトルに対する縮小倍率を小さくすることで、より誤差の少ない状態で、2回目の動きベクトルの算出が可能になると期待できる。
こうして、ステップS156で、絞ったサーチ範囲を設定し、新たな縮小倍率を設定したら、1回目と全く同様にして、2回目の動きベクトルの検出処理を、ステップS157〜ステップS158、図53のステップS161〜ステップS168、さらに、図54のステップS171〜ステップS174により実行する。これらのステップの処理は、図47のステップS101〜ステップS109の処理ステップおよび図48のステップS111〜ステップS115までの処理ステップと全く同様である。
こうして、最終的に、ステップS174において、2回目の動きベクトルとして、目的とするブロック毎動きベクトルが得られる。
以上の例は、ブロック毎動きベクトルの検出方法として、前述した第1の例を用い、それを2段階、繰り返した場合であるが、サーチ範囲をさらに絞り、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、繰り返すようにしても、勿論良い。
また、ブロック毎動きベクトルの検出方法としては、前述した第1の例の代わりに、前述した第2の例を用いることができることは言うまでもない。また、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは前述の例と同様である。
なお、図51〜図54のフローチャートにおいて、ステップS141〜ステップS168までの処理を手ぶれベクトル検出部15で行い、それ以降の処理をCPU1がソフトウエアにより処理するように構成してもよい。
[回転・平行移動加算部19での加算処理]
以上のようにして、手ぶれによる平行移動成分(フレームの平行移動量)と回転成分(フレームの回転角度)が、静止画のフレーム単位に求められると、回転・平行移動加算部19で、加算(重ね合わせ)処理が行われる。
この実施形態では、前述したように、様々な被写体に対して、ユーザが意図する通りに、いわゆる絵作りを行えるようにするため、この例では、3通りの加算手法を予め撮像装置に用意しておき、ユーザがその3通りの加算手法の中から、意図する絵作りに応じた加算手法を、ユーザ操作入力部3を通じて選択操作をすることにより、選択することができるようにしている。
なお、前述もしたように、この実施形態では、説明の簡単のために、静止画の被写体のみの場合としているが、本質的には動画にも適用可能である。動画の場合、リアルタイム性のため加算枚数に上限はあるが、フレーム毎にこの実施形態の手法を用いることにより、ノイズ・リダクション効果の高い動画を生成するシステムへの応用も、全く同じ手段で実現することができる。
この実施形態では、加算(重ね合わせ)手法として、単純加算手法、平均加算手法、トーナメント加算手法の3つの手法を、選択的に実現できるように、図1の例の撮像装置の回転・平行移動加算部19は構成されている。以下に、各手法の詳細を順に説明する。なお、この実施形態では、重ね合わせる画像フレームの枚数は、例えば8枚とされている。
(1)単純加算手法
この単純加算手法の場合における回転・平行移動加算部19と、画像メモリ4との関係を考慮したブロック図を図56に示す。この場合、回転・平行移動加算部19には、回転・平行移動処理部191と、ゲインアンプ192および193と、加算部194とが設けられる。
前述したように、画像メモリ4のフレームメモリ43は、加算後の画像フレームFmを格納するが、順次画像フレームが入力されて来る場合、1枚目の画像フレームF1が基準となるため、1枚目の画像フレームF1は、直接、このフレームメモリ43に書き込まれる。一方、2枚目以降の画像フレームFj(j=2,3,4・・・)は、画像メモリ4のフレームメモリ42に格納された後、回転・平行移動加算部19に供給される。なお、画像フレームの加算結果は平行移動量(α、β)および回転角度γに応じた分のずれ分を見込んだ画像フレームの大きさを想定する必要があるので、画像メモリ4の少なくともフレームメモリ43は、1フレーム分よりも平行移動(α、β)および回転角度γに応じた分のずれ分を見込んだ分だけ広い領域分を備えるメモリとされている。
回転・平行移動処理部191は、CPU1からの1枚目の画像フレームF1に対する平行移動量(α,β)および回転角度γの情報を受けて、2枚目以降の画像フレームFjを平行移動させ、また、回転させる。回転・平行移動処理部191は、1枚目の画像フレームF1に対する相対手ぶれを相殺するように、2枚目以降の画像フレームFjを、フレームメモリ42から読み出すことで平行移動および回転処理をする。
すなわち、回転・平行移動処理部191は、フレームメモリ43からの1枚目または加算結果後の画像フレームFmの画素と重ね合わせるべきフレームメモリ42からの2枚目以降の画像フレームの画素アドレスを、CPU1からの、画像フレームFjについての1枚目の画像フレームに対する平行移動量(α,β)および回転角度γの情報から計算し、フレームメモリ42の、その計算結果のアドレスから画像フレームFjの画素データを読み出す。
なお、この実施形態では、フレームメモリ42からの2枚目以降の画像フレームの加算処理時には、フレームメモリ43からは、1枚目の画像フレームが書き込まれたアドレス位置の画素データが順次に読み出されるものとされる。そして、回転・平行移動処理部191は、フレームメモリ43の読み出しアドレス位置に対応する、2枚目以降の画像フレームについてのフレームメモリ42の画素アドレスを順次に計算するものである。
ゲインアンプ192は、回転・平行移動処理部191からの、平行移動され、また、回転された2枚目以降の画像フレームFjの画素データ(輝度信号成分および色差信号成分)のそれぞれを、ゲイン(乗算係数)w1倍して、加算部194に供給する。また、ゲインアンプ193は、フレームメモリ43からの1枚目あるいは加算後の画像フレームFmの画素データのそれぞれを、ゲイン(乗算係数)w2倍して、加算部194に供給する。
加算部194は、加算後の画像フレームFmの画素データのそれぞれを、フレームメモリ43の同じアドレスに書き戻す(上書きする)。
この実施形態では、読み出された2枚目以降の画像フレームFj(加算画像という)の画素データに対するゲインアンプ192のゲインw1は、常に、w1=1とされる。
一方、フレームメモリ43からの1枚目あるいは加算結果の画像フレームFm(被加算画像という)の画素データに対するゲインアンプ193のゲインw2は、2枚目以降の画像フレームFjに、対応する加算すべき画素があるときと、対応する加算すべき画素が存在しないとき(2枚の画像フレームが平行移動および回転により重なっていない領域であるとき)とで、異なるものとされる。
すなわち、加算画像を回転および平行移動させる結果、被加算画像に加算すべき加算画像の画素が存在しない領域が必ず存在するが、ゲインw2は、加算すべき画素があるときには、w2=1とされる。また、加算すべき画素が無いときには、重ね合わせられる加算画像フレームFjが何枚目であるかにより異なる値となり、j枚目の画像フレームについてのゲインw2は、w2=j/(j−1)とされる。
この実施形態では、このようにすることにより、加算結果の画像において、加算すべき画素が存在している領域と存在していない領域との境界部分における違和感を削減するようにしている。
このようなゲイン制御のため、この実施形態では、回転・平行移動処理部191では、画像フレームFmの画素と重ね合わせるべきフレームメモリ42からの2枚目以降の画像フレームの画素アドレスが、フレームメモリ42にあるか否か、つまり、加算すべき画素があるか無いか、を示す情報EXを、CPU1に供給するようにする。CPU1は、これを受けて、ゲインアンプ193のゲインw2を制御するようにする。
なお、CPU1がゲインアンプ193のゲインw2を制御するのではなく、回転・平行移動処理部191が、画像フレームFmの画素と重ね合わせるべきフレームメモリ42からの2枚目以降の画像フレームの画素アドレスがフレームメモリ42にあるか否かに応じたゲインw2をゲインアンプ193に供給するように構成しても良い。
この単純加算手法の場合における各j枚目の画像フレームについての加算の様子を、図57に示す。図57には、加算部194とフレームメモリ43とが繰り返し使用されて、複数枚、図57の例では8枚の画像フレームが重ね合わされる様子を示している。図57において、丸数字は、何枚目の画像フレームであるかを示しており、また、被加算画像のゲイン(乗算係数)w2のうち、括弧で括った値は、加算画素が存在しない場合の値である。
ところで、回転・平行移動加算部19においては、上述したように、フレームメモリ42から、参照フレームの画像(加算画像)を読み出すと共に、フレームメモリ43から基準画像または加算結果の画像(被加算画像)を読み出して、両者を加算するようにするが、その際、回転・平行移動処理部191は、図56において点線で示すように、フレームメモリ42および43にアドレス制御信号を送って、読み出しアドレスを制御するようにする。なお、このアドレス制御は、回転・平行移動処理部191が行なうのではなく、CPU1が行なってもよいことは言うまでもない。
そして、回転・平行移動処理部191は、上述したように、フレームメモリ43の読み出しアドレスとしては、基準画像の画素位置(X,Y)について、0ラインの0番目の画素位置から水平方向に昇順に変更指定し、同じライン番号の最後まで指定すると、次のライン番号を昇順に変更指定してゆくというように、ラスタースキャンと同様のアドレス制御を行なう。
一方、回転・平行移動処理部191は、フレームメモリ42からの参照フレームの読み出しは、算出された平行移動量(α、β)および回転角度γだけ移動させて読み出すようにするが、フレームメモリ43からの被加算画像の読み出し位置に応じた、フレームメモリからの加算画像の読み出し位置を、図10(B)の(式13)に基づいて計算して、アドレス指定することになる。
このときのフレームメモリ42からの参照フレーム(加算画像)の、メモリ上のアクセスイメージは、図58の上方に示すようなものとなる。そして、このとき、垂直座標の少数成分が同じ値の点は、画面の垂直線に対して回転角度γだけ傾いた線(図58で点線で示す線)上に並ぶ。これは、図58の右上に示すように、図10(B)の(式13)において、yが1増加すると、Yも1だけ増加するからである。
これは、つまり、フレームメモリ42からの加算画像についてのメモリアクセスにおいては、図58の下側に示すように、被加算画像(基準画面)について順次変更される画素位置(X,Y)に対応する画素位置(x,y)のアドレスは、水平方向の途中で垂直方向に変化させる(垂直方向の段差を設ける)必要があるが、図58の下側に示すように、この画素位置(x,y)のアドレスが垂直方向に段差を生じる位置の水平座標は、ライン毎に少しずつずれてゆくことを意味している。
したがって、フレームメモリ42,43から、いわゆるバースト転送により画像データを読み出す場合、ライン毎に、垂直座標が変わる水平方向の画素位置が変わるために、常に、一定の水平方向の画素位置でバースト転送の初期アドレスを設定することはできず、バースト転送効率の低下を招くことになる。しかも、算出された回転角度γや平行移動量(α、β)の大きさによって、バースト転送の効率低下の程度が変化するため、バースト転送の効率低下の平均ケースとワーストケースとの処理速度差が大きくなってしまうという問題もある。
この問題を避ける方法としては、図59に示すように、フレームメモリ42と回転・平行移動処理部191との間に、複数ライン分のラインメモリからなるバッファメモリ回路401を設ける方法がある。
この方法においては、フレームメモリ42からは平行移動および回転制御なしに、バースト転送により画像データを読み出し、バッファメモリ回路401に供給する。そして、回転・平行移動処理部191は、前述したような(式13)に基づく画素位置の計算を行なって、その計算結果の画素位置のデータを、バッファメモリ回路401から読み出すようにする。
なお、この方法を用いる場合には、バッファメモリ回路401に用意するラインメモリのコストが問題になる。そこで、図60に示すように、参照フレーム102を、水平方向に分割して、縦短冊上にフレームを分割し、その縦短冊単位1021,1022,・・・,1023について、回転・平行移動加算処理を行うようにすると良い。バッファメモリ回路401は、縦短冊単位の画像データを扱う分のラインメモリを用意すればよいからである。
しかし、このようにしても、バッファメモリのコストが必要になることは否めない。そこで、この実施形態では、画質よりもコストが優先され、処理時間やバス帯域削減の重要度も高い場合として、次のような手法を用いる。
すなわち、前記フレームメモリ42からの画像データの読み出しにおける前記垂直方向の段差が生じる水平方向の画素位置を、図58に示したように、垂直方向に対して回転角度γ分ずれた位置に正しく設定するのではなく、図61に示すように、バースト転送の境目のアドレスと、前記垂直方向の段差を生じる水平方向の画素位置とを一致させるように、アドレスを生成する。
ここで、この実施形態では、図61に示すように、バースト転送の中央地点、つまり、バースト転送の境目の隣り合うアドレスの中間位置、で、次の前記垂直方向の段差を生じる水平方向位置の判定を行なうようにする。そのため、常にバースト転送単位の半分先まで、アドレス計算のための先読みを行なうようにする。
バースト転送の境目で、前記垂直方向の段差を生じる水平方向位置の判定を行なうようにすると、最大で1ラインのズレが発生するのに対して、この実施形態のように、バースト転送の中央地点で、前記垂直方向の段差を生じる水平方向位置の判定を行なうようにすると、ズレを最大でも0.5ラインに抑えることができるという効果がある。
なお、解像度変換部16における垂直補間フィルタの位相を、上記のズレに合わせて滑らか制御すると、ズレによる画質への影響を軽減することができて効果的である。
ところで、図61に示したこの実施形態の手法は、あえて誤差を許容することで、バースト転送効率を向上を目指した方法であるので、画質に対する影響の問題が考えられる。
しかしながら、実際には、この実施形態の上記の手法を用いても、画質劣化は殆ど問題にならない程度である。通常の撮像静止画において、画素精度の精細度は事実上、実現できていないことや、動きベクトルの検出精度の誤差の問題もあり、フレームメモリ42からの平行移動および回転を伴う画像の読み出しの精度のみを追求しても、意味を成さないからである。しかも、複数の画像の加算を繰り返すことにより、位相レベルのずれに起因する、最終加算画像への影響は、極めて小さいものとなるからである。
[単純加算手法の処理手順のフローチャート]
図62に、この実施形態の撮像装置における、この単純加算手法を回転・平行移動加算部19で実行する場合の処理手順を説明するためのフローチャートを示す。なお、この図55のフローチャートにおける各ステップは、主としてCPU1の制御に基づいてなされるものである。
まず、CPU1は、1枚目の画像フレームをフレームメモリ43に保存するように制御する(ステップS181)。次に、CPU1は、処理対象の画像フレームの枚数を示す変数jを、2枚目を示すj=2にする(ステップS182)。
そして、CPU1は、j枚目の画像フレームをフレームメモリ42に保存するように制御する(ステップS183)。次に、前述したように、CPU1の制御指示の下、手ぶれベクトル検出部15は、1枚目の画像フレームに対するj枚目の画像フレームのグローバル動きベクトルあるいは平行移動量と、回転角度とを算出し、算出した平行移動量および回転角度をCPU1に送る(ステップS184)。
次に、回転・平行移動加算部19は、CPU1からの平行移動量と、回転角度とを受けて、j枚目の画像フレームを、回転および平行移動させながら、フレームメモリ42から読み出す。また、同時に、フレームメモリ43からは1枚目あるいは加算結果の画像フレームを読み出す(ステップS185)。なお、フレーム42から読み出された画像を、ここでは加算画像と称し、また、フレーム43から読み出された画像を被加算画像と称することとする。
次に、回転・平行移動加算部19は、加算画像の画素データと被加算画像の画素データとを、ゲインw1およびw2を両方とも「1」として加算する。ただし、被加算画像のうち加算画像と重ならない領域、すなわち、被加算画像の画素データに対して加算する加算画像の画素データが存在しないときには、加算画像の画素データに対するゲインw1は、w1=0、被加算画像の画素データに対するゲインw2は、w2=j/(j−1)とする(ステップS186)。
そして、回転・平行移動加算部19は、加算結果の画像データを、フレームメモリ43に書き戻す(ステップS187)。
次に、CPU1は、所定の枚数の画像フレームを重ね合わせたか否か判別し(ステップS188)、所定の枚数の重ね合わせを終了していないと判別したときには、処理対象の画像フレームの枚数を示す変数jをインクリメントして、j=j+1にする(ステップS189)。そして、ステップS183に戻り、このステップS183以降の処理を繰り返す。
また、ステップS188で、所定の枚数の重ね合わせを終了したと判別したときには、CPU1は、この図62の処理ルーチンを終了する。
この単純加算手法は、加算画素が存在しない領域を除けば、被加算画像と加算画像とを、輝度信号および色差信号の区別無く、常に両者のゲインを「1」として加算してゆくものであり、加算画像は徐々に明るくなってゆく。
このため、この単純加算手法を用いる場合には、連写を繰り返しながら、途中の加算結果(被加算画像)をモニター表示し、画像が意図した明るさに達した時点で、ユーザが連写を止める、といった撮影モードを実現することができる。
本来ならば長時間露光が必要な低照度の被写体を、カメラのISO感度を抑えながら連写するため、ユーザは、加算画像が徐々に明るくなって行く様子を確認でき、これは長時間露光のイメージと合っている。途中加算画像と同時に、そのヒストグラムをモニターできるようにすれば、なお好適である。また、当然、撮像装置側で自動的に加算枚数を決定しても良い。
(2)平均加算手法
この平均加算手法は、上述した単純加算手法と類似しているが、加算画像および被加算画像についてのゲインw1およびw2の値が、単純加算手法とは異なる。すなわち、この平均加算手法においては、1枚目画像に対する2枚目画像の加算においては、ゲインw1およびw2の値は、ともに1/2としてゲインを掛けて加算するが、j枚目の加算時には、加算画像のゲインw1は、w1=1/j、非加算画像のゲインw2は、w2=(j−1)/jとして加算する。
つまり、加算結果である被加算画像の明るさを、加算枚数に依らず一定にしつつ、j枚の加算画像のそれぞれの重みを等しくするようにする。ただし、平行移動及び回転により、被加算画像の画素と加算するべき加算画像の画素が存在しない場合は、被加算画像の画素データに対するゲインw2を1とすることで、加算結果の明るさを、フレーム全体に渡って維持するようにする。
この平均加算手法の場合における回転・平行移動加算部19と、画像メモリ4との関係を考慮したブロック図を図63に示す。この場合、回転・平行移動加算部19には、回転・平行移動処理部191と、ゲインアンプ192および193と、加算部194とが設けられるのは、図80に示した単純加算手法の場合と同じであるが、ゲインアンプ193および194のゲインw1およびゲインw2を、加算する画像フレームが何枚目であるかにより異なるので、これらゲインw1およびゲインw2の値が、CPU1から供給されるようにされる点が、単純加算手法の場合と異なる。
なお、フレームメモリ42からの画像データの読み出し制御は、この平均加算手法においても、前述した単純加算手法の場合と全く同様に行なわれるものである。
この平均加算手法の場合における各j枚目の画像フレームについての加算の様子を、図64に示す。図64には、加算部194とフレームメモリ43とが繰り返し使用されて、複数枚、図64の例では8枚の画像フレームが重ね合わされる様子を示している。図64において、丸数字は、何枚目の画像フレームであるかを示しており、また、被加算画像のゲイン(乗算係数)w2のうち、括弧で括った値は、加算画素が存在しない場合の値である。
図64に示すように、j枚目の加算画像のゲインw1は、w1=1/jとされ、また、j枚目の加算における非加算画像のゲインw2は、w2=(j−1)/jとされる。
図65に、この実施形態の撮像装置における、この平均加算手法を回転・平行移動加算部19で実行する場合の処理手順を説明するためのフローチャートを示す。なお、この図65のフローチャートにおける各ステップは、主としてCPU1の制御に基づいてなされるものである。
まず、CPU1は、1枚目の画像フレームをフレームメモリ43に保存するように制御する(ステップS181)。次に、CPU1は、処理対象の画像フレームの枚数を示す変数jを、2枚目を示すj=2にする(ステップS192)。
そして、CPU1は、j枚目の画像フレームをフレームメモリ42に保存するように制御する(ステップS193)。次に、前述したように、CPU1の制御指示の下、手ぶれベクトル検出部15は、1枚目の画像フレームに対するj枚目の画像フレームのグローバル動きベクトルあるいは平行移動量と、回転角度とを算出し、算出した平行移動量および回転角度をCPU1に送る(ステップS194)。
次に、回転・平行移動加算部19は、CPU1からの平行移動量と、回転角度とを受けて、j枚目の画像フレームを、回転および平行移動させながら、フレームメモリ42から読み出す。また、同時に、フレームメモリ43からは1枚目あるいは加算結果の画像フレームを読み出す(ステップS195)。なお、フレーム42から読み出された画像を、ここでは加算画像と称し、また、フレーム43から読み出された画像を被加算画像と称することとする。
次に、回転・平行移動加算部19は、加算画像の画素データに対するゲインw1を、w1=1/jとし、被加算画像の画素データに対するゲインw2を、(j−1)/jとして、加算を実行する。ただし、被加算画像のうち加算画像と重ならない領域、すなわち、被加算画像の画素データに対して加算する加算画像の画素データが存在しないときには、加算画像の画素データに対するゲインw1は、w1=0、被加算画像の画素データに対するゲインw2は、w2=1とする(ステップS196)。
そして、回転・平行移動加算部19は、加算結果の画像データを、フレームメモリ43に書き戻す(ステップS197)。
次に、CPU1は、所定の枚数の画像フレームを重ね合わせたか否か判別し(ステップS198)、所定の枚数の重ね合わせを終了していないと判別したときには、処理対象の画像フレームの枚数を示す変数jをインクリメントして、j=j+1にする(ステップS199)。そして、ステップS193に戻り、このステップS193以降の処理を繰り返す。
また、ステップS198で、所定の枚数の重ね合わせを終了したと判別したときには、CPU1は、この図65の処理ルーチンを終了する。
この平均加算手法を用いるアプリケーションとして、この実施形態の撮像装置では、動被写体が消えて行くギミック(特殊効果)の機能を備えるものである。すなわち、この平均加算手法によれば、1枚目の加算時から画像の明るさは変わらないものの、連写する毎に、画像フレーム内の動いている部分(動被写体)が、少しずつボケて消えて行くような、今までに無い撮影モードが実現できるものである。なお、画像フレームの加算を繰り返す毎に、その加算効果で、画像フレーム内のノイズも無くなって行くが、これは副次的な効果となる。
(3)トーナメント加算手法
単純加算手法や平均加算手法の場合、常に1枚目を基準画像とし、1枚目に対して、2枚目以降の画像の位置合わせをして加算して行く。これに対して、トーナメント加算手法の場合、いずれの画像も等しく扱う。そのため、基準画像を1枚目の画像に限らず、何枚目の画像に設定しても構わない。その代わりに、加算対象の2枚の画像を、いずれも平行移動並びに回転させる必要がある。
このトーナメント加算手法の場合における回転・平行移動加算部19と、画像メモリ4との関係を考慮したブロック図を図66に示す。この場合、回転・平行移動加算部19には、2個の回転・平行移動処理部195および196と、ゲインアンプ197および198と、加算部199とが設けられる。
画像メモリ4には、前述したように、手ぶれベクトル検出部15での手ぶれベクトル検出処理のために、少なくとも2個のフレームメモリ41,42が設けられると共に、画像加算結果の画像フレームが格納されるフレームメモリ43が設けられるが、このトーナメント加算手法のためには、さらに、画像メモリ43には、加算する枚数分の画像フレームを格納することができるように構成されている。
すなわち、このトーナメント加算手法が選択されたときには、撮像装置は、加算する枚数分だけ連写し、そのすべての画像フレームを画像フレーム43に蓄積した上で、基準画像をいずれかに設定し、加算処理を開始する。
なお、画像メモリ4からの加算画像の画像データの読み出し制御は、このトーナメント加算手法においても、前述した単純加算手法の場合と全く同様に行なわれるものである。
以下に説明する例では、8枚の画像フレームを用いてトーナメント加算するようにする。図66において、画像メモリ43内において、丸で囲んで示されるF1〜F8は、連写されて蓄積された8枚の画像フレームを示している。
手ぶれベクトル検出部15により、8枚の画像フレームについての各ブロック毎動きベクトル、グローバル動きベクトルなどは、加算処理が開始される時点では、すべて算出済みであるとする。
しかし、上述したように、手ぶれベクトル検出部15では、直前のフレームとの相対動きベクトルか、1枚目を基準とした動きベクトルしか検出できないため、累積誤差を許すか、設定した基準画像を使って検波し直す必要がある。
図67は、このトーナメント加算手法の概要を示すものである。図67において、丸数字は、8枚の画像フレームF1〜F8に対応しており、この例では、まず、第1段階の加算として、画像フレームF1とF2、画像フレームF3とF4、画像フレームF5とF6、画像フレームF7とF8、の加算を行う。
この第1段階の加算においては、それぞれ加算を行う2枚の画像フレームについて、設定された基準画像に対する相対手ぶれ分だけ、それぞれ回転・平行移動処理部195,196において、平行移動および回転する処理がなされる。
この第1段階の加算が終了したら、当該第1段階での加算結果の画像について、第2段階の加算を行う。この第2段階の加算は、図67の例では、画像フレームF1とF2の加算結果と画像フレームF3とF4の加算結果との加算と、画像フレームF5とF6の加算結果と画像フレームF7とF8の加算結果との加算を行う。この第2段階の加算においては、加算しようとする画像フレームのそれぞれは、基準画像に合致するようにされているので、回転・平行移動処理部195,196においては、平行移動および回転する処理は不要である。
そして、第2段階の加算が終了したら、当該第2段階での加算結果の画像について、第3段階の加算を行う。この第3段階の加算は、図67の例では、画像フレームF1とF2とF3とF4の加算結果と、画像フレームF5とF6とF7とF8の加算結果との加算を行う。この第3段階の加算においては、加算しようとする画像フレームのそれぞれは、基準画像に合致するようにされているので、回転・平行移動処理部195,196においては、平行移動および回転する処理は不要である。
図66に戻った説明をするに、加算処理が開始されると、まず、CPU1は第1段階の加算をすべき2枚の画像フレームを設定し、その設定した画像フレームについての、例えば基準画像に対する平行移動量および回転角度を、回転・平行移動処理部195および196に供給する。
回転・平行移動処理部195および196のそれぞれは、CPU1から受け取った画像フレームの平行移動量および回転角度を用いて、画像メモリ4から、対応する2枚の画像フレームの画像データを、基準画像に対する相対手ぶれを相殺するように、平行移動および回転を伴って読み出す。
そして、回転・平行移動処理部195および196からの2枚の画像フレームは、それぞれゲインアンプ197および198により、それぞれゲインw3倍およびゲインw4倍された後、加算部199において加算される。そして、その加算後の画像データは、画像メモリ4のバッファメモリに書き込まれる。
CPU1は、図67に示した第1段階の加算をすべき他の2枚の画像フレームについて、上述と同様の処理をする。したがって、これに対応して、回転・平行移動処理部195および196が上述と同様にして、指定された他の2枚の画像フレームについての平行移動および回転をしながらの加算を行い、その加算結果を画像メモリ4に格納するようにする。
そして、第1段階の加算が終了すると、CPU1は、第2段階の加算を行うべく、画像メモリ4から読み出すべき画像フレームを、第1段階の加算結果の画像フレームに設定し、平行移動量および回転角度はゼロとして、回転・平行移動処理部195および196に読み出し指示する。
回転・平行移動処理部195および196は、このCPU1からの情報および指示に応じて、第1段階の加算結果の画像フレームの画像データを読み出して、図67に示した第2段階の加算処理をする。
そして、第2段階の加算が終了すると、CPU1は、第3段階の加算を行うべく、画像メモリ4から読み出すべき画像フレームを、第2段階の加算結果の画像フレームに設定し、平行移動量および回転角度はゼロとして、回転・平行移動処理部195および196に読み出し指示する。
回転・平行移動処理部195および196は、このCPU1からの情報および指示に応じて、第2段階の加算結果の画像フレームの画像データを読み出して、図67に示した第3段階の加算処理をする。以上で、この例のトーナメント加算を終了する。
このトーナメント加算手法の場合における8枚の画像フレームについての加算におけるゲインアンプ197,198におけるゲイン(乗算係数)w3、w4、およびその加算処理の流れの様子を、図68に示す。
図68に示した乗算係数w3、w4は、前述した平均加算手法に基づいた例であり、2枚の画像フレームで重なり合う領域では、w3=w4=1/2とされ、また、重なり合わない領域では、w3=1、w4=1とされる。
なお、乗算係数w3,w4は、平均加算手法に基づいた値に限らず、単純加算手法に基づいて値を用いるようにしても良い。
上述の説明においては省略したが、この実施形態のトーナメント加算手法においては、第2階層以降の加算において、第1階層の加算をする2枚の画像について基準画像に対して回転および平行移動をするために、基準画像の領域においては、2枚共に、対応する画素が存在しない画素位置を判定できる仕組みを設けるようにしている。
すなわち、第1階層の加算時に、加算結果の輝度成分Yの画素値が「0」のものを、「1」に値を置き換える。そして、その代わりに、平行移動と回転の結果、第1段階の加算を行う2枚の画像共に、対応する画素が存在しない画素位置の加算結果の輝度成分Yの画素値を「0」とする。
そして、第2階層以降の加算では、2枚共に輝度成分Yの画素値が「0」の場合、加算後の輝度成分Yも「0」にする。全ての画像を加算したとき、必ず全ての画素には有効画素(基準画像の画素)が含まれるため、輝度値が「0」の画素は、基準画像の画素値に置き換るようにする。
このように、輝度成分Yの画素値「0」を無効画素フラグとすることで、画像データのフォーマットを維持したまま、容量を増加させずに、重ね合わせ際の有効画素が存在しない画素の判定フラグを設けることができる。
勿論、上述のような重ね合わせ際の有効画素が存在しない画素位置に対して、無効画素フラグを1ビット別途設けても構わないし、また、輝度成分Y、色差成分Cb/Crに依らず、どの画素値をフラグとして用いても構わない。しかし、コストや画質への影響を鑑みると、上述したこの実施形態の無効画素フラグの手法が最適であると考えられる。
図69および図70に、この実施形態の撮像装置における、上述したトーナメント加算手法を回転・平行移動加算部19で実行する場合の処理手順を説明するためのフローチャートを示す。なお、この図69および図70のフローチャートにおける各ステップは、主としてCPU1の制御に基づいてなされるものである。
まず、CPU1は、1〜8枚目までの画像フレームの画像データを、順次に画像メモリ4のフレームメモリに書き込んで保存する(ステップS201)。次に、CPU1は、1〜8枚目までの画像の中で、基準画像を1枚設定する(ステップS202)。そして、CPU1は、1〜8枚目までの画像フレームについて、基準画像の画像フレームに対する平行移動量および回転角度の算出をしておく(ステップS203)。
次に、CPU1は、第1段階の加算処理を開始し、1枚目と2枚目の画像フレームについての基準画像フレームに対する平行移動量および回転角度の情報の回転・平行移動加算部19を供給する。回転・平行移動加算部19は、1枚目と2枚目の画像フレームの画像データを、CPU1からの、その2枚の画像フレームについての平行移動量および回転角度の情報を元にして、基準画像の画像フレームに対する回転角度および平行移動量を相殺するように、画像メモリ4の対応するフレームメモリから同時に読み出す(ステップS204)。
そして、回転・平行移動加算部19は、CPU1の制御の下、1枚目と2枚目の画像フレームの画像データを読み出しながら、ゲインw3=1/2、ゲインw4=1/2として加算処理を実行し、その加算結果を画像メモリ4のフレームメモリに書き込む(ステップS205)。
そして、ステップS205では、基準画像の画像フレーム領域内の画素位置(加算後の画素データを書き込む画素位置)を順次に設定し、その設定した画素位置のそれぞれについて、1枚目と2枚目の画像フレームの画像データ中から、対応する画素を検索して読み出し、その画素同士を加算するようにするが、1枚目と2枚目の画像フレームのうちで一方の画素が存在しない場合には、当該画素が存在しない方の画像フレームの画像データのゲインは「0」とし、画素が存在する方の画像フレームの画像データのゲインは「1」とする。
さらに、ステップS205では、1枚目と2枚目の画像フレームに、対応する画素が共に存在しない場合には、加算結果の輝度成分Yの画素値は「0」とする。また、対応する画素が存在している場合の画素データの加算結果が「0」となっている場合には、その画素値は「1」に変更しておく。
次に、CPU1は、3枚目と4枚目、5枚目と6枚目、7枚目と8枚目についても、ステップS204およびステップS205の処理を行うように、回転・平行移動加算部19に対して指示を行い、回転・平行移動加算部19がその処理を実行する(図70のステップS211)。
次に、CPU1は、第2段階の加算処理を開始するように、回転・平行移動加算処理部19に指示する。回転・平行移動加算処理部19は、CPU1からの指示に応じて、1枚目と2枚目の画像の加算結果の画像データと、3枚目と4枚目の加算結果の画像データとを、画像メモリ4から、平行移動および回転を行わずに読み出す。そして、ゲインw3およびw4を、共に1/2として、前記2つの画像データの加算を行う(ステップS212)。
そして、このステップS212においては、加算しようとする1枚目と2枚目の画像の加算結果の画素データの輝度成分Y、または、3枚目と4枚目の加算結果の画素データの輝度成分Yの一方が「0」である場合には、加算使用とする2枚の画像のうち、輝度成分Yが「0」である画像の画素データのゲインは「0」とし、他方の画像の画素データのゲインは「1」とする。
また、さらに、ステップS212において、加算しようとする2つの画像の画素データの輝度成分Yが共に「0」の場合には、その加算結果の輝度成分Yの値も「0」とする。
次に、CPU1は、5枚目と6枚目の画像の加算結果の画像データと、7枚目と8枚目の加算結果の画像データとについても、上述のステップS212の処理を行うように、回転・平行移動加算部19に指示し、回転・平行移動加算部19はその処理を実行する(ステップS213)。
次に、CPU1は、第3段階の加算、つまり、1〜4枚目の画像フレームの加算結果と、5〜8枚目の画像フレームの加算結果とについて、上述したステップS212の処理を行うように、回転・平行移動加算部19に指示し、回転・平行移動加算部19はその処理を実行する(ステップS214)。
以上で、この実施形態のトーナメント加算手法による複数枚の画像フレームの加算処理を終了する。
以上説明したこの実施形態のトーナメント加算手法におけるポイントは2つあり、1つは、トーナメントの第1段階(初段)では、基準画像以外は、2枚の加算画像のいずれも、平行移動と回転を伴いながら加算するのに対し、第2段階以降は、平行移動も回転も行わずに加算することである。第1段階の加算が、図69のAの処理に相当し、第段階以降の加算が、図70のBの処理に相当する。
この実施形態のトーナメント加算手法における、もう1つのポイントは、第2段階以降の加算において、第1段階の2枚の画像が、両画像共に画素が存在しない画素位置を、判定できる仕組みを設けた点である。
なお、上述の例では、8枚の画像フレームをトーナメント加算する例を示したが、この実施形態のトーナメント加算手法では、予め連写した画像を画像メモリ4に溜めておくことが重要であり、枚数は重要ではない。ただし、トーナメント加算手法の性質を考慮すると、2のベキ乗で表される加算枚数が好ましい。
この実施形態のトーナメント加算手法のメリットは、2つある。1つは、先述したように、加算しようする全ての画像を撮影しておいてから、任意の基準画像を選択できることである。連写しながら手ぶれベクトルを求めておき、連写中の手ぶれ軌跡の中央に位置するフレームを、基準画像として選択すれば、加算結果画像の有効領域を最も広く取れるというメリットがある。
もう1つのメリットは、各フレームの画像を完全に等価に扱うことができる点である。例えば、既説した平均加算手法の場合も、加算結果における各フレームの比重が等しくなるように、加算係数をフレーム枚数に応じて変化させているが、どうしてもデジタルの丸め誤差が発生する。その結果として、各フレームの比重は完全に同じにはならない。それに対し、この実施形態のトーナメント加算手法の場合は、完全に同じ係数で各フレームを加算するため、丸め誤差の影響に偏りがないのである。
ただし、トーナメント加算手法においては、予め全ての画像をメモリに格納しておく方式のため、大量にメモリを必要とすることと、そのため、連写枚数に上限があり、先述した単純加算手法や平均加算手法のような、無限に加算し続けることはできないという問題がある。
しかし、例えば、ハードディスクのような、ビット単価の極めて安い外部ストレージに、連写した画像を一時保存するアーキテクチャを採れば、上記の問題は回避可能である。
ところで近年、手ぶれだけでなく、動被写体ぶれも防ぐための手法として、手ぶれも動被写体ぶれも発生しにくい、1/60秒程度の短い露光時間で高感度に撮影する、高感度撮影が市場の耳目を集めている。
この場合に問題となるのが、S/Nを抑えながら、どこまでのISO感度に対応できるか、である。通常、感度を向上させると、同時に画像のノイズも目立ってしまうため、デジタルカメラ各社は、様々な手法を用いてノイズ・リダクションを行い、一定水準のS/Nを維持できる、最高ISO感度の数値の大きさを、性能として謳っている。
この実施形態で主題としている静止画の手ぶれ補正も、目的の1つはノイズ・リダクションであり、複数枚の画像の加算を行う際に、動被写体部分を検出し、加算を行わないか、その部分だけ別途サーチし、追跡加算を行うことで、動被写体ぶれにも対応した、見かけ上の高感度なノイズ・リダクションを実現することは可能である。
ランダムノイズを対象とした場合、N枚の画像を加算すれば、統計的にそのノイズ成分はNの平方根の比率に削減される。つまり、ISO3200相当の実力値を持つデジタルカメラにおいて、動被写体に対応した16枚加算を行えば、そのセットのISO感度を、4倍のISO12800として謳うことができるのである。
この場合に求められる加算の方式としては、固定枚数の加算でも、処理時間を多少要しても構わない代わりに、できるだけ高画質なものである。この要件を満たすものが、この実施形態のトーナメント加算手法であり、逆に言うと、トーナメント加算手法に好適なアプリケーションとして、高感度撮影時のISO感度向上が挙げられる。
上述したように、この実施形態の撮像装置は、単純加算手法、平均加算手法、トーナメント加算手法の3つの加算手法を具備している。上記の3つの加算手法のそれぞれには、それぞれに最適なデジタルカメラのアプリケーションがあることは上述した。
この実施形態の撮像装置においては、これら3つの加算方式のうちのいずれを使用するかを、ユーザ操作入力部3を通じて、ユーザが選択することができるので、ユーザは、自分が欲する加算結果に応じて、加算手法を選択することができるというメリットがある。
なお、ユーザが直接的に3種の加算手法のいずれかを選択するのではなく、撮像装置が、上述した3種の加算手法に最適なアプリケーションを選択可能な機能として備えるように構成し、ユーザがいずれかアプリケーションを選択したときに、CPU1が、各アプリケーションに最適な加算手法を自動的に選択するように構成することもできる。
そして、1つのデジタルカメラで、手持ち長時間露光撮影、動被写体が徐々に消えて行くギミック、実力値以上の高感度撮影、の3つの新しいアプリケーションが同時に実装できるというメリットもある。
[画像処理装置の第2の実施形態]
上述した画像処理装置の第1の実施形態としての撮像装置における手ぶれベクトル検出部15においては、図1に示したように、画像メモリ部4は、2枚の画像、つまり元フレームの画像と、参照フレームの画像とが、両方共、フレームメモリに格納されていることを前提にしていた。このため、動きベクトルの検出タイミングは、1フレーム分遅延されることとなる。
これに対して、この第2の実施形態では、撮像素子11からの垂れ流し画像データを参照フレームとする構成として、ラスタースキャンのストリームデータに対して、リアルタイムでSAD値を演算することができるようにしている。
図71に、この第2の実施形態の場合における撮像装置の構成例のブロック図を示す。この図71から分かるように、撮像信号処理系10の構成ブロックおよびその他の構成ブロックは、図1に示した第1の実施形態と全く同様であるが、この第2の実施形態においては、画像メモリ部4は2個のフレームメモリ44および45からなる。フレームメモリ44は、動きベクトル検出処理用であり、フレームメモリ45は、フレーム画像の重ね合わせ用である。
なお、実際的には、書き込みと読み出しとが同時にできないフレームメモリを用いる場合、フレームメモリ44は、周知のように、2枚のフレームメモリを、書き込みと、読み出しで1フレーム毎に交互に切り替えて用いるものである。
手ぶれベクトル検出部15は、後述するように、データ変換部14からの入力画素データを、参照フレームの画素データとすると共に、フレームメモリ43の格納データを元フレームのデータとして、縮小SADテーブル生成処理、ブロック毎動きベクトルの検出処理、合算SADテーブル生成処理およびグローバル動きベクトル(手ぶれベクトル)検出処理を行なう。そして、この第2の実施形態においては、手ぶれベクトル検出部15では、前述と同様に、グローバル動きベクトル(手ぶれの平行移動成分)や平行移動量(α、β)に加えて、参照フレームの元フレームに対する回転角度γを検出する。
なお、この例の場合、手ぶれベクトル検出部15では、常に1フレーム前の画像との相対手ぶれベクトルを求めることになるので、1枚目の基準画像(図3の画像フレーム120参照)との相対手ぶれを算出するために、1枚目からそれまでの手ぶれ成分を積分しておくものである。
そして、回転・平行移動加算部19は、上述した第1の実施形態と全く同様にして、この検出された手ぶれの平行移動成分と回転角度に従って、1フレーム遅延の後、フレームメモリ44に格納されている画像フレームを、切り出しと同時に回転させながら、フレームメモリ45の画像に加算もしくは平均化して行く。この過程を繰り返すことにより、フレームメモリ45には、手ぶれの無い、より高S/Nで、より高解像度の静止画像の画像フレーム120が生成される(図3参照)。
そして、解像度変換部16は、フレームメモリ45のフレーム画像から、CPU1からの制御指示に応じた所定の解像度および所定の画像サイズを切り出して、前述したように、記録撮像画像データとしてコーデック部17に供給すると共に、モニター画像データとしてNTSCエンコーダ18に供給する。
この第2の実施形態では、元フレームがフレームメモリ44に格納されており、参照フレームは、データ変換部14からストリームで入力されて来るものとされる。手ぶれベクトル検出部15は、第1の実施形態では、2個のフレームメモリ41,42に格納された2枚の画像データを用いて、参照ブロックについてのSAD値を求める処理をするようにした。これに対して、この第2の実施形態では、図71に示すように、データ変換部14からのストリーム画像データを参照フレームの画像データとすると共に、フレームメモリ44に格納されている画像データを元フレームの画像データとして、参照ブロックについてのSAD値を求めるようにする。
上述したように、この第2の実施形態では、データ変換部14からのストリーム画像データを参照フレームの画像データとする。このため、ある入力画素に対して、この画素を要素とする参照ブロックが、参照フレーム上に同時に複数存在することになる。図72は、そのことを説明するための図である。
すなわち、参照フレーム102上のサーチ範囲105における入力画素Dinは、例えば、参照ベクトル1071が対応する参照ブロック1061の左側に位置する画素であると共に、参照ベクトル1072が対応する参照ブロック1062の右上に位置する画素となっていることが、この図72から分かる。
したがって、入力画素Dinが参照ブロック1061に属するとした場合には、ターゲットブロック103の画素D1を読み出して、その差分を算出する必要がある。また、入力画素Dinが参照ブロック1062に属するとした場合には、ターゲットブロック103の画素D2を読み出して、その差分を算出する必要がある。
図72および後述の図73では簡単のため、2つの参照ブロックのみを図示しているが、実際上は、入力画素Dinを、その参照ブロック内の画素とする参照ブロックは多数となる。
この第2の実施形態の場合のSAD演算は、入力画素Dinの輝度値Yと、各々の参照ブロック内の入力画素Dinの位置に対応した、ターゲットブロック内の画素の輝度値Yとの差分絶対値を算出し、その算出した差分絶対値を、それぞれの参照ブロックに対応した参照ベクトルに従って、SADテーブルに加算してゆくようにして行なう。
例えば、入力画素Dinが参照ブロック1061に属するとした場合における、ターゲットブロック103の画素D1と入力画素Dinとの差分絶対値は、図73に示すように、SADテーブル108の参照ベクトル1071が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。また、入力画素Dinが参照ブロック1062に属するとした場合における、ターゲットブロック103の画素D2と入力画素Dinとの差分絶対値は、図73に示すように、SADテーブル108の参照ベクトル1072が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。
したがって、サーチ範囲内の全ての領域の入力画素が入力されて処理が終了したときには、SADテーブルが完成することになる。
図73の説明は、従来手法に、リアルタイムSAD算出処理を適用した場合である。この第2の実施形態においては、図72において、SADテーブル108の参照ベクトル1071または1072が対応するSADテーブル要素1091または1092のSAD値として、算出した差分絶対値のそれぞれを、加算して書き込むのではなく、前述した第1の実施形態のように、参照ベクトル1071,1072を縮小倍率1/nで縮小した参照縮小ベクトルを算出し、その参照縮小ベクトルの近傍の複数の参照ベクトルに、前記算出した差分絶対値から、それぞれを分散加算するための分散加算値を求め、求めた分散加算値を、前記近傍の複数の参照ベクトルに対応するSAD値に加算するようにするものである。
SADテーブル(縮小SADテーブル)が完成した後の正確な動きベクトルを算出するための処理は、この第2の実施形態においても、前述した第1の実施形態で述べた手法と全く同様にして、2次曲面や、水平方向および垂直方向の3次曲線を用いた手法を用いることができる。
この第2の実施形態の場合の手ぶれベクトル検出部15における、前記図39のステップS32、図41のステップS52、図43のステップS72および図44のステップS82における各ターゲットブロックについての縮小SADテーブル生成処理およびブロック毎動きベクトル検出処理の動作のフローチャートを図74および図75に示す。
先ず、手ぶれベクトル検出部15では、入力画像のフレーム(参照フレーム)の任意の位置(x,y)の画素データDin(x,y)を受け取る(ステップS221)。次に、当該画素の位置(x,y)を含む複数の参照ブロックの一つに対応する参照ベクトル(vx,vy)を設定する(ステップS222)。
次に、設定された参照ベクトル(vx,vy)の参照ブロックIiの当該画素値Ii(x,y)と、これに対応するターゲットブロックIo内の画素値Io(x−vx,y−vy)との差分の絶対値αを算出する(ステップS223)。すなわち、差分絶対値αは、
α=|Io(x−vx,y−vy)−Ii(x,y)| ・・・(式4)
として算出される。
次に、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS224)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS225)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値(差分絶対値)を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS223で求めた差分絶対値αから、線形加重分散値として求める(ステップS226)。そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS227)。
次に、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS222〜ステップS227の演算を行なったか否か判別し(ステップS228)、当該入力画素Din(x,y)を含む他の参照ブロックがあると判別したときには、ステップS222に戻り、当該入力画素Dinを含む他の参照ブロック(vx,vy)を設定し、このステップS222〜ステップS227の処理を繰り返す。
また、ステップS228で、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS222〜ステップS227の演算を行なったと判別したときには、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したか否か判別し(図75のステップS231)、終了していないと判別したときには、ステップS221に戻り、サーチ範囲内の次の入力画素Dinを取り込み、このステップS221以降の処理を繰り返す。
そして、ステップS231で、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS232)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS233)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS234)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求める動きベクトル(px×n,py×n)を算出する(ステップS235)。
なお、この例においても、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは前述の例と同様である。
また、前述の第1の実施形態において、図51〜図54のフローチャートを参照しながら説明した第3の例と同様にして、この第2の実施形態においても、サーチ範囲を絞りながら、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、縮小SADテーブルを用いた動きベクトル検出処理を繰り返すようにしても、勿論良い。
この第2の実施形態のメリットは、フレームメモリを、第1の実施形態に比べて1枚分削減できることと、フレームメモリに入力画像を格納する時間を短縮できることである。メモリ削減の効果は言うまでもないが、処理時間の短縮も、近年、重要視されて来ている。
[第3の実施形態]
上述の第2の実施形態では、入力画像に対し、常に1フレーム前の画像との比較によって、手ぶれベクトルと回転角度を求める方式であったが、前述もしたように、実際には、図3に示したように、1枚目を基準として、以降のフレームを足し合わせるため、動きベクトル検出も1枚目を基準にする方が誤差は小さくなる。第3の実施形態は、この点を考慮したものである。
図76に、この第3の実施形態による撮像装置の構成例のブロック図を示す。
すなわち、この図76の例においては、画像メモリ部4には、図71の第2の実施形態におけるフレームメモリ44およびフレームメモリ45に加えて、フレームメモリ46を設ける。そして、データ変換部14からの画像データは、フレームメモリ44とフレームメモリ46とに書き込むようにする。
そして、この第3の実施形態においては、フレームメモリ46を、ターゲットとなる1枚目のフレーム(元フレームおよび基準画像のフレーム)格納用として用いて、常に、この画像に対する入力画像の参照ベクトルを算出するシステムの構成を示す。この構成においても、フレームメモリ45に加算画像結果が格納される。
この例においても、基準となる1枚目のフレームの画像データは、図76において破線で示すように、フレームメモリ45にも書き込むようにする。
そして、2枚目以降の画像フレームは、フレームメモリ44に書き込むと共に、手ぶれベクトル検出部15に供給する。手ぶれベクトル検出部15では、データ変換部14からの2枚目以降の画像フレームのそれぞれと、フレームメモリ46から読み出された1枚目の画像データとの間の相対的な手ぶれベクトルの検出を行うと共に、回転角度の検出を行う。
手ぶれベクトル検出部15は、検出した1枚目の画像フレームに対する2枚目以降の画像フレームのそれぞれについての相対的な手ぶれベクトルと回転角度の情報をCPU1に供給する。
そして、フレームメモリ44に格納されている2枚目以降の画像は、算出された1枚目のフレームの基準画像との相対手ぶれ成分を相殺するように、CPU1の制御により、フレームメモリ44から読み出されて、回転・平行移動加算部19に供給される。そして、回転・平行移動加算部19では、CPU1からの制御信号により、1枚目の基準画像フレームに対する相対回転角度に応じて2枚目以降の画像フレームのそれぞれが回転させられて、フレームメモリ46から読み出された画像フレームに対して加算もしくは平均化される。その加算もしくは平均結果の画像フレームは、フレームメモリ46に書き戻される。
そして、フレームメモリ46の画像フレームのデータは、CPU1の制御指示に応じた所定の解像度および所定の画像サイズで切り出されて解像度変換部16に供給される。そして、解像度変換部16は、前述したように、記録撮像画像データとしてコーデック部17に供給すると共に、モニター画像データとしてNTSCエンコーダ18に供給する。
なお、上述の第3の実施形態において、入力画像の1フレーム目を基準画像として、無限加算もしくは無限平均加算も可能なシステムを示したが、もしメモリ容量がふんだんに存在するか、記録再生装置部5への一時的な退避が許されるならば、予め加算対象の画像を全て保存しておき、それらをトーナメント加算手法による加算、もしくは平均加算手法による加算をしてゆく方法を採用しても良い。
[第6の実施形態]
以上説明した第1〜第3の実施形態によるセンサレス手ブレ補正と、現存技術である光学手ぶれ補正とを組み合わせることによって、より高い効果が得られる。
冒頭で説明したように、ジャイロセンサを用いる光学手ぶれ補正は、大まかな補正を得意としており、また、回転補正が難しいのに対し、ブロックマッチングを使用したセンサレス手ブレ補正は、回転補正も含めた精度は高いが、サーチ範囲が広くなると、SADテーブルのコストが急上昇するか、この実施形態の手法を用いたとしても、複数段階の動き検出処理による場合には処理時間を要するからである。
したがって、光学手ぶれ補正で大まかに補正して、センサレベル手ぶれ補正のための動きベクトル検出用のサーチ範囲を狭め、そのサーチ範囲において、動きベクトルを算出して、センサレス手ブレ補正をかけることにより、低コスト、高精度、高速の手ぶれ補正システムが実現できる。
[実施形態の効果]
上述の第1〜第3の実施形態のブロックマッチング手法を用いたセンサレス手ぶれ補正手法は、これまで提案されている、センサレス静止画手ぶれ補正技術に対しては、コスト、精度、処理時間、ロバスト性の、いずれにおいても優位に立つ。
現在市場に出回っている静止画の手ぶれ補正の全ては、ジャイロセンサとレンズシフト等の光学補正を組み合わせて用いたシステムであるが、誤差が大きく、満足のいく画質ではなかった。これに対して、この発明による手法により、センサや機構部分を無くした、低コストかつ高精度の手ぶれ補正が実現する。
[その他の変形例]
上述の実施形態の説明では、参照ベクトルに対する縮小倍率は水平方向と垂直方向とで同一としたが、水平方向と、垂直方向とで、縮小倍率を異ならせるようにしても良いことは前述した通りである。
また、上述の実施形態では、参照ブロックおよびターゲットブロック内の全ての画素についてSAD値を求めるようにしたが、例えばk個(kは自然数)おきの画素のみを用いてSAD値を求めるようにしても良い。
また、リアルタイム処理の動きベクトル検出システムでは、演算コストと処理時間削減を目的として、ターゲットブロック内の代表点のみを参照ブロック内でサーチする、SAD演算がしばしば行われている。
すなわち、図77に示すように、ターゲットブロック103を、例えば横×縦=n×m個(n、mは1以上の整数)からなる複数画素毎に分割し、その分割単位である複数画素のうちの1点の画素を代表点TPとする。そして、SAD演算においては、ターゲットブロック103については、このようにして定めた複数個の代表点TPのみを使用する。
一方、参照ブロック106では全画素をSAD値演算の対象とするもので、ターゲットブロック103の一つの代表点TPに対しては、一つの参照ブロック106において、代表点TPが設定される分割単位であるn×m個からなる複数画素の領域ARに含まれる全画素を使用する。
そして、ターゲットブロック103と、一つの参照ブロック106との間においては、ターゲットブロック102の各代表点TPの画素値と、参照ブロック106の、各代表点TPに対応するそれぞれの領域ARに含まれるn×m個からなる複数の画素のそれぞれの画素値との差分の合計が求められ、そして、求められた代表点TPについての差分の合計が、ターゲットブロック103のすべての代表点TPについて合計されることになる。これが、SADテーブルの一つの要素値となる。
そして、ターゲットブロック103についてのサーチ範囲のすべての参照ブロックについて、上記と同様の代表点TPを用いた差分演算が行われて、SADテーブルが生成されることになる。ただし、この例の場合には、サーチ範囲に設定する複数個の参照ブロックは、前述した分割単位であるn×m個からなる複数画素毎、あるいは当該複数画素の整数倍毎にずれたものとされる。
上述のようにターゲットブロックについて代表点を用いるようにする場合には、SAD値を算出する際のターゲットブロックについてのメモリアクセスは、参照ブロックの領域ARの複数画素毎に対して、一つの代表点TPの1回でよくなり、メモリアクセス数を大幅に少なくすることができる。
また、代表点TPのみを用いる場合には、ターゲットブロックのデータとしては、ブロック内の全画素のうちの代表点TPの画素データのみを記憶すればよいので、元フレーム(ターゲットフレーム)のターゲットブロックのデータを記憶するフレームメモリの容量を削減することができる。
また、フレームメモリとは別に、小規模な代表点メモリ(SRAM)をローカルで持ち、当該ローカルメモリに元フレーム(ターゲットフレーム)のターゲットブロックのデータを保持するようにすることにより、画像メモリ4(DRAM)の帯域削減を図っても良い。
ターゲットブロックについて代表点を用いる場合の処理に関する以上の説明は、図78〜図80を用いて説明した手法におけるものについてであるが、図65〜図68を用いて説明した第2の実施の形態における手法の場合にも適用できることは言うまでもない。
この第2の実施形態における手法において、ターゲットブロックについて代表点TPのみを用いる場合には、入力される参照フレームの画素(入力画素)ごとに、サーチ範囲の全範囲において、当該入力画素を含む領域AR(当該画素の位置は領域ARにおいて同じではない)を備えるすべての参照ブロックを検出し、その検出したすべての参照ブロックのそれぞれにおける領域ARに対応するターゲットブロックの代表点を判定する。
そして、その判定結果として得られる複数個の代表点の画素値を、元フレーム(ターゲットフレーム)の画像データを記憶するメモリからそれぞれ読み出して、その代表点の画素値と当該入力画素との差分をそれぞれ演算し、その演算結果を、SADテーブルにおいて、対応する参照ブロック(参照ベクトル)の座標位置に累積するようにする。
この場合には、メモリアクセスは、ターゲットブロックの代表点のみを読み出すだけであるので、メモリアクセス数を大幅に削減することができるものである。
なお、代表点を用いる処理は、上述した縮小SADテーブルを用いる場合にも適用できることは言うまでもない。
なお、上述の実施形態では、画素の差分値およびSAD値は、画素の輝度値Yのみを用いて演算するものとしたが、動ベクトル検出のために、輝度値Yだけでなく、色差成分Cb/Crを用いてもよい。また、データ変換部14で輝度値Yおよび色差成分Cb/Crに変換される前のRAWデータを対象として、動きベクトル検出処理を行ってもよい。
また、前述もしたが、手ぶれベクトル検出部15は、ハードウエア処理による構成とする場合に限定されるものではなく、ソフトウエアで実現しても良い。
4…画像メモリ、101…元フレーム、102…参照フレーム、103…ターゲットブロック、105…サーチ範囲、106…参照ブロック、107…参照ベクトル、15…手ぶれベクトル検出部、19…回転・平行移動加算部、41〜45…フレームメモリ、TBLi…SADテーブル、SUM_TBL…合算SADテーブル、TBLs…縮小SADテーブル、TBLo…従来のSADテーブル、RV…参照ベクトル、CV…参照縮小ベクトル、NV1〜NV4…近傍参照ベクトル、BLK_Vi…ブロック毎動きベクトル、SUM_V…合算動きベクトル