以下、この発明による画像処理方法および画像処理装置の実施形態を、図を参照しながら説明する。
[この発明による画像処理装置の第1の実施形態]
この発明による画像処理方法を用いた画像処理装置の第1の実施形態として、撮像装置の場合を例にとって、図を参照しながら説明する。図2は、この発明の画像処理装置の第1の実施形態としての撮像装置の一例のブロック図を示すものである。
図2に示すように、この実施形態の撮像装置は、システムバス2にCPU(Central Processing Unit)1が接続されると共に、システムバス2に、撮像信号処理系10や、ユーザ操作入力部3、画像メモリ部4、記録再生装置部5などが接続されて構成されている。なお、この明細書においては、CPU1は、種々のソフトウエア処理を行なうプログラムを記憶するROM(Read Only Memory)やワークエリア用RAMなどを含むものとしている。
ユーザ操作入力部3を通じた撮像記録開始操作を受けて、図2の撮像装置は、後述するような撮像画像データの記録処理を行なう。また、ユーザ操作入力部3を通じた撮像記録画像の再生開始操作を受けて、図2の撮像装置は、記録再生装置部5の記録媒体に記録された撮像画像データの再生処理を行なう。
図2に示すように、撮像レンズ10Lを備えるカメラ光学系(図示は省略)を通じた被写体からの入射光は、撮像素子11に照射されて撮像される。この例では、撮像素子11は、CCD(Charge Coupled Device)イメージャで構成されている。なお、撮像素子12は、CMOS(Complementary Metal Oxide Semiconductor)イメージャで構成してもよい。
この例の撮像装置においては、撮像記録開始操作がなされると、撮像素子11からは、タイミング信号発生部12からのタイミング信号によりサンプリングされることにより、赤(R)、緑(G)、青(B)の3原色から構成されるベイヤー配列のRAW(Read After Write)信号であるアナログ撮像信号が出力される。出力されたアナログ撮像信号は、前処理部13に供給され、欠陥補正やγ補正等の前処理が施され、データ変換部14に供給される。
データ変換部14は、これに入力されたアナログ撮像信号から、輝度信号成分Yと、色差信号成分Cb/Crとにより構成されるデジタル撮像信号(YCデータ)に変換し、そのデジタル撮像信号をシステムバスを介して、画像メモリ部4に供給するとともに、この例においては、手ぶれ動きベクトル検出部15に供給する。
画像メモリ部4は、この図2の例においては、1個のフレームメモリ41からなる。この実施形態では、元フレームがフレームメモリ41に格納されており、参照フレームは、データ変換部14からストリームで入力されて来るものとされる。すなわち、この実施形態では、手ぶれ動きベクトル検出部15は、データ変換部14からのストリーム画像データを参照フレームの画像データとすると共に、フレームメモリ41に格納されている画像データを元フレームの画像データとして、参照ブロックについてのSAD値を求めるようにする。SAD値は、輝度信号成分Yを用いて求めるのは前述したとおりである。
この実施形態では、データ変換部14からのストリーム画像データを参照フレームの画像データとする。このため、ある入力画素に対して、この画素を要素とする参照ブロックが、参照フレーム上に同時に複数存在することになる。図3は、そのことを説明するための図である。
すなわち、参照フレーム102上のサーチ範囲105における入力画素Dinは、例えば、参照ベクトル1071が対応する参照ブロック1061の左側に位置する画素であると共に、参照ベクトル1072が対応する参照ブロック1062の右上に位置する画素となっていることが、この図3から分かる。
したがって、入力画素Dinが参照ブロック1061に属するとした場合には、ターゲットブロック103の画素D1を読み出して、その差分を算出する必要がある。また、入力画素Dinが参照ブロック1062に属するとした場合には、ターゲットブロック103の画素D2を読み出して、その差分を算出する必要がある。
図3および後述の図4では簡単のため、2つの参照ブロックのみを図示しているが、実際上は、入力画素Dinを、その参照ブロック内の画素とする参照ブロックは多数となる。
この実施形態の場合のSAD演算は、入力画素Dinの輝度値Yと、各々の参照ブロック内の入力画素Dinの位置に対応した、ターゲットブロック内の画素の輝度値Yとの差分絶対値を算出し、その算出した差分絶対値を、それぞれの参照ブロックに対応した参照ベクトルに従って、SADテーブルに加算してゆくようにして行なう。
例えば、入力画素Dinが参照ブロック1061に属するとした場合における、ターゲットブロック103の画素D1と入力画素Dinとの差分絶対値は、図4に示すように、SADテーブル108の参照ベクトル1071が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。また、入力画素Dinが参照ブロック1062に属するとした場合における、ターゲットブロック103の画素D2と入力画素Dinとの差分絶対値は、図4に示すように、SADテーブル108の参照ベクトル1072が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。
したがって、サーチ範囲105内の全ての領域の入力画素が入力されて処理が終了したときには、SADテーブルが完成することになる。つまり、リアルタイムでSADテーブルが作成されるものである。
データ変換部14からのデジタル撮像信号の最初の1フレームは、フレームメモリ41に格納されるのみで、手ぶれ動きベクトル検出部15ではSAD値を求める等の演算処理は、行われない。
そして、最初の1フレームがフレームメモリ41に格納されると、次の、フレームのデジタル撮像信号からは、手ぶれ動きベクトル検出部15は、参照ブロックについてのSAD値の演算を開始する。この場合、手ぶれ動きベクトル検出部15は、図3および図4を用いて説明したように、データ変換部14からの画像データと、当該画像データと比較すべき画像が含まれると考えられるすべての参照ブロックの画像データを、システムバス2を介してフレームメモリ41読み出して、それぞれについてのSAD値を求め、求めたSAD値を、それぞれの参照ブロックに対応するSADテーブルアドレスのSAD値に加算するようにする。
そして、この実施形態では、手ぶれ動きベクトル検出部15は、例えば図53に示したような1フレームにおける複数個のサーチ範囲のそれぞれにおけるSADテーブルを作成して、そのSADテーブルにおけるSAD値の最小値を求めて、各サーチ範囲についての動きベクトル(サーチ範囲毎動きベクトル)をそれぞれ求める。
そして、1フレームにおける複数個のサーチ範囲のすべてのサーチ範囲毎動きベクトルから、過去の動きベクトルに対する推移関係をも考慮して、1フレームについての動きベクトルであるグローバル動きベクトルを検出する。
そして、手ぶれ動きベクトル検出部15は、その検出結果であるグローバル動きベクトルを、その後段の解像度変換部16に制御信号として伝達する。
解像度変換部16は、手ぶれ動きベクトル検出部15から受け取ったグローバル動きベクトルにしたがって、フレームメモリ41に格納されている遅延フレームの画像データを切り出しながら、必要な解像度および画像サイズに変換する処理をする。このフレームメモリ41からのグローバル動きベクトルにしたがった切り出しにより、変換後の画像は、手ぶれが除去された画像となる。
この解像度変換部16からの手ぶれが除去された画像データは、NTSC(National Television System Committee)エンコーダ18によりNTSC方式の標準カラー映像信号に変換され、電子式ビューファインダーを構成するモニターディスプレイ6に供給され、撮影時の画像がその表示画面にモニター表示される。
このモニター表示と並行して、解像度変換部16からの手ぶれが除去された画像データはコーデック部17で記録変調などのコーディング処理された後、記録再生装置部5に供給されて、DVD(Digital Versatile Disc)などの光ディスクやハードディスクなどの記録媒体に記録される。
この記録再生装置部5の記録媒体に記録された撮像画像データは、ユーザ操作入力部3を通じた再生開始操作に応じて読み出され、コーデック部17に供給されて、再生デコードされる。そして、再生デコードされた画像データはNTSCエンコーダ18を通じてモニターディスプレイ6に供給され、再生画像がその表示画面に表示される。なお、図2では、図示を省略したが、NTSCエンコーダ18からの出力映像信号は、映像出力端子を通じて外部に導出することが可能とされている。
上述した手ぶれ動きベクトル検出部15は、ハードウエアにより構成することができるし、また、DSP(Digital Signal Processor)を用いて構成することもできる。さらには、CPU1によりソフトウエア処理とすることもできる。
[この発明による実施形態の処理の要部の概要]
上述のようにして、撮像画像のデータについて、1フレーム内で、複数個のサーチ範囲を設定し、リアルタイムでそれぞれのサーチ範囲における動きベクトルを検出しようとする場合、手ぶれ動きベクトル検出部15の入力撮像画像データは、撮像素子11から、主走査方向を水平方向とし、副走査方向を垂直方向として読み出されたラスタースキャン方式の画像データであるので、すべてのサーチ範囲に対して、SAD演算処理部を設けるとともに、SADテーブルメモリを設けるように通常である。
しかし、そのような構成では、回路規模が大きくなるとともに、SADテーブルメモリのサイズは、サーチ範囲に対応する一つ一つのSADテーブルメモリのサイズは、小さいが、全体としては、1フレーム分となるので、やはり、非常に大きなものとなる。したがって、処理の高速化のために、当該SADテーブルメモリを、高価なSRAMで構成することは、前述したように、民生用としては非現実的であり、実現が困難である。
この発明の実施形態は、ターゲットブロックやサーチ範囲の設定を工夫することにより、複数のサーチ範囲に対してSAD演算処理部およびSADテーブルメモリを、できるだけ、共用化することができるようにして、回路規模の縮小化およびコストの低廉化を可能にするものである。
[この発明の実施形態の要部の第1の例]
図5および図6は、この第1の例を説明するための図である。この第1の例においては、図5(A)、(B)に示すように、参照フレーム102における複数個のサーチ範囲105のそれぞれが、画像領域として互いに重ならないように設定する。
元フレーム101のターゲットブロック103の大きさは、検出すべき動きベクトルの大きさに応じたものとして、各サーチ範囲105内のものとして設定される。なお、この明細書の以下の説明では、ターゲットブロック103の大きさの枠103FLを、検波枠と称することとする。
検波枠103FLの大きさは、サーチ範囲105を超えることはできない。そして、検波枠103FLの大きさが、あまりに小さい場合には、動きベクトルの検出精度の点で問題となる。
また、ターゲットブロックに対応する参照ブロックがサーチ範囲105内において移動できる量が、検出対象となる動きベクトルの大きさに対応するので、検出対象となる動きベクトルの大きさが大きい場合には、検波枠103FLの大きさは小さくなり、逆に、検出対象となる動きベクトルの大きさが小さい場合には、検波枠103FLの大きさは大きくすることができる。
以上のことを考慮して、検出対象の動きベクトルの大きさを考慮しながら、検波枠103FLおよびサーチ範囲105のサイズや、フレーム内に設定するそれらの数を決定する。
図5に示す例においては、図5(A)に示すように、ターゲットブロック103、すなわち、検波枠103FLを水平方向に4個、垂直方向にも4個設けるようにしており、このため、水平方向にサーチ範囲105を4個、垂直方向にサーチ範囲105を4個の合計16個のサーチ範囲105を設定するようにする。
ここで、検波枠103FLの数は一例であり、この第1の例で重要なのは、サーチ範囲105が互いに重ならないように設定することである。
この第1の例は、隣り合うターゲットブロック間の距離が、検出すべき動きベクトルの大きさに応じたものとなってしまうので、所定の大きさ以上の検波枠103FLを得る事を考えると、検出すべき動きベクトルの大きさが小さいときに好適な例である。
複数のデジタルスチルカメラやデジタルビデオカメラによる多人数評価の結果、倍率10倍の光学ズームを用いることを前提として、手ぶれを計測した場合、動画では、60fpsのレートで、約±2%の比較的小さい手ぶれが観測された。この%で表した手ぶれの数値は、図5(A)に示すように、全フレーム枠の水平方向を100%、垂直方向を100%としたときの、手ぶれ補正ベクトルの範囲を表した値である。なお、この明細書では、後述するターゲットブロック103の大きさやサーチ範囲105の大きさも、同様にして、%数値で表すものとする。
また、光学ズーム倍率が低い、もしくは光学ズームが存在しないカメラの場合、静止画の場合であっても、考慮しなければならない手ぶれの数値は、上記と同程度である。さらには、例えば従来から用いられており、冒頭で説明したような光学式手ぶれ補正で大まかな補正を行った後の撮像画像データについて、この実施形態のセンサレスの手ぶれ動きベクトル検出方式を採用する場合には、光学ズーム倍率が10倍を想定した場合であっても、この実施形態のセンサレスの手ぶれ動きベクトル検出において考慮しなければならない手ぶれの大きさの数値は、上記と同程度でよい。
したがって、この第1の例は、上述のような状況の場合に好適な例である。
図5の例では、サーチ範囲105が、水平方向に4個、垂直方向に4個であるので、サーチ範囲105の大きさを、(水平方向のサイズ(%)、垂直方向のサイズ(%))で表したとき、図6(B)に示すように、サーチ範囲105の最大値は(25%、25%)となる。このときの動きベクトルの検出範囲は、サーチ範囲と同様の表し方をしたときには、最大(±12.5%、±12.5%)となる。
そして、検波枠103FLの大きさは、同様の表現形式で示すと(0〜25%、0〜25%)となって、最大(25%、25%)となる。
この例においては、サーチ範囲105は、最大値(25%、25%)とすると共に、動きベクトルの検出範囲として、(±2.5%、±2.5%)を想定し、検波枠103FLは(20%、20%)とされる。
この第1の例のように、参照フレーム102上において、すべてのサーチ範囲105が互いに重ならないようにした場合は、SAD演算処理部(以下、SAD演算処理エンジンと称する)を、すべてのサーチ範囲105の処理において共用して、1個とすることができる。
しかし、撮像画像データがラスタースキャン方式の画像データであるので、主走査方向である水平方向の走査期間において、4つのサーチ範囲についてSAD演算処理を行う必要があり、そのため、当該水平方向のサーチ範囲の数分、この例では4個のSADテーブルメモリを設ける必要がある。
そして、SAD演算処理エンジンは、図5(B)に示すように、SAD演算処理をしようとする撮像画像データが、水平方向の4個のサーチ範囲に対応する水平方向の4個の領域Xa,Xb,Xc,Xdのいずれに含まれるものであるかを認識して、その認識結果に応じて、それら4個のSADテーブルメモリを切り替えて使用するようにする。
垂直方向の複数個のサーチ範囲に関しては、水平方向の4個の領域Xa,Xb,Xc,Xdに対応して設けられる4個のSADテーブルメモリを共用することができる。すなわち、この実施形態では、SADテーブルメモリに、一つのサーチ範囲についてのSADテーブル情報が格納されると、SAD演算処理エンジンにより、後述するようにして、サーチ範囲毎動きベクトルが検出され、その検出結果のサーチ範囲毎動きベクトルの情報が他の記憶部に転送される。
こうして、一つのサーチ範囲についてのSAD演算処理が終了した後には、当該SADテーブルメモリの記憶内容は削除可能となる。したがって、処理対象のサーチ範囲が垂直方向に変わったときには、対応する水平方向領域のSADテーブルメモリを利用することができる。
図1は、この第1の例における手ぶれ動きベクトル検出部15の詳細構成例を示すものである。
すなわち、図1に示すように、第1の例における手ぶれ動きベクトル検出部15は、入力バッファ151と、1個のSAD演算処理エンジン152と、例えばSRAMからなる4個のSADテーブルメモリ153a,153b,153c,153dと、例えばDRAM(Dynamic RAM)からなる1フレーム分の動きベクトル記憶用の動きベクトル記憶部154と、グローバル動きベクトル算出部155とを備えて構成されている。
この例では、SADテーブルメモリ153aは水平方向の領域Xa用、SADテーブルメモリ153bは水平方向の領域Xb用、SADテーブルメモリ153cは水平方向の領域Xc用、SADテーブルメモリ153dは水平方向の領域Xd用、としてそれぞれ用いられるものである。
4個のSADテーブルメモリ153a,153b,153c,153dは、SAD演算処理エンジン152に接続されると共に、バス150に接続されている。バス150には、動きベクトル記憶部154とグローバル動きベクトル算出部155とが、さらに接続されている。
そして、データ変換部14からの撮像画像データDinが、入力バッファ151を通じて直接的に手ぶれ動きベクトル検出部15のSAD演算処理エンジン152に供給されると共に、画像メモリ部4を構成するフレームメモリ41に供給されて、1フレーム分遅延された後、SAD演算処理エンジン152に供給される。
なお、検波枠103FL(ターゲットブロック)の全ての画素データを、フレームメモリ41に記憶すると大量のメモリ容量が必要となるため、画素データとしては、例えばn個(nは1以上の整数)おきの画素などの代表点のみをフレームメモリ41に記憶し、SAD演算も、この代表点に関してのみ行って、演算量自体を削減するようにする。
SAD演算処理エンジン152は、入力撮像画像データDinが、水平方向の4個の領域Xa,Xb,Xc,Xdのいずれに属するかにより、当該入力撮像画像データDinのSAD演算処理に用いるSADテーブルとして、4個のSADテーブルメモリ153a,153b,153c,153dのうちのいずれを使用するかを決定する。
そして、SAD演算処理エンジン152は、各サーチ範囲について、後述するようなSAD演算処理を行って、各サーチ範囲に対応するSADテーブルメモリに、SADテーブルの情報を格納する。
そして、SAD演算処理エンジン152は、それぞれのサーチ範囲についてのSADテーブルの生成を完了したら、そのSADテーブルからSAD値の最小値を求め、そのSAD値の最小値から、サーチ範囲毎動きベクトルを検出する。さらに、SAD演算処理エンジン152は、検出したサーチ範囲毎動きベクトルを動きベクトル記憶部154に転送し、その後、当該動きベクトルの検出処理が終了したサーチ範囲用として用いていたSADテーブルメモリをクリアして、次のサーチ範囲用のSADテーブルメモリとして使用する準備を行う。
1フレーム分のすべての撮像画像データについて、SAD演算処理エンジン152での処理が終了すると、動きベクトル記憶部154には、当該1フレームにおける複数個のターゲットブロック(検波枠)のすべてについての動きベクトルの情報が格納される。
グローバル動きベクトル算出部155は、動きベクトル記憶部154に格納された1フレームについての複数個の動きベクトルを、当該動きベクトル記憶部154に格納されている過去の動きベクトルからの推移をも参酌しながら、当該フレームについてのグローバル動きベクトルを検出する。そして、グローバル動きベクトル算出部155は、算出したグローバル動きベクトルの情報を、図2の解像度変換部16に供給するようにする。
[実施形態の手ぶれ動きベクトル検出部15で用いるSAD演算処理の概要]
この実施形態においても、上述したブロックマッチングを用いて、2フレーム間の動きベクトルを検出するのであるが、この実施形態では、各サーチ範囲毎についてのSADテーブルのサイズをさらに小さくすることができるように工夫している。
すなわち、この実施形態では、ターゲットブロックと参照ブロック間において求められるSAD値を、参照ブロックの参照ベクトルに対応してそのまま記憶するのではなく、当該参照ベクトルを縮小し、その縮小した参照縮小ベクトルに対応する、当該参照縮小ベクトルの近傍の複数の参照ベクトルに分散加算して記憶するようにする。
これにより、この実施形態では、従来のSADテーブルに比較して、SADテーブルのサイズを大幅に縮小するようにするものである。
図7〜図10は、実施形態の画像処理方法の概要を説明するための図である。図7は、従来のSADテーブルTBLoと、この実施形態のSAD演算処理方法において生成される縮小SADテーブルTBLsとの関係を示すものである。
この実施形態においても、図50に示したように、従来と同様に参照フレームにおいて、元フレームに設定されたターゲットブロックの位置を中心としてサーチ範囲が設定される。そして、このサーチ範囲において、前述したような複数の参照ブロックが設定され、各参照ブロック内の画素とターゲットブロック内の対応する画素の輝度値の差分の絶対値の総和、つまり、SAD値が求められる。
従来は、求められたSAD値は、図7に示すように、対象となっている参照ブロックの参照ベクトルRVに対応するアドレスのテーブル要素tblとしてSADテーブルTBLoに書き込まれる。
したがって、従来のブロックマッチングでは、ターゲットブロックと参照ブロックとのフレーム画像上における位置ずれ量を表わす参照ベクトルRVと、SADテーブルTBLoの各テーブル要素である参照ブロックのSAD値とは、1対1に対応している。すなわち、従来のSADテーブルTBLoでは、サーチ範囲で取り得る参照ベクトルRVと等しい数のSAD値のテーブル要素数を備えるものとなっている。
これに対して、この実施形態におけるブロックマッチングでは、図7および図8(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)としたときに、図8(A)に示すように、(−3,−5)の位置を示す参照ブロックRVを、水平方向および垂直方向に、1/n=1/4倍に縮小すると、その参照縮小ベクトルCVで示される位置は、図8(B)に示すように、(−0.75,−1.25)となる。
したがって、参照縮小ベクトルCVで示される位置は小数成分が発生し、参照ベクトルで示される位置とは一致しない。
そこで、この場合には、図9に示すように、当該参照縮小ベクトルCVが示す位置の近傍位置を示す複数個の近傍参照ベクトルが検出される。図9の例では、1つの参照縮小ベクトルCVに対して、4個の近傍参照ベクトルNV1,NV2,NV3,NV4が検出される。
そして、前述したように、この実施形態では、参照ベクトルRVの参照ブロックについて求められたSAD値は、これら4個の近傍参照ベクトルNV1,NV2,NV3,NV4に対応するSAD値として分散加算される。
この場合に、この実施形態では、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれに分散加算するSAD値は、参照縮小ベクトルCVで示される位置P0(図9において×印として示す)と、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4(図9において○印として示す)との位置関係を用いて線形加重分散値として算出する。
図9の例の場合には、参照縮小ベクトル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値を求めるようにすれば良い(図7参照)。
したがって、この実施形態の場合には、縮小SADテーブルTBLsのテーブル要素の数は、従来のSADテーブルTBLoのテーブル要素数の1/n2となり、テーブルサイズを大幅に小さくすることが可能である。図1のSADテーブルメモリ153a,153b,153c,153dは、それぞれ縮小SADテーブルTBLsを格納するだけの容量のメモリでよいことはいうまでもない。
なお、上述の実施形態の説明においては、参照縮小ベクトル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テーブルのテーブル要素値に対して補間処理を施すことで、元のベクトル精度で、正確な動きベクトルを検出するようにする。
[より正確な動きベクトルを検出するための補間処理の第1の例]
より正確な動きベクトルを検出するための補間処理の第1の例は、縮小SADテーブルにおける複数個のSADテーブル要素値(SAD値)を、1つの2次曲面で近似する手法である。この手法は、前述した特許文献1に記載されている手法を縮小SADテーブルに対して適用した手法である。
すなわち、縮小SADテーブルにおいて、SAD値が最小値となるテーブル要素(整数精度最小値テーブル要素(整数精度テーブルアドレス))と、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素とを求め、それらのテーブル要素のSAD値を用いて、最小自乗法によりSAD値の2次曲面を決定し、この2次曲面の最小値となるSAD値を検出し、当該検出した最小値となるSAD値に対応する位置(参照フレーム上において、基準位置に対してずれた位置)を検出し、当該検出した位置を小数精度の最小値テーブルアドレス(縮小SADテーブルにおいてSAD値が最小値となるベクトル(最小値ベクトルという)に対応)とする。
この場合、一意の2次曲面を定めるためには、図10(A)または(B)に示すように、整数精度最小値テーブル要素tmと、当該テーブル要素tmをその両側から挟む位置の、当該テーブル要素tmの近傍の4個の整数精度テーブル要素t1,t2,t3,t4が最低限必要である。
そして、図11に示すように、参照フレームのサーチ範囲内の縮小SADテーブルに対応する参照縮小ベクトルの範囲内において、ターゲットフレームの位置を基準位置(0,0)として、水平方向および垂直方向のずれ量(参照縮小ベクトルに対応)の軸vx/nおよび軸vy/nを考えると共に、これらの軸vx/nおよび軸vy/nに垂直な軸として、SAD値の軸を考え、これら3軸からなる座標空間を想定する。
そして、例えば、整数精度最小値テーブル要素tmのSAD値と、当該整数精度最小値テーブル要素tmを挟む2個のテーブル要素t1、t3のSAD値とから、図11の座標空間において2次曲線を生成する。また、整数精度最小値テーブル要素tmのSAD値と、当該最小値テーブル要素tmを挟む他の2個のテーブル要素t2、t4のSAD値とから、図11の座標空間において、他の2次曲線を生成する。そして、これら2個の2次曲線を含む2次曲面201を、最小自乗法により求め、その2次曲面201を、図11に示すように、座標空間において生成する。
そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図11の位置203)を検出し、当該検出した位置(vx/n,vy/n)を、小数精度のテーブル要素(テーブルアドレス)として検出する。そして、検出した小数精度テーブル要素に対応するベクトル(最小値ベクトル)204を、図12に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
例えば、図13に示すように、参照ベクトルを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個の矩形領域のテーブル要素を用いる例]
図14に、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域(図14で塗りを付して示してある)のテーブル要素を用いるようにする例を示す。
この図14の例の場合には、図14(A)に示すように、整数精度最小値テーブル要素tmと、その近傍の8個の近傍テーブル要素のSAD値を用いて、図14(B)に示すような2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図14(B)の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図12に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、SAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図15に示すように、整数精度最小値テーブル要素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位置となる。
そして、図15のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、右下の位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx、dy)は、図16に示す(式A)および(式B)により、求めることができる。
図16の(式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個の矩形領域のテーブル要素を用いる例]
図17に、整数精度最小値テーブル要素tmをほぼ中心として、その周囲の水平方向×垂直方向=4×4個の矩形領域のテーブル要素(図17で塗りを付して示してある)を用いるようにする例を示す。
この場合に、整数精度最小値テーブル要素tmと、その近傍の8テーブル要素(3×3)や、その近傍の24テーブル要素(5×5)のように、前記mの値が奇数である場合には、整数精度最小値テーブル要素tmは、常に、使用する矩形領域の複数のテーブル要素の中心になるため、使用するテーブル範囲は単純に決定する。
これに対して、近傍の15テーブル要素(4×4)のように、mが偶数である場合には、整数精度最小値テーブル要素tmは、使用する矩形領域の複数のテーブル要素の中心位置とはならないので、若干の工夫が必要となる。
つまり、整数精度最小値テーブル要素tmから見て、水平方向に左右の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4列目として採用する。同様に、垂直方向に上下の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4行目として採用する。
図17の例では、整数精度最小値テーブル要素tmの水平方向に左右の隣接テーブル要素のSAD値は、「177」と「173」であるので、SAD値が小さい右隣の値「173」のテーブル要素のさらに右隣の列を第4列目として採用する。また、整数精度最小値テーブル要素tmの垂直方向に上下の隣接テーブル要素のSAD値は、「168」と「182」であるので、SAD値が小さい上隣の値「168」のテーブル要素のさらに上隣の行を第4行目として採用する。
そして、図17の例の場合には、整数精度最小値テーブル要素tmと、その近傍の15個の近傍テーブル要素のSAD値を用いて、2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図17の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図12に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、この例の場合におけるSAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図18に示すように、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標を考える。
この例の場合には、16テーブル要素からなる矩形領域中における整数精度最小値テーブル要素tmの位置に応じて、図18(A),(B),(C),(D)のような4通りのテーブル要素配置を考える必要がある。
この場合、周辺の15個のテーブル要素の位置は、図18(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位置となる。
そして、図18のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx,dy)は、図19に示す(式C)および(式D)により、求めることができる。
ここで、図19の(式C)および(式D)において、KxおよびKyは、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(Kx,Ky)座標(図20参照)を考えたときの、前記図18(A),(B),(C),(D)に示した4通りのテーブル要素配置に応じた値となる。
すなわち、図18(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
となる。
また、図18(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
となる。
また、図18(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
となる。
また、図18(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
となる。
また、図19の(式C)および(式D)におけるΔxおよびΔyは、(Kx,Ky)座標に対する図18(A),(B),(C),(D)の各テーブル要素配置における(x,y)座標とのずれ量を表しており、
図18(A)の場合には、Δx=−0.5、Δy=−0.5、
図18(B)の場合には、Δx=−0.5、Δy=0.5、
図18(C)の場合には、Δx=0.5、Δy=−0.5、
図18(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)を検出して、検出した位置を小数精度の最小値アドレスとするものである。
図21は、この第2の例を説明するための図である。前述の第1の例と同様にして、整数精度最小値テーブル要素tmと、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素、図21の例では、4×4=16個のテーブル要素を求める(図21(A)で塗りを付した部分参照)。
次に、第1の例と同様にして、図21(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を、前述した図12に示すようにn倍して、元の大きさ精度の動きベクトルを得る。
すなわち、第2の例は、第1の例で説明した方法により、水平方向、垂直方向のそれぞれの4個のテーブル要素を確定し、図21(B)に示すように、水平方向、垂直方向のそれぞれで、3次曲線を一意に定める手法である。
ここで、SAD値の3次曲線206および209の最小値202に対応する位置208の算出方法は、次のようになる。すなわち、水平方向または垂直方向のいずれかの方向における3次曲線において、最小値の近傍の4点のSAD値を、前記水平方向または垂直方向のいずれかの方向に沿った順番に、S0、S1、S2、S3としたとき、小数精度の最小値が、図22に示す3つの区間Ra,Rb,Rcのいずれにあるかにより、最小値を取る小数成分uを算出する式が異なる。
ここで、区間RaはSAD値S0となる位置とSAD値S1となる位置との間の区間、RbはSAD値S1となる位置とSAD値S2となる位置との間の区間、RcはSAD値S2となる位置とSAD値S3となる位置との間の区間である。
そして、小数精度の最小値が、図22に示す区間Raにあるときには、図23の(式E)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
また、同様に、小数精度の最小値が、図22に示す区間Rbにあるときには、図23の(式F)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
さらに、小数精度の最小値が、図22に示す区間Rcにあるときには、図23の(式G)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
そして、小数精度の最小値が、図22に示す3つの区間Ra,Rb,Rcのいずれにあるかの判別は、次のようにして行なう。
すなわち、図24は、その判別を説明するための図である。図24(A),(B),(C)に示すように、先ず、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とを検出し、小数精度の最小値は、検出された整数精度のSAD値の最小値Sminの位置と、2番目に小さい整数精度のSAD値Sn2の位置との間の区間に存在するとして検出する。次に、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とが、図22に示したSAD値S0、S1、S2、S3のいずれの位置となっているかにより、検出した区間が区間Ra,Rb,Rcのいずれであるかの判別を行なう。
なお、図24(D)に示すように、整数精度のSAD値の最小値SminがSAD値のまたは位置にあって、4個のテーブル要素値の端に位置する場合には、最小位置が推定できないとして、この実施形態では、エラーとして扱い、最小値位置の算出は行なわないようにする。もっとも、この図24(D)のような場合においても、最小値位置を算出するようにしてもよい。
以上のようにして、この実施形態によれば、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いて、元の画像スケールにおける動きベクトルを検出することができる。この場合に、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いているにも関わらず、従来とほぼ同様のベクトル検出結果が得られることを図25に示す。
図25の横軸は、水平方向または垂直方向の一方についての1次元方向の縮小倍率nであり、また、縦軸は、検出される動きベクトルについての誤差(ベクトル誤差)を示している。図25のベクトル誤差の数値は画素数で表されている。
図25において、曲線301は、縮小倍率に対するベクトル誤差の平均値である。また、曲線302は、縮小倍率に対するベクトル誤差の分散σの3倍値(3σ(99.7%))を示している。曲線303は、曲線302の近似曲線を示している。
図25は、1次元方向の縮小倍率nに対するベクトル誤差を示しているが、SADテーブルは2次元のため、図25に示されるものの2乗の割合でテーブルサイズ(テーブル要素数)が削減されるのに対し、ベクトル誤差は、線形程度にしか増加しないことから、この実施形態による手法の有用性が分かる。
また、n=64(縮小率1/64)倍の縮小倍率でも、ベクトル誤差は小さく、全く異なる動きベクトルを検出出力とするような破綻は見られないことから、実質、1/4096に、SADテーブルのサイズを削減可能であると言える。
また、前述したように、動画の手ぶれ補正においては、リアルタイム性とシステム遅延の削減が強く求められるのに対し、精度については、破綻した全く異なる動きベクトルが検出される場合を除き、ある程度のベクトル検出誤差に対して寛容である。したがって、破綻しないままSADテーブルのサイズを大きく削減することができる、この実施形態は有用性が高いと言える。
以上説明した実施形態の画像処理方法は、従来手法として説明した特許文献4に記載された画像を縮小変換したサイズで動きベクトルを検出する手法に比べて、次に挙げる2つの点において、大きく異なるメリットを有するものである。
まず、第一に、この実施形態による手法は、特許文献4に記載された従来手法と異なり、画像を縮小変換するプロセスを全く必要としない。この実施形態による手法においては、参照ブロックについて算出したSAD値を、SADテーブル(縮小SADテーブル)に代入加算する際に、同時に縮小倍率に相当するアドレス変換を行なうからである。
これにより、この実施形態による手法においては、特許文献4に記載された従来手法のような画像の縮小変換のためのロジックも、縮小した画像をメモリに格納する時間およびバンド幅の浪費も、縮小画像をメモリに貼る領域確保も必要ない、というメリットを有する。
特許文献4に記載された従来手法のもう1つ重要な問題点として、前述も使用にしたように、画像を縮小変換する際のエイリアシング(折り返し歪み)や、低照度ノイズ除去のためのローパスフィルタの存在の問題がある。すなわち、画像縮小する際には、適切なローパスフィルタを通してからリサンプリングを行なわなければならず、さもないと、不要なエイリアシングが発生し、その縮小画像を用いた動きベクトルの精度が著しく損なわれるからである。
縮小変換の際の理想的なローパスフィルタの特性としては、sinc関数に類似した関数であることが、理論的に証明されている。sinc関数自体は、sin(xπ)/(xπ)の形で表されるカットオフ周波数f/2の無限タップのFIR(Finite Impulse Response)フィルタであるが、縮小倍率1/nのときの理想的なカットオフ周波数f/(2n)のローパスフィルタとしては、sin(xπ/n)/(xπ/n)と表される。しかし、これもsinc関数の一形態として良い。
図26〜図28の上側には、それぞれ縮小倍率が1/2倍、1/4倍、1/8倍のときのsinc関数(ローパスフィルタの理想特性)の形状を示す。この図26〜図28から、縮小倍率が大きくなればなる程、関数がタップ軸方向に拡大して行くことが分かる。つまり、無限タップのsinc関数を主要な係数のみで近似する場合にも、FIRフィルタのタップ数を増加させなければならないと言える。
また、一般的に、より低い帯域のカットオフ周波数を実現するフィルタは、フィルタ形状よりもタップ数が、その性能に対して支配的になって行くことが知られている。
したがって、特許文献4に記載の従来手法の縮小画像を用いる動きベクトル演算手法の場合、画像の縮小倍率が大きくなればなる程、そのSADテーブル削減効果が大きいにも関わらず、画像生成する際の前処理用フィルタとしてのローパスフィルタは、縮小倍率が大きくなればなる程、コストが増加してしまう、という矛盾を併せ持つのである。
一般に、高次タップのFIRフィルタを実現する場合、演算ロジックのコストがタップ数の2乗に比例して増加するため、問題となるが、より大きい問題は、垂直フィルタ実現のためのラインメモリ数の増加である。近年のデジタルスチルカメラにおいては、画素数向上に伴うラインメモリのサイズ削減のため、いわゆる短冊処理を行なっているが、例え、1ライン当たりのサイズを削減したとしても、ラインメモリそのものの本数が増加することは、物理レイアウトエリアで換算されるトータルコストを著しく押し上げる。
以上、述べたように、特許文献4に記載の従来手法の画像縮小によるアプローチは、特に垂直ローパスフィルタの実現において、大きな壁が立ちはだかっていることが分かる。それに対し、この発明の手法は、全く異なる形で簡潔にこの問題を解決している。
図26〜図28の下側に、この発明による手法におけるローパスフィルタのイメージを示す。この発明による手法においては、画像縮小処理を伴っていないが、縮小SADテーブルの生成演算過程におけるローパスフィルタのイメージを図示したものである。
図26〜図28の下側に示されるように、このローパスフィルタの特性は、sinc関数の主要係数部分を線形で近似した、シンプルなフィルタ特性ではあるものの、縮小倍率に連動してタップ数が増加していることが分かる。これは、先に述べた、カットオフ周波数が低くなる程、ローパスフィルタの性能はタップ数が支配的になる、という事実に好適である。つまり、実施形態の線形加重分散加算を行なう処理のような、この発明におけるSAD値の分散加算を行なう処理そのものが、倍率連動の高性能ローパスフィルタを、シンプルな回路で実現していることと等価なのである。
このローパスフィルタに絡んで、他にもメリットがある。特許文献4記載の従来手法では、ローパスフィルタをかけた後、リサンプリングすることで画像を縮小するが、この時点で相当数の画像情報が失われる。つまり、ローパスフィルタの演算において、画像情報の輝度値の語長は大幅に丸められてメモリに格納され、殆どの画素情報の下位ビットは、縮小後の画像に影響を与えないのである。
一方、この発明による手法においては、全ての画素の輝度値の全ビット情報を、遍く平等に使用してSAD値を演算し、その分散加算値を求めて縮小SADテーブルに加算する。縮小SADテーブルの各テーブル要素値の語長さえ増やせば、最終的なSAD値の出力まで、一切の丸め誤差を含まない形で演算可能である。縮小SADテーブルの面積はフレームメモリに比較して小さいため、縮小SADテーブルの語長拡張は大きな問題にならない。その結果として、縮小SADテーブル並びに動きベクトル検出を、高精度に実現できるのである。
[手ぶれ動きベクトル検出部15における処理動作(第1の例の場合)]
手ぶれ動きベクトル検出部15のSAD演算処理エンジン152における動きベクトルの検出処理動作の例の流れを、図29および図30のフローチャートを参照して、以下に説明する。なお、この図29および図30のフローチャートの処理は、説明の便宜上、1フレームの撮像画像データについての処理として示している。
先ず、SAD演算処理エンジン152では、入力画像のフレーム(参照フレーム)の任意の位置(x,y)の画素データDin(x,y)を受け取る(ステップS101)。次に、当該入力画像データDin(x,y)の、フレーム上の画素の位置(x,y)を識別する(ステップS102)。
そして、認識した画素位置から、フレーム上のいずれのサーチ範囲の画素データであるかを判別し、その判別結果に基づいて、SADテーブルメモリ153a,153b,153c,153dのうちの一つのSADテーブルメモリを、SADテーブル値の格納用メモリとして選択決定する(ステップS103)。
次に、SAD演算処理エンジン152は、当該入力撮像画像データの画素の位置(x,y)を含む複数の参照ブロックの一つに対応する参照ベクトル(vx,vy)を設定する(ステップS104)。
前述したように、(vx,vy)は、ターゲットブロックのフレーム上の位置(サーチ範囲の中心位置である)を基準位置(0,0)としたときに、指定された参照ベクトルにより示される位置を示し、vxは指定された参照ベクトルによる、基準位置からの水平方向のずれ量成分であり、また、vyは指定された参照ベクトルによる、基準位置からの垂直方向成分のずれ量成分である。そして、前述の従来例で述べたのと同様に、ずれ量vx、vyは、画素を単位とした値とされている。
ここで、サーチ範囲の中心位置を前記基準位置(0,0)とし、サーチ範囲を、水平方向には±Rx、垂直方向には±Ryとしたとき、
−Rx≦vx≦+Rx、−Ry≦vy≦+Ry
とされるものである。
次に、設定された参照ベクトル(vx,vy)の参照ブロックIiの当該画素値Ii(x,y)と、これに対応するターゲットブロックIo内の画素値Io(x−vx,y−vy)との差分の絶対値αを算出する(ステップS105)。すなわち、差分絶対値αは、
α=|Io(x−vx,y−vy)−Ii(x,y)| ・・・(式3)
として算出される。
次に、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS106)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS107)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値(差分絶対値)を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS105で求めた差分絶対値αから、線形加重分散値として求める(ステップS108)。
そして、求めた4個の線形加重分散値を、ステップS103で選択されたSADテーブルメモリのSADテーブルにおいて、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS109)。
次に、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS104〜ステップS108の演算を行なったか否か判別し(ステップS110)、当該入力画素Din(x,y)を含む他の参照ブロックがあると判別したときには、ステップS104に戻り、当該入力画素Dinを含む他の参照ブロック(vx,vy)を設定し、このステップS104〜ステップS109の処理を繰り返す。
また、ステップS110で、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS104〜ステップS109の演算を行なったと判別したときには、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したか否か判別し(図30のステップS121)、終了していないと判別したときには、ステップS101に戻り、次の入力画素Dinを取り込み、このステップS101以降の処理を繰り返す。
そして、ステップS121で、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS122)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS123)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS124)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、当該サーチ範囲について求めるべき動きベクトル(px×n,py×n)を算出する(ステップS125)。
次に、算出したサーチ範囲毎動きベクトル(px×n,py×n)の情報を、動きベクトル記憶部154に転送し、その後、当該SAD演算処理が終了したサーチ範囲についてのSADテーブルメモリの記憶内容をクリアして、後のサーチ範囲の処理用として使用可能な状態にする(ステップS126)。
そして、次に、1フレーム内のすべてのサーチ範囲についての処理を終了したか否かを判別し(ステップS127)、1フレーム内に未処理のサーチ範囲があると判別したときには、図29のステップS101に戻り、このステップS101以降の処理を繰り返す。また、1フレーム内のすべてのサーチ範囲についての処理が終了したと判別したときには、この処理ルーチンを終了する。
以上で、1フレーム内に設定された複数個のサーチ範囲におけるターゲットブロックに対するブロックマッチングによる動きベクトルの検出処理は終了となるが、実際の処理においては、図29および図30の処理が複数フレームに渡って繰り返されるものである。
そして、前述したように、1フレームについての複数個のサーチ範囲毎動きベクトルの検出が終了すると、グローバル動きベクトル検出部155が動作を開始し、動きベクトル記憶部154に格納されているそれらの複数個のサーチ範囲毎動きベクトルおよびそれより過去の複数個のサーチ範囲毎動きベクトルを用いて、グローバル動きベクトルを検出する。
なお、上述の例では、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、2次曲面を用いる方法を使用したが、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
[手ぶれ動きベクトル検出部15における処理動作の他の例]
図25に示したように、上述の実施形態による動きベクトルの検出手法を用いた場合には、参照ベクトルの縮小倍率が1/64の場合でも、全く異なる動きベクトルを出力するような破綻は見られないことから、実質的に1/4096に、SADテーブルを削減可能である。
つまり、1/4096に削減した縮小SADテーブルを用意しておき、参照ベクトルの縮小倍率を例えば1/64として1回目の動きベクトルを検出する。次に、1回目で検出したその動きベクトルを中心にしてサーチ範囲を狭め、2回目の検出を、参照ベクトルの縮小倍率を例えば1/8として行なうようにすればよい。すなわち、1回目と2回目とで縮小倍率を変えて、1回目のベクトル誤差範囲内に収まるように、2回目の縮小倍率を設定すれば、かなりの高精度で、動きベクトル検出が可能である。
また、サーチ範囲をさらに絞り、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、動きベクトルの検出処理を繰り返すようにしても、勿論良い。
また、以上の例では、元フレームはフレームメモリに格納され、参照フレームはデータ変換部から直接的に入力されるものとしたが、画像メモリ部4に、2個のフレームメモリを設けて、2枚の画像、つまり元フレームの画像と、参照フレームの画像との両方を、それら2個のフレームメモリに格納するようにし、それらのフレームメモリからの元フレームの画像データおよび参照フレームの画像データを用いて、上述したSAD演算処理を行うようにしてもよい。
しかし、図2の撮像装置の構成の場合には、以下のようなメリットがある。すなわち、フレームメモリを、参照フレームもフレームメモリから読み出す場合に比べて1枚分削減できることと、フレームメモリに入力画像を格納する時間を短縮できる。メモリ削減の効果は言うまでもないが、処理時間の短縮も、近年、重要視されて来ている。特に動画を扱う場合、そのままシステム遅延の短縮に繋がるため、システム遅延が原因で生じる、実際の被写体とパネル表示画像の間に生じる違和感をなるべく無くすことは、ユーザへの訴求効果が高い。
[この発明の実施形態の要部の第2の例]
上述の実施形態では、入力撮像画像データは、撮像素子やフレームメモリからラスタースキャン(図31(A)参照)で読み出されて、手ぶれ動きベクトル検出部15に入力されることを前提に説明した。しかし、昨今のデジタルスチルカメラやビデオカメラでは、撮像素子の高画素化に伴い、短冊スキャンで撮像素子からの撮像画像データの読み出しが行われるシステムも増えてきている。
短冊スキャンとは、図31(B)に示すように、水平方向の走査幅(折り返し幅)が、1ラインの全幅ではなく、1ラインの整数分の1の幅(短冊幅という)DHとされるスキャン方式である。
すなわち、水平走査の折り返し幅が短冊幅DHに限定され、各短冊幅DHの画面領域の最終ラインまで垂直走査が進んだ後、右隣接の短冊幅DHの画面領域の左上から再び短冊幅DHの水平走査を繰り返すというスキャン方式である。
この短冊スキャンを採用することにより、ラインメモリの容量が短冊幅DHに限定されるため、ハードウエアコストの低減が図れることが最大のメリットである。内部処理の短冊数を変えるだけで、同一のLSI(Large Scale Integrated circuit)で、様々なサイズの撮像素子にも対応できるという長所もある。
この短冊スキャンを用いて撮像素子やフレームメモリから読み出した撮像画像データの場合には、サーチ範囲の水平走査方向の幅を、短冊幅DHあるいはそれ以下に設定した場合には、短冊幅DHの水平走査では、他のサーチ範囲に及ばないので、垂直方向のサーチ範囲を互いに重ならないように設定したときには、SAD演算処理エンジンのみでなく、SADテーブルメモリも、共通の1個とすることができる。
図32および図33は、この第2の例を説明するための図である。この第2の例においては、図32(A)、(B)に示すように、参照フレーム102における複数個のサーチ範囲105のそれぞれの水平方向の幅が、短冊スキャンの短冊幅DH以下に設定されて、画像領域として水平方向に互いに重ならないようにされる。
参照フレーム102における複数個のサーチ範囲105は、また、垂直方向においても画像領域として互いに重ならないように設定される。
前述したように、SADテーブルメモリの数を削減のためには、サーチ範囲の水平方向の幅の上限は短冊幅DHとなり、その範囲内で妥当な検波枠103FLのサイズと、動きベクトル検出範囲としてのサーチ範囲105を設定することになる。
この第2の例においても、元フレーム101のターゲットブロック103の大きさ、すなわち、検波枠103FLは、検出すべき動きベクトルの大きさに応じたものとして、各サーチ範囲105内のものとして設定される。
図32に示す例においては、図32(A)に示すように、短冊幅DHが1水平ライン分の1/8(水平方向の全幅の12.5%)とされるので、ターゲットブロック103、すなわち、検波枠103FLを水平方向に8個設ける。また、図32の例では、検波枠103FLは、垂直方向にも8個設けるようにしており、このため、水平方向にサーチ範囲105を8個、垂直方向にサーチ範囲105を8個の合計64個のサーチ範囲105を設定するようにする。
したがって、図33(B)に示すように、サーチ範囲の最大値は、(12.5%、12.5%)となる。このときの動きベクトルの検出範囲は、図6(B)に示すように、最大(±6.25%、±6.25%)となる。
そして、図32に示すように、短冊幅DHが全水平走査幅の12.5%であるので、図33(A)に示すように、検波枠103FLは、(0〜12.5%、0〜12.5%)の大きさとなり、最大(12.5%、12.5%)のサイズとなる。
図33の例では、サーチ範囲105は、最大(12.5%、12.5%)とすると共に、動きベクトルの検出範囲として、(±1.25%、±1.25%)を想定した場合には、検波枠103FLは(10%、10%)とされる。
しかし、ある程度の検波枠103FLのサイズと、サーチ範囲105を確保しようとした場合には、検波枠103FLの大きさは、(7.5%、7,5%)、動きベクトル検出範囲は、(±2,5%、 ±2,5%)とする辺りが妥当である。
前述したように、この第2の例の場合、水平方向のサーチ範囲の幅は、上述した短冊幅DHを上限として、互いに重ならないように保証されるため、垂直方向のサーチ範囲さえ、隣接する検波枠103FLで互いに重ならないようにすれば、全ての検波枠103FLについてのSAD演算を、1つのSAD演算処理エンジンで処理可能であると共に、一つの検波枠103FLについてのサーチ完了後に、次の検波枠103FLについてのサーチに移るようにしているため、SADテーブルメモリも、その都度、検出した動きベクトルを外部のDRAMメモリに転送すれば、1つだけで全ての検波枠103FLについてのSAD演算処理を賄えることになる。
[この発明の実施形態の要部の第3の例]
複数のデジタルスチルカメラやデジタルビデオカメラによる多人数評価の結果、倍率10倍の光学ズームを用いることを前提として、手ぶれを計測した場合、動画の場合には、前述したように比較的小さい手ぶれが観測されたが、静止画の場合には、3fpsのフレーム間で約±10%の手ぶれが観測された。また、数秒に渡る長時間露光の場合でも、手ぶれは、ほぼ±10%程度に収まることが確認できた。
つまり、静止画を前提とした手ブレ補正システムにおいては、約±10%の範囲内の手ぶれ動きベクトルを検出する必要がある。しかも、システムとしてのロバスト性を高めるには、手ぶれ動きベクトル(グローバル動きベクトル)の元となるサーチ範囲毎動きベクトルは、なるべく多くの数分、独立して検出されることが望ましく、また、複数個のサーチ範囲毎動きベクトルに対応する複数個の検波枠は、できるだけ1フレーム全体の広い領域をカバーすることが望ましい。
この第3の例は、±10%のベクトル検出範囲を有しながら、検波枠の数と、検波枠のトータルの面積とを増加させ、なおかつ、SAD演算処理エンジンの数や、SADテーブルのサイズをできる限り削減することができる、バランスを持った構成を提供するものである。
上述の第1の例および第2の例においては、動きベクトルの検出範囲は、例えば2.5%程度など、比較的小さい範囲であったので、隣接するサーチ範囲が互いに重ならないように、サーチ範囲を設定し、そのサーチ範囲内に検波枠を設定するようにした。
しかしながら、この第3の例の場合には、±10%のベクトル検出範囲を有しながら、検波枠の数と、検波枠のトータルの面積とを増加させるようにするため、検波枠(ターゲットブロック)103FLは、図34に示すように、水平方向および垂直方向の隣り合う検波枠103FL間の隙間をできるだけなくして、隣接して設けるようにする方がよい。
ところが、そのようにすると、図34(A)および図35(A)〜(C)からも明らかなように、水平方向の隣り合うサーチ範囲、例えばサーチ範囲105Aと105Bとの間またはサーチ範囲105Cと105Dとの間および垂直方向の隣り合うサーチ範囲、例えばサーチ範囲105Aと105Cとの間またはサーチ範囲105Cと105Dとの間には、必ず重なる領域が発生する。このため、SAD演算処理エンジンは、これら隣り合うサーチ範囲105A,105B,105C,105Dにおいては、共用できない。
しかし、図34(B)および図35(A)〜(C)に示すように、水平方向および垂直方向の一つおきの検波枠103FL(ターゲットブロック)について着目すると、互いに重ならない画像領域にサーチ範囲を設定することが可能である。図34(B)および図35(A)〜(C)に示すように、サーチ範囲105A,105B,105C,105Dのそれぞれが、水平方向および垂直方向において、互いに接するように設定される状態が、この場合のサーチ範囲の最大値である。したがって、サーチ範囲105A,105B,105C,105Dのそれぞれの大きさは、図34(B)および図35(A)〜(C)に示す範囲以下にも、検出対象の動きベクトルの大きさに応じて設定可能である。
上述した第1の例および第2の例の説明から理解されるように、サーチ範囲が互いに重ならない領域に設定できれば、それらのサーチ範囲については、共通のSAD演算処理エンジンを用いることができる。また、それらのサーチ範囲については、水平方向には、サーチ範囲の数分のSADテーブルメモリが必要であるが、垂直方向には、SADテーブルメモリを共用することができる。
図34、図35および図36に示したのは、以上のことを考慮した、静止画のセンサレス手ぶれ補正システムにおける動きベクトルの検出用として、最も好適な検波枠、並びにサーチ範囲の配置手法の一例である。
すなわち、この例においては、フレームサイズを、(水平方向、垂直方向)=(100%、100%)としたとき、図36(A)に示すように、最大値が(水平方向、垂直方向)=(20%、20%)のサイズの検波枠103FLを、図34(A)に示すように、水平方向に4枠、垂直方向に4枠の計16枠設ける。
この場合に、図34(A)に示すように、複数個の検波枠103FLは、1画面(1フレーム)の周辺部を除く領域に、できるだけ隙間を空けずに敷き詰めるように設ける。1フレームの周辺部は、動きベクトルの大きさに応じて、サーチ範囲内において参照ブロックを移動させるために必要となる領域であり、検波枠の動きベクトル検出範囲に応じたものとなる。
上述したように、実験結果から、±10%の動きベクトル検出範囲を設ければ、センサレスの静止画手ぶれ補正システムが、ほぼ実現できることが予想されるので、この例においては、各検波枠の動きベクトル検出範囲は、図36(B)に示すように、最大(±10%、±10%)とする。
したがって、このとき、検波枠103FLを移動させる範囲としてのサーチ範囲105(サーチ範囲105A,105B,105C,105Dの大きさは同一)は、図36(B)に示すように、最大(40%、40%)となる。
この第3の例においては、互いに重ならないサーチ範囲は、サーチ範囲105A,105B,105C,105Dの4種類あるので、これらの4種類のサーチ範囲に応じて、SAD演算処理エンジンは、4個必要となる。
そして、この第3の例においては、図34(B)、図35および図37(A)に示すように、サーチ範囲105Aにおける検波枠103FLのターゲットブロックを、A0,A1,A2,A3とすると、4個のサーチ範囲105Aにおいて、これらのターゲットブロックと、当該サーチ範囲105A内に設定される参照ブロックとのSAD演算処理は、図37(B)に示す1個のSAD演算処理エンジン152Aが共用されて実行するようにする。
また、サーチ範囲105Bにおける検波枠103FLのターゲットブロックを、図34(B)、図35および図37(A)に示すように、B0,B1,B2,B3とすると、4個のサーチ範囲105Bにおいて、これらのターゲットブロックと、サーチ範囲105B内に設定される参照ブロックとのSAD演算処理は、図37(C)に示す1個のSAD演算処理エンジン152Bが共用されて実行するようにする。
また、サーチ範囲105Cにおける検波枠103FLのターゲットブロックを、図34(B)、図35および図37(A)に示すように、C0,C1,C2,C3とすると、4個のサーチ範囲105Cにおいて、これらのターゲットブロックと、サーチ範囲105C内に設定される参照ブロックとのSAD演算処理は、図37(D)に示す共通のSAD演算処理エンジン152Cが共用されて実行するようにする。
また、サーチ範囲105Dにおける検波枠103FLのターゲットブロックを、図34(B)、図35および図37(A)に示すように、D0,D1,D2,D3とすると、4個のサーチ範囲105Dにおいて、これらのターゲットブロックと、サーチ範囲105D内に設定される参照ブロックとのSAD演算処理は、図37(E)に示す共通のSAD演算処理エンジン152Dが実行するようにする。
そして、この第3の例においては、互いに重ならないサーチ範囲105A,105B,105C,105Dのそれぞれは、水平方向に2個のサーチ範囲が存在するので、SADテーブルメモリは、それぞれのSAD演算処理エンジン152A,152B,152C,152Dについて、それぞれ2個ずつ設ける。したがって、この第3の例においては、16個の検波枠(あるいはサーチ範囲)に対して、4個のSAD演算処理エンジンと、8個のSADテーブルメモリを用いることにより、動きベクトルの検出ができる。
図38は、この第3の例における手ぶれ動きベクトル検出部15の詳細構成例を示すものである。図1に示した手ぶれ動きベクトル検出部15の詳細構成例と同一部分には、同一符号を付している。
すなわち、図38に示すように、第3の例における手ぶれ動きベクトル検出部15は、入力バッファ1511および1512と、前述した4個のSAD演算処理エンジン152A,152B,152C,152Dと、例えばSRAMからなる8個のSADテーブルメモリ153A1,153A2,153B1,153B2,153C1,153C2,153D1,153D2と、例えばDRAM(Dynamic RAM)からなる1フレーム分の動きベクトル記憶用の動きベクトル記憶部154と、グローバル動きベクトル算出部155とを備えて構成されている。
SADテーブルメモリ153A1,153A2は、SAD演算処理エンジン152Aに対して接続されており、SADテーブルメモリ153A1は水平方向の前半のサーチ範囲105Aで、SADテーブルメモリ153A2は水平方向の後半のサーチ範囲105Aで、それぞれ用いられる。
また、SADテーブルメモリ153B1,153B2は、SAD演算処理エンジン152Bに対して接続されており、SADテーブルメモリ153B1は水平方向の前半のサーチ範囲105Bで、SADテーブルメモリ153B2は水平方向の後半のサーチ範囲105Bで、それぞれ用いられる。
また、SADテーブルメモリ153C1,153C2は、SAD演算処理エンジン152Cに対して接続されており、SADテーブルメモリ153C1は水平方向の前半のサーチ範囲105Cで、SADテーブルメモリ153C2は水平方向の後半のサーチ範囲105Cで、それぞれ用いられる。
また、SADテーブルメモリ153D1,153D2は、SAD演算処理エンジン152Dに対して接続されており、SADテーブルメモリ153D1は水平方向の前半のサーチ範囲105Dで、SADテーブルメモリ153D2は水平方向の後半のサーチ範囲105Dで、それぞれ用いられる。
なお、図38においては、SAD演算処理エンジン152A,152B,152C,152Dのブロック内にターゲットブロック名を表示して、SADテーブルメモリと、各ターゲットブロックとの対応を示しているが、これは、イメージ図であって、実際のSAD演算処理エンジンの構成では、ターゲットブロック毎にSAD演算処理部が構成されているわけではなく、SAD演算処理部は、一つのみが存在するだけである。
この第3の実施形態においては、データ変換部14からの撮像画像データDinが、入力バッファ1511、また、入力バッファ1512を通じて直接的に4個のSAD演算処理エンジン152A,152B,152C,152Dに供給されると共に、画像メモリ部4を構成するフレームメモリ41に供給されて、1フレーム分遅延された後、SAD演算処理エンジン152A,152B,152C,152Dに供給される。
なお、検波枠全ての画素データをフレームメモリ41に記憶すると大量のメモリ容量が必要となるため、例えばn個(nは1以上の整数)おきの画素などの代表点のみをフレームメモリ41に記憶し、SAD演算も、この代表点に関してのみ行って、演算量自体を削減するようにする。
SAD演算処理エンジン152A,152B,152C,152Dのそれぞれは、入力撮像画像データDinが、自エンジンが処理対象とするサーチ範囲内のデータであるか否かを判別して、そうであれば、当該入力撮像画像データDinを取り込んで、SAD演算処理するようにする。そして、取り込んだ撮像画像データDinが、水平方向の前半のサーチ範囲に属するのか、後半のサーチ範囲に属するのかにより、当該入力撮像画像データDinのSAD演算処理に用いるSADテーブルメモリとして、2個のSADテーブルメモリのうちのいずれを使用するかを決定する。
そして、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれは、各サーチ範囲について、後述するようなSAD演算処理を行って、各サーチ範囲に対応するSADテーブルメモリに、SADテーブルの情報を格納する。
そして、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれは、それぞれのサーチ範囲についてのSADテーブルの生成を完了したら、そのSADテーブルからSAD値の最小値を求め、そのSAD値の最小値から、サーチ範囲毎動きベクトルを検出する。さらに、SAD演算処理エンジン152は、検出したサーチ範囲毎動きベクトルを動きベクトル記憶部154に転送し、その後、当該動きベクトルの検出処理が終了したサーチ範囲用として用いていたSADテーブルメモリをクリアして、次のサーチ範囲用のSADテーブルメモリとして使用する準備を行う。
1フレーム分のすべての撮像画像データについて、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれでの処理が終了すると、動きベクトル記憶部154には、当該1フレームにおける複数個のターゲットブロック(検波枠)のすべてについての動きベクトルの情報が格納される。
グローバル動きベクトル算出部155は、動きベクトル記憶部154に格納された1フレームについての複数個の動きベクトルを、当該動きベクトル記憶部154に格納されている過去の動きベクトルからの推移をも参酌しながら、当該フレームについてのグローバル動きベクトルを検出する。そして、グローバル動きベクトル算出部155は、算出したグローバル動きベクトルの情報を、図2の解像度変換部16に供給するようにする。
この第3の例においても、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれにおいて実行するSAD演算処理は、図7〜図28を用いて説明した縮小参照ベクトルを用いる新規な手法が用いられる。
[手ぶれ動きベクトル検出部15における処理動作(第3の例の場合)]
手ぶれ動きベクトル検出部15のSAD演算処理エンジン152A,152B,152C,152Dにおける動きベクトルの検出処理動作の例の流れを、図39および図40のフローチャートを参照して、以下に説明する。なお、この図39および図40のフローチャートの処理は、説明の便宜上、1フレームの撮像画像データについての処理として示している。
先ず、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれは、入力画像のフレーム(参照フレーム)の任意の位置(x,y)の画素データDin(x,y)を受け取る(ステップS131)。次に、当該入力画像データDin(x,y)の、フレーム上の画素の位置(x,y)を識別する(ステップS132)。
そして、認識した画素位置から、自分のSAD演算処理エンジンが処理対象としているサーチ範囲内の撮像画像データであるか否か判別し(ステップS133)、自分のSAD演算処理エンジンが処理対象としているサーチ範囲内の撮像画像データでなければ、ステップS131に戻って、次の入力撮像画像データDinの到来を待って受け付ける。
ステップS133で、自分のSAD演算処理エンジンが処理対象としているサーチ範囲内の撮像画像データであると判別したときには、水平方向の前半のサーチ範囲のデータか、あるいは、水平方向の後半のサーチ範囲のデータかを判別し、その判別結果に基づいて、自分のSAD演算処理エンジン用とされる2個のSADテーブルメモリのうちの一つのSADテーブルメモリを、SADテーブル値の格納用メモリとして選択決定する(ステップS134)。
次に、SAD演算処理エンジン152A,152B,152C,152Dのそれぞれは、当該入力撮像画像データの画素の位置(x,y)を含む複数の参照ブロックの一つに対応する参照ベクトル(vx,vy)を設定する(ステップS135)。
次に、設定された参照ベクトル(vx,vy)の参照ブロックIiの当該画素値Ii(x,y)と、これに対応するターゲットブロックIo内の画素値Io(x−vx,y−vy)との差分の絶対値αを算出する(ステップS136)。すなわち、差分絶対値αは、
α=|Io(x−vx,y−vy)−Ii(x,y)| ・・・(式3)
として算出される。
次に、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS137)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS138)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値(差分絶対値)を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS105で求めた差分絶対値αから、線形加重分散値として求める(ステップS139)。
そして、求めた4個の線形加重分散値を、ステップS134で選択されたSADテーブルにおいて、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS140)。
次に、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS135〜ステップS140の演算を行なったか否か判別し(ステップS141)、当該入力画素Din(x,y)を含む他の参照ブロックがあると判別したときには、ステップS135に戻り、当該入力画素Dinを含む他の参照ブロック(vx,vy)を設定し、このステップS135〜ステップS140の処理を繰り返す。
また、ステップS141で、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS104〜ステップS109の演算を行なったと判別したときには、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したか否か判別し(図40のステップS151)、終了していないと判別したときには、ステップS131に戻り、次の入力画素Dinを取り込み、このステップS131以降の処理を繰り返す。
そして、ステップS151で、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS152)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS153)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS154)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、当該サーチ範囲について求めるべき動きベクトル(px×n,py×n)を算出する(ステップS155)。
次に、算出したサーチ範囲毎動きベクトル(px×n,py×n)の情報を、動きベクトル記憶部154に転送し、その後、当該SAD演算処理が終了したサーチ範囲についてのSADテーブルメモリの記憶内容をクリアして、後のサーチ範囲の処理用として使用可能な状態にする(ステップS156)。
そして、次に、1フレーム内のすべてのサーチ範囲についての処理を終了したか否かを判別し(ステップS157)、1フレーム内に未処理のサーチ範囲があると判別したときには、図39のステップS131に戻り、このステップS131以降の処理を繰り返す。また、1フレーム内のすべてのサーチ範囲についての処理が終了したと判別したときには、この処理ルーチンを終了する。
以上で、1フレーム内に設定された複数個のサーチ範囲におけるターゲットブロックに対するブロックマッチングによる動きベクトルの検出処理は終了となるが、実際の処理においては、図39および図40の処理が複数フレームにわたって繰り返されるものである。
そして、前述したように、1フレームについての複数個のサーチ範囲毎動きベクトルの検出が終了すると、グローバル動きベクトル検出部155が動作を開始し、動きベクトル記憶部154に格納されているそれらの複数個のサーチ範囲毎動きベクトルおよびそれより過去の複数個のサーチ範囲毎動きベクトルを用いて、グローバル動きベクトルを検出する。
なお、上述の例では、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、2次曲面を用いる方法を使用したが、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
また、この第3の例においても、前述の第1の例で説明した他の例を適用することができる。すなわち、参照ベクトルの縮小倍率を1回目よりも2回目、さらに2回目よりも3回目というように、順次に小さくすると共に、それぞれの回で検出した動きベクトルに応じてサーチ範囲の位置およびその大きさを決定するようにして、複数段階にSAD演算処理を実行することができる。
この場合に、1回目では、粗く、広いサーチ範囲の動きベクトル検出を行い、2回目では、より精度の高い、サーチ範囲を絞り込んだ動きベクトル検出が可能である。例えば、2回目の動きベクトル検出処理では、図41に示すターゲットブロックA,B,C,Dについての1回目の動きベクトル検出の検出結果に従って、それぞれのターゲットブロックA,B,C,Dの周囲を中心に、各ターゲットブロックA,B,C,D毎に異なったサーチ範囲105A,105B,105C,105Dを設定して動きベクトル検出を行うことができる。
このような場合でも、垂直方向の検波枠のサーチ範囲は互いに干渉しないため、動きベクトル検出範囲が最大(±10%、±10%)を満たしている限り、上述した第3の例の構成で、そのまま対応可能である。
なお、以上の第3の例では、最大(20%、20%)のサイズの検波枠を、水平方向に4枠、垂直方向に4枠の計16枠、各検波枠の動きベクトル検出範囲を最大(±10%、±10%)、検波枠を移動させる範囲としてのサーチ範囲は、最大(40%、40%)としたが、例えば、検波枠のサイズを小さくすることで、物理的なサーチ範囲を保ったまま、動きベクトル検出範囲をより大きくすることも可能である。
[第3の例の発展例]
上述した第3の例の考え方をより発展させれば、図38に示した構成の手ぶれ動きベクトル検出部15を用いて、より応用範囲の広い手ぶれ補正システムを実現することができる。つまり、垂直方向の複数個の検波枠(サーチ範囲)については、SADテーブルメモリを共通に用いることができるので、図42(A),(B)に示すように、検波枠103FLを、水平方向は、図34に示した例と同様に4枠のまま、垂直方向の枠数を、例えば8枠やそれ以上にすることが可能である。
すなわち、一つおきの検波枠のサーチ範囲が互いに重ならないという条件を満たせば、第3の例と全く同じ議論によって、4個のSAD演算処理エンジンと8個のSADテーブルメモリの構成の手ぶれ動きベクトル検出部15により、垂直方向の検波枠の増加分をカバーできる。この例では、図42(B)に示すように、ターゲットブロックA0〜A7の8個の検波枠(サーチ範囲)のSAD演算を1つのSAD演算処理エンジン152Aで担当する。
ただし、図42の例の構成の場合、垂直方向のサーチ範囲は図34の例の場合から半減し、図43(A)に示すように、最大(20%、10%)のサイズの検波枠103FLを、水平方向に4枠、垂直方向に8枠の計32枠を、1フレームについて設ける。そして、各検波枠103FLの動きベクトル検出範囲は、図43(B)に示すように、最大(±10%、±5%)、検波枠103FLを移動させる範囲としてのサーチ範囲105は最大(40%、20%)となる。
例えば、光学10倍ズームの場合は、前述したように±10%の動きベクトル検出範囲が必要であるが、もっと低いズーム倍率の場合には、それよりも狭い動きベクトル検出範囲で十分である。また、第1の例でも述べた光学式手ぶれ補正との併用時にも、狭い動きベクトル検出範囲で十分となる。
そのような場合には、この第3の例の発展例のような検波枠の構成を採用することによって、必要十分な範囲の動きベクトルを、前述した図34に示した第3の例と比較して4倍の数だけ検出することが可能となる。結果として、より精度の高い手ぶれ補正システムが実現できる。
[第3の例の発展例の他の例]
また、図44、図45および図46は、第3の例の発展例の他の例を説明するための図である。前述の図42の例は、垂直方向の検波枠103FLの枠数のみを増加した場合であったが、この例は、垂直方向の枠数のみでなく、水平方向の検波枠103FLの枠数も、増加させた場合である。
この例では、図44(A)、(B)に示すように、水平方向および垂直方向の検波枠103FLの枠数は、それぞれ8枠として、全体として8×8=64個の検波枠103FLを設定するようにする。
この例においても、図44(B)および図45(A)〜(C)に示すように、水平方向および垂直方向の一つおきの検波枠103FL(ターゲットブロック)について着目すると、互いに重ならない画像領域にサーチ範囲を設定することが可能である。
図44(B)および図45(A)〜(C)に示すように、サーチ範囲105A,105B,105C,105Dのそれぞれが、水平方向および垂直方向において、互いに接するように設定される状態が、この場合のサーチ範囲の最大値である。したがって、サーチ範囲105A,105B,105C,105Dのそれぞれの大きさは、図44(B)および図45(A)〜(C)に示す範囲以下にも、検出対象の動きベクトルの大きさに応じて設定可能である。
したがって、この例においても、一つおきの検波枠のサーチ範囲が互いに重ならないという条件を満たすことにより、前述の第3の例と全く同じ議論によって、4個のSAD演算処理エンジンにより、手ぶれ動きベクトル検出部15を構成することができる。
ただし、この例の場合には、共通のSAD演算処理エンジンでの処理対象となる水平方向のサーチ枠は、図44(B)に示すように、4個となるので、サーチ範囲105A,105B,105C,105Dのそれぞれについて、4個のSADテーブルメモリが必要となり、図42の例の場合の倍の数のSADテーブルメモリが必要となる。垂直方向には、SADテーブルメモリを共用することができることは前述した通りである。
以上のことから、この例の場合には、水平方向のサーチ範囲は図42の例の場合から半減し、図46(A)に示すように、検波枠103FLは、最大(10%、10%)のサイズとなる。そして、そのサイズの検波枠103FLが、図44(A)および(B)に示すように、水平方向に8枠、垂直方向に8枠の計64枠、1フレームについて設けられる。
そして、この例の場合、前記のサイズの各検波枠103FLの動きベクトル検出範囲は、図46(B)に示すように、最大(±5%、±5%)、検波枠103FLを移動させる範囲としてのサーチ範囲105は最大(20%、20%)となる。
このように、この例は、動きベクトル検出範囲が狭くなるが、前述したように、動画の手ぶれ補正の場合のように、動きベクトルが比較的小さい場合に有効である。また、光学手ぶれ補正と組み合わせた場合には、前述もしたように、手ぶれ動きベクトル検出部15で検出する動きベクトルは、静止画の場合であっても小さくなるので、そのような場合にも有効である。
また、この例の場合には、検波枠の大きさが小さくなるので、サーチ範囲毎動きベクトルの精度は悪化する可能性があるが、回転被写体の場合には、精度が向上するし、グローバル動きベクトルの精度は、確実に向上する。
また、この例の場合には、1フレーム中の動きのある被写体(動被写体という)についての検出精度の向上が期待できるので、1フレーム内において、静止部分については、サーチ範囲毎動きベクトルを重ね合わせ、動被写体部分では、サーチ範囲動きベクトルを重ね合わせしないことにより、あらゆる被写体についての、手ぶれ動きベクトルの検出に対応することが可能となると期待される。
[撮像装置の第2の実施形態]
以上の実施形態の撮像装置は、主として動画の手ぶれ補正システムを想定したものであり、静止画の手ぶれ補正における回転成分については言及しなかった。以下に説明する第2の実施形態の撮像装置は、この手ぶれの回転成分についても考慮した静止画の手ぶれ補正システムに、この発明を適用した場合である。
この第2の実施形態においては、上述の実施形態と同様に、入力画像フレームを参照フレームとして、この入力画像フレームと、フレームメモリ内の入力画像フレームを1フレーム遅延させた画像フレームとの間で動きベクトル検出を行なう。そして、この実施形態における静止画についての手ぶれ補正は、連続的に撮影した複数枚の画像、例えば3fpsの画像を、手ぶれ補正を行いながら重ね合わせることにより行なう。
このように、この第2の実施形態においては、撮影した静止画の手ぶれ補正を、連写した複数の画像について手ぶれ補正をかけながら重ね合わせて行くため、ピクセル精度(1画素精度)に近い精度が求められる。つまり、この実施形態においては、手ぶれ動きベクトルとしては、水平方向および垂直方向の平行移動成分と同時に、回転成分も検出する必要が生じる。
図47は、この第2の実施形態の場合の撮像装置の構成例を示すブロック図である。この図47の例は、図2に示した実施形態の撮像装置において、手ぶれ動きベクトル検出部15と、解像度変換部16との間に回転加算部19を設けると共に、画像メモリ部4に、フレームメモリ41の他に、もう1つのフレームメモリ42を設け、このフレームメモリ42を、動きベクトルの回転成分の検出用およびフレーム画像の重ね合わせ用として用いるようにする。その他は、図2の構成と同様である。
手ぶれ動きベクトル検出部15は、前述の実施形態で説明した動画の場合と同様にして、データ変換部14からの入力画素データを、参照フレームの画素データとすると共に、フレームメモリ41の格納データを元フレームのデータとして、動きベクトルの検出処理を行なう。
そして、この第2の実施形態においては、手ぶれ動きベクトル検出部15で検出された複数個のサーチ範囲毎動きベクトルの情報は、回転加算部19に供給される。回転加算部19では、これら複数のサーチ範囲毎動きベクトルを総合的に処理し、平行移動成分としての手ぶれベクトル(グローバル動きベクトル)と、回転角度を検出する。
そして、回転加算部19は、この検出した手ぶれベクトルと回転角度に従って、1フレーム遅延の後、フレームメモリ41に格納されている画像フレームを、切り出しと同時に回転させながら、フレームメモリ42の画像に加算もしくは平均化して行く。この過程を繰り返すことにより、フレームメモリ42には、手ぶれの無い、より高S/Nで、より高解像度の静止画像の画像フレーム120が生成される(図48参照)。
そして、解像度変換部16は、フレームメモリ42のフレーム画像から、所定の解像度および所定の画像サイズを切り出して、前述したように、記録撮像画像データとしてコーデック部17に供給すると共に、モニター画像データとしてNTSCエンコーダ18に供給する。
この第2の実施形態においても、手ぶれ動きベクトル検出部15においては、サーチ範囲を絞りながら、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、縮小SADテーブルを用いた動きベクトル検出処理を繰り返すようにすることができる。この第2の実施形態の、静止画についての手ぶれ動きベクトル検出および手ぶれ補正処理においては、リアルタイム性の制約が少なく、画素数の多く、高精度の動きベクトルの検出が必要であるので、複数段階の階層的な動きベクトル検出処理が非常に有効である。
[撮像装置の第3の実施形態]
上述の撮像装置の第2の実施形態では、入力画像に対し、常に1フレーム前の画像との比較によって、グローバル手ぶれ動きベクトルと回転角度を求める方式であったが、実際には、図48に示したように、1枚目を基準として、以降のフレームを足し合わせるため、動きベクトル検出も1枚目を基準にする方が誤差は小さくなる。第3の実施形態の撮像装置は、この点を考慮したものである。図49に、この第3の実施形態による撮像装置の構成例のブロック図を示す。
すなわち、この第3の実施形態の撮像装置においては、画像メモリ部4には、フレームメモリ41およびフレームメモリ42に加えて、フレームメモリ43を設ける。そして、データ変換部14からの画像データは、フレームメモリ41とフレームメモリ43とに書き込むようにする。
そして、この第3の実施形態においては、フレームメモリ43を、ターゲットとなる1枚目のフレーム(元フレーム)格納用として用いて、常に、この画像に対する入力画像の参照ベクトルを算出するシステムの構成を示す。この構成においても、フレームメモリ42に加算画像結果が格納される。その他は、第2の実施形態の撮像装置と同様に構成される。
なお、この第3の実施形態の撮像装置では、入力画像の1フレーム目を基準画像として、無限加算もしくは無限平均加算も可能なシステムを示したが、もしメモリ容量がふんだんに存在するか、記録再生装置部5への一時的な退避が許されるならば、予め加算対象の画像を全て保存しておき、それらをトーナメント式に加算、もしくは平均加算して行く方法を採用しても良い。
[撮像装置の第4の実施形態]
以上説明した撮像装置の第1〜第3の実施形態によるセンサレス手ブレ補正と、現存技術である光学手ぶれ補正とを組み合わせることによって、より高い効果が得られる。
冒頭で説明したように、ジャイロセンサを用いる光学手ぶれ補正は、大まかな補正を得意としており、また、回転補正が難しいのに対し、ブロックマッチングを使用したセンサレス手ぶれ補正は、回転補正も含めた精度は高いが、サーチ範囲が広くなると、SADテーブルのコストが急上昇するか、この実施形態の手法を用いたとしても、複数段階の動き検出処理による場合には処理時間を要するからである。
したがって、光学手ぶれ補正で大まかに補正して、センサレベル手ぶれ補正のための動きベクトル検出用のサーチ範囲を狭め、そのサーチ範囲において、動きベクトルを検出して、センサレス手ブレ補正をかけることにより、低コスト、高精度、高速の手ぶれ補正システムが実現できる。
[実施形態の効果]
以上説明したように、上述の第1〜第4の実施形態のブロックマッチング手法を用いることにより、従来、動画のセンサレス手ぶれ補正システムで課題とされてきた、SADテーブルの大幅な削減が可能となるばかりか、SADテーブルの容量爆発のために、ほぼ不可能と思われていた、静止画のセンサレス手ぶれ補正も容易に実現できる。
また、上述の第1〜第4の実施形態のブロックマッチング手法を用いたセンサレス手ぶれ補正手法は、これまで提案されている、センサレス静止画手ぶれ補正技術に対しては、コスト、精度、処理時間、ロバスト性の、いずれにおいても優位に立つ。
現在市場に出回っている静止画の手ぶれ補正の全ては、ジャイロセンサとレンズシフト等の光学補正を組み合わせて用いたシステムであるが、誤差が大きく、満足のいく画質ではなかった。これに対して、この発明による手法により、センサや機構部分を無くした、低コストかつ高精度の手ぶれ補正が実現する。
[その他の変形例]
上述の実施形態の説明では、一つおきのターゲットブロックについてのサーチ範囲を互いに重ならないように設定した場合について説明したが、水平方向および/または垂直方向において、二つ以上おきのターゲットブロックについてサーチ範囲を互いに重ならないように設定する場合においても、それらの互いに重ならないサーチ範囲について、この発明は適用可能である。
また、上述の実施形態の説明では、参照ベクトルの縮小倍率は水平方向と垂直方向とで同一としたが、水平方向と、垂直方向とで、参照ベクトルの縮小倍率を異ならせるようにしても良い。
また、前述もしたように、参照ブロックおよびターゲットブロック内の全ての画素についてSAD値を求めるようにしてもよいが、上述の実施形態のように、例えばk個(kは自然数)おきの画素のみを用いてSAD値を求めるようにするとよい。
また、リアルタイム処理の動きベクトル検出システムでは、演算コストと処理時間削減を目的として、ターゲットブロック内の代表点のみを参照ブロック内でサーチする、SAD演算がしばしば行われているが、この発明においても、元フレームを格納するフレームメモリには、フレーム画像内におけるそれぞれのブロックの代表点のみを格納することにより、大幅なメモリ削減が図れる。また、フレームメモリとは別に、小規模な代表点メモリをローカルで持ち、グローバルメモリ(DRAM)の帯域削減を図っても良い。
また、上述の実施形態では、画素の差分値およびSAD値は、画素の輝度値Yのみを用いて演算するものとしたが、動きベクトル検出のために、輝度値Yだけでなく、色差成分Cb/Crを用いてもよい。また、データ変換部14で輝度値Yおよび色差成分Cb/Crに変換される前のRAWデータを対象として、動きベクトル検出処理を行ってもよい。
また、前述もしたが、手ぶれ動きベクトル検出部15は、ハードウエア処理による構成とする場合に限定されるものではなく、ソフトウエアで実現しても良い。
なお、上述の説明では、SAD演算処理は、参照ベクトルを縮小してSAD演算処理を行う新規な方法を用いる場合について説明したが、図50〜図52を用いて説明した従来のSAD演算処理を用いることができることは言うまでもない。
また、上述の例では、水平方向を主走査方向とし、垂直方向を副走査方向とする走査方式を前提に説明したが、垂直方向を主走査方向とし、水平方向を副走査方向とする走査方式で読み出された撮像画像データにもこの発明は適用できることは言うまでもない。
101…元フレーム、102…参照フレーム、103…ターゲットブロック、105…サーチ範囲、106…参照ブロック、107…参照ベクトル、15…手ぶれ動きベクトル検出部、41〜45…フレームメモリ、TBLs…縮小SADテーブル、TBLo…従来のSADテーブル、RV…参照ベクトル、CV…参照縮小ベクトル、NV1〜NV4…近傍参照ベクトル