以下に、この発明による撮像画像信号の歪み補正方法および装置の実施形態を、図を参照しながら説明するに、以下に説明する実施形態は、撮像素子としてX−Yアドレス型の固体撮像素子の代表例であるCMOSイメージャを用いて撮像した撮像画像について、前述したCMOS手ぶれを補正する場合の例である。
[この発明の実施形態の概要]
図1は、この発明による撮像画像信号の歪み補正方法の実施形態の概要を説明するためのタイミングチャートである。この実施形態では、フレーム間の手ぶれを補正するために、手ぶれ速度検出出力を、1フレーム期間(1垂直周期期間)に渡って時間積分して、当該1フレーム期間におけるフレーム間手ぶれ量を算出する。このフレーム間手ぶれ量は、マイクロコンピュータで、ソフトウエア処理により、1フレーム期間にわたって、例えば順次に所定間隔で離散的に、検出した手ぶれ速度を積分して得るようにする。
算出したフレーム間手ぶれ量は、図1において×印で示すように、垂直同期信号に同期して取得する。そして、取得したフレーム間手ぶれ量からフレーム間補正量を求め、このフレーム間補正量により、次のフレームの先頭の処理開始座標(撮像素子上の画素の絶対座標に対応)を求める。求めた処理開始座標の情報は、フレーム内補正処理回路ブロックに渡して、設定するようにする。
フレーム内補正処理回路ブロックは、この実施形態では、ハードウエアで構成される。そして、フレーム内補正処理回路ブロックでは、この実施形態では、水平同期信号に同期したタイミングでライン単位の手ぶれ補正量(フレーム内補正量)を求め、このライン単位の手ぶれ補正量により、各ラインの水平方向および垂直方向の座標位置を補正するようにする。
ここで、ライン単位の手ぶれ補正量は、理想的には、図1において・印に示すように、手ぶれ速度検出出力を1水平周期毎にサンプリングして検出し、当該検出した手ぶれ速度検出出力から求めるようにするのがよい。しかしながら、手ぶれ速度センサの出力のサンプリング間隔は、1水平周期とすることは困難である。そこで、この実施形態では、後述するように、1画面区間を複数に分割し、各分割画像区間では、手ぶれ速度は同じと見なして、各分割画像区間単位で、ライン単位の手ぶれ補正量を得るようにする。次に、フレーム内手ぶれ補正処理の概要について説明する。
[フレーム内手ぶれ補正処理の概要]
次に、フレーム内手ぶれ補正処理の概要について説明する。図2は、フレーム内手ぶれ補正処理の概要説明図である。この図2の概要説明図においては、図2(A)に示すように、画像に生じるCMOS手ぶれによる歪みを判りやすく示すために、歪みの無いオリジナルの画像として多数個の長方形からなる格子縞模様の画像を想定している。したがって、CMOS手ぶれによる画像歪みは、当該格子縞模様を構成する長方形の変形歪みとして現れるものとなる。
なお、この実施形態においても、CMOSイメージャは、図22に示したような1画面とする水平有効領域および垂直有効領域で定まる有効画像領域EFL(1垂直周期分)よりも広い範囲の実効画像領域AFLを有するものが用いられるものである。なお、図2(A)〜(D)に示した1画面分の画像は、図22の有効画像領域EFLの大きさの画像である。
この実施形態では、水平方向の画素クロックの速度は、手ぶれの速度よりも十分に早いとし、また、撮像画像データの読み出しは、1水平ライン単位で順次に行なうものとして、手ぶれ補正は、1水平ライン単位で行なうようにする。
また、この実施形態では、図2(B),(C),(D)に示すように、CMOSイメージャの有効画像領域EFL分の画像区間は、垂直方向に複数に等分割し、各分割画像区間Pdivでは、同じ手ぶれ速度の手ぶれ変位を受けるものと仮定している。ここで、分割数は、手ぶれ補正したときに、必要十分な補正効果が得られる分割画像区間Pdivの大きさを考慮して定められる。以下に説明する例では、有効画像領域EFLの画像区間を垂直方向に8分割するようにする。すなわち、この例では、分割画像区間Pdivは、垂直同期信号の1周期を1/8に分割した区間となる。
1つの分割画像区間Pdivは、複数水平ライン分からなるが、この実施形態では、同じ分割画像区間Pdivに含まれる複数水平ラインは同じ手ぶれ速度の手ぶれ変位を受けるものと仮定して手ぶれ補正処理を行なうものである。
そして、この実施形態では、8個の分割画像区間Pdiv_0〜Pdiv_7のそれぞれの先頭の水平ラインに対する手ぶれ速度ベクトルを、図2(B)の左側の矢印に示すようなものとして、手ぶれ速度検出手段により検出する。すなわち、この例では、手ぶれ速度ベクトルは、1画面分の撮像画像について、8箇所において、離散的に検出するようにする。
図2(B)の画像は、手ぶれ速度ベクトルが、各分割画像区間Pdivで、左側の矢印のようなものとした時に生じる手ぶれによる撮像画像の歪みを示している。この実施形態では、この手ぶれによる撮像画像の歪みを、水平方向処理と垂直方向処理とに分けて、それぞれの方向の歪みを別々に補正するようにする。
補正処理の詳細については後述するが、この実施形態では、先ず、水平方向の歪みについて補正処理を行ない、次いで、垂直方向の歪みについての補正処理を行なう。この場合に、1画面分の撮像画像のすべてのデータについての水平方向の歪み補正処理が完了する前であっても、垂直方向の歪み補正処理が可能になった段階で、垂直方向の歪み補正処理を開始して、水平方向の歪み補正処理と並行して行なうようにすることにより、効率良く歪み補正処理を行なうようにする。
そこで、この実施形態では、先ず、手ぶれによる水平方向の画像歪みを補正するために、図2(C)の左側の矢印および図2の左側の矢印で示すように、各分割画像区間Pdiv_0〜Pdiv_7について検出した手ぶれ速度ベクトルVec(Vec_0〜Vec_7)の水平方向成分の逆符号成分(以下、この手ぶれ速度ベクトルの水平方向成分の逆符号成分を、水平補正速度成分という)X_STB(X_STB_0〜X_STB_7)を求める。
そして、各分割画像区間Pdiv_0〜Pdiv_7内においては、各水平ラインのそれぞれについての水平方向の手ぶれ量を補正するための補正量として、上述のようにして求めた水平補正速度成分X_STB_0〜X_STB_7を、それぞれの水平ラインについて時間積分(各分割画像区間Pdiv_0〜Pdiv_7の先頭の水平ライン時点を基準点とした時間で積分)して算出する。図3の右側に、その積分結果の値としての水平方向の手ぶれ補正量(以下、水平手ぶれ補正量という)SX_ADDを示す。
この図3から判るように、各水平ラインのそれぞれについての水平手ぶれ補正量SX_ADDは、各分割画像区間Pdiv_0〜Pdiv_7においては、一定の傾きで変化し、かつ、積分であるので、分割画像区間の境目では折れ線とはなるが、連続的なものとなり、ずれは生じない。
水平方向の歪み補正処理においては、以上のようにして求められた各ラインについての手ぶれ水平補正量SX_ADDを用いて、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。すなわち、各水平ラインの読み出し開始位置を、図2(B)における手ぶれに応じて水平方向にずれた位置からとすることにより、図2(C)の画像に示すように、水平方向の歪みが補正されることになる。
この図2(C)の画像は、図2(B)の画像歪みの内の水平方向の歪みは補正されて除去されているが、垂直方向の歪みが残っている。
そこで、この実施形態では、手ぶれによる垂直方向の画像歪みを補正するため、図2(D)の左側の矢印に示すように、各分割画像区間Pdiv_0〜Pdiv_7について検出した手ぶれ速度ベクトルの垂直方向成分の逆符号成分(以下、この手ぶれ速度ベクトルの垂直方向成分の逆符号成分を、垂直補正速度成分という)Y_STB_0〜Y_STB_7を求める。
そして、各分割画像区間Pdiv_0〜Pdiv_7内においては、各水平ラインのそれぞれについての垂直方向の手ぶれ量を補正するための補正量として、上述のようにして求めた垂直補正速度成分Y_STB_0〜Y_STB_7を、それぞれの水平ラインについて時間積分(各分割画像区間Pdiv_0〜Pdiv_7の先頭の水平ライン時点を基準点とした時間で積分)して算出する。
この積分結果としての垂直方向の手ぶれ補正量(以下、垂直手ぶれ補正量という)SY_ADDは、ここでは、図示を省略するが、各分割画像区間Pdiv_0〜Pdiv_7においては、一定の傾きで変化し、かつ、積分であるので、分割画像区間の境目では折れ線とはなるが、連続的なものとなり、ずれは生じない。
垂直方向の歪み補正処理においては、以上のようにして求められた各ラインについての垂直手ぶれ補正量SY_ADDを用いて、CMOSイメージャ上での各水平ラインの垂直方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。これにより、図2(D)の画像に示すように、水平方向の場合と同様にして垂直方向の歪みが補正され、歪みの除去された撮像画像データ出力が得られる。
水平手ぶれ補正量および垂直手ぶれ補正量を用いて、手ぶれによるCMOSイメージャについてのフォーカルプレーン現象による画像歪みが補正される様子は、前述した特許文献2と同様である。
しかしながら、特許文献2で採用されている方法の場合には、離散的なサンプリング位置で手ぶれを検出し、その検出結果から前記離散的なサンプリング位置での手ぶれ量を求め、当該離散的なサンプリング位置での手ぶれ量を用いて補間をすることにより、各ライン位置での手ぶれ量を推定するようにしている。
このため、特許文献2の場合には、前記直前ラインの手ぶれ量Qnと、前記直後ラインの手ぶれ量Qn+1との両方が得られた後でないと、前記直前ライン後の各ラインの手ぶれ量を、補間処理により得るようにすることができない。このため、前記直前ラインの後の各ラインについての手ぶれ補正処理が、最大、離散的なサンプリング周期区間である複数ライン区間分だけ遅延することになる。
また、上述の図25(C)の補間(1)の方法を用いた場合には、補間値としての手ぶれ量の変化時間で、画像位置がずれる可能性がある。
また、図25(C)の補間(2)の方法の場合には、直前ラインの手ぶれ量Qnと直後ラインの手ぶれ量Qn+1とから、手ぶれ量の変化の傾きを求め、その傾きに、直前ラインからの対象ラインまでのライン数を乗算することにより、当該対象ラインの手ぶれ量を求めるようにしなければならない。このため、乗算器が必要になると共に、乗算パラメータを別途設定するためのレジスタを設ける必要があり、ハードウエアが複雑化すると共に、回路規模が大きくなる。さらに、乗算誤差のため、手ぶれ量のサンプリング値が変わる境界位置において、図25(C)の補間(2)の場合の図のように連続的にはならずに、画像位置がずれる可能性がある。
これに対して、この実施形態では、1画面区間を複数個に分割し、各分割画像区間の例えば先頭の水平ラインについて、手ぶれ速度を検出する。そして、各分割画像区間内においは、当該検出した手ぶれ速度を、各水平ラインについて順次に積分してゆくことにより、各水平ラインの手ぶれ量(手ぶれ補正量)を検出する。この点は、特許文献2の補間処理とは大きく異なる。
この実施形態では、各水平ラインの手ぶれ量(手ぶれ補正量)は、手ぶれ速度を積分することにより算出するものであるので、各水平ラインの手ぶれ量(手ぶれ補正量)の算出は、特許文献2の手ぶれ量の補間処理の場合のように、離散的な2箇所の手ぶれを検出した後とする必要がなく、検出した手ぶれ速度を用いて即座に各水平ラインの手ぶれ量の算出を開始することが可能になる。
なお、この実施形態では、手ぶれ速度ベクトルから水平成分および垂直成分を抽出するときに、その逆符号成分を算出して、補正速度成分とするようにしたが、速度成分あるいは手ぶれ量を逆符号として、補正速度成分あるいは手ぶれ補正量とするのは、撮像画像データに対する手ぶれ補正処理の実行開始前であれば、どの時点であっても良い。
[この発明の実施形態の構成]
次に、この発明による撮像画像信号の歪み補正方法および装置の実施形態を、図を参照しながら説明するに、図4は、この発明の実施形態が適用された撮像装置のブロック図を示すものである。
図4に示すように、撮像レンズ1Lを備えるカメラ光学系1を通じた被写体からの入射光は、撮像素子2に照射されて撮像される。この例では、撮像素子2は、前述したようにX−Yアドレス型の固体撮像素子の一例であるCMOSイメージャで構成されている。
この例では、撮像素子2からは、タイミング信号発生部4からのタイミング信号により1ライン単位が同時に取り出される(サンプリングされる)ことによりアナログ撮像信号とされて出力される。そして、出力されたアナログ撮像信号は、データ変換部3に供給される。
データ変換部3は、これに入力されたアナログ撮像信号に必要な補正処理を加えた後、タイミング信号発生部4からのクロック信号に同期してデジタル撮像信号に変換する。そして、データ変換部3は、デジタル撮像信号を輝度信号成分と色差信号成分とからなる撮像画像データDinに変換し、その撮像画像データDinを信号処理部5に供給する。
信号処理部5は、データ変換部4からの撮像画像データDinについて、これに接続されている画像メモリ6への書き込み/読み出しを制御しながら、手ぶれ補正などの補正処理や、撮像画像の電子ズーム処理(電子的拡大・縮小処理)を行なうとともに、指定された解像度の出力画像データDoutを生成して出力する。
信号処理部5には、タイミング信号発生部4から、出力画像データの水平周期に同期する信号、すなわち、水平同期信号H−SYNCと、出力画像データの垂直周期に同期する信号、すなわち、垂直同期信号V−SYNCと、1画素周期のクロック信号CLKと、それらに同期するクロックが、処理タイミング信号として供給される(図4においては、これらの信号の図示は省略)。
また、撮影時に撮像装置を保持している撮影者による手ぶれ速度を検出する手ぶれ速度検出部7が設けられる。この手ぶれ速度検出部7は、撮像素子2の、撮像画像の水平方向および/または垂直方向の、所定速度以上の比較的高速の位置的変化を手ぶれとして、その速度ベクトルを検出する。ここで、比較的高速の位置的変化としたのは、撮影者による撮像装置のゆっくりとしたパンニング操作(左右方向への移動)や、ゆっくりとしたチルティング操作(上下方向の移動)を、手ぶれとして検出しないためである。
この手ぶれ速度検出部7は、例えば撮像装置の筐体に取付けられた角速度センサにより構成される。この手ぶれ速度検出部7の検出出力は、手ぶれ速度ベクトルである。この手ぶれ速度検出部7は、角速度センサの代わりに加速度センサを用いて構成しても良い。加速度センサを用いる場合には、加速度センサ値(方向成分も含む)を積分することで、手ぶれ速度(手ぶれ速度ベクトル)を検出し、手ぶれ速度検出部7の検出出力とするようにする。
この手ぶれ速度検出部7の検出出力は、手ぶれ速度検出処理部8に供給される。この手ぶれ速度検出処理部8には、タイミング信号発生部4からサンプリング信号Spが供給され、このサンプリングSpにより前記手ぶれ速度検出部7の検出出力(手ぶれ速度ベクトル)がサンプリングされて、前述した各分割画像区間Pdiv_0〜Pdiv_7についての8個の手ぶれ速度ベクトルVec_0〜Vec_7が求められる。
そして、手ぶれ速度検出処理部8では、8個の手ぶれ速度ベクトルVec_0〜Vec_7を、その水平方向成分と、垂直方向成分とに分離し、それら水平方向成分および垂直方向成分の逆符号成分を水平補正速度成分および垂直補正速度成分として生成する。そして、生成した水平補正速度成分および垂直補正速度成分を信号処理部5に供給する。
また、この例の撮像装置は、全体を制御すると共に、フレーム間手ぶれ補正量を検出する処理を行なうマイクロコンピュータを搭載する制御部9を備える。制御部9は、マイクロコンピュータがソフトウエアにより実行する機能手段として、フレーム間手ぶれ補正量検出手段91と、フレーム先頭座標算出手段92とを備える。
フレーム間手ぶれ補正量検出手段91は、前述したように、手ぶれ速度検出部7からの手ぶれ速度を1垂直期間に渡って積分して、フレーム間手ぶれ補正量を算出する。この場合の、フレーム間手ぶれ補正量検出手段91における手ぶれ速度のサンプリング間隔は、前述したフレーム内手ぶれ速度のサンプリング間隔(分割画像区間毎)と同じでも良いが、より短いサンプリング間隔とする方が良い。すなわち、各フレームの先頭では、その前フレームにおける手ぶれ速度を積分することにより、当該前フレームに対する画像位置ずれに対応するフレーム間手ぶれ補正量が得られる。
このフレーム間手ぶれ補正量検出手段91で算出されたフレーム間手ぶれ補正量は、フレーム先頭座標算出手段92に渡される。フレーム先頭座標算出手段92は、このフレーム間手ぶれ補正量から、当該フレームの先頭座標、すなわち、後述する初期x座標SXおよび初期y座標SYを算出し、信号処理部5に供給する。
そして、この制御部9には、ユーザインターフェース10が接続されている。そして、このユーザインターフェース10を通じて、ユーザからの画像拡大・縮小指示入力や、解像度指示入力、また、ズーム倍率の値の指示入力が制御部9に与えられる。制御部9は、それらの指示入力に応じた制御信号を形成し、タイミング信号発生部4や信号処理部5に供給する。
信号処理部5では、画像メモリ6への画像データの書き込み/読み出しを制御しながら、後で詳述するようにして、手ぶれ速度検出処理部8からの水平補正速度成分と垂直補正速度成分とから、各水平ラインの水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDを算出し、これら算出した水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDを用いて、データ変換部3からの撮像画像データDinについての手ぶれによる画像歪みを補正処理し、出力画像データDoutを得る。
なお、前述したように、信号処理部5では、電子ズーム(画像拡大・縮小)処理を行なうと共に、標準精細度、高精細度などに応じた解像度変換処理なども行なう。
信号処理部5からの出力画像データDoutは、記録処理部11により例えばデータ圧縮されると共に、記録メディア12への記録に適した変調が施された後、記録メディア12に記録される。記録メディア12としては、磁気テープや磁気ディスクなどの磁気記録媒体、DVD(Digital Versatile Disc)などの光ディスク媒体、ハードディスク、カード型メモリなどを用いることができる。なお、出力撮像画像データをインターネットやワイヤレス通信手段を介して記録メディア12に記憶するようにすることもできる。
信号処理部5からの出力画像データDoutは、また、表示系処理部13を通じて表示モニターとしての、例えばLCD(Liquid Crystal Display)などのディスプレイに供給され、画像表示される。記録メディア10に記録された撮像画像データも、再生処理部14により再生され、表示系処理部13を通じて表示モニターに供給され、再生画像表示される。
[制御部9でのフレーム間手ぶれ補正量およびフレーム先頭座標算出処理]
前述したように、制御部9は、フレーム間手ぶれ補正量およびフレーム先頭座標算出処理をソフトウエア処理により行なうようにするが、図5に、その算出処理のフローチャートを示す。
すなわち、制御部9のマイクロコンピュータでは、各垂直周期期間において、手ぶれ速度検出部7からの手ぶれ速度を積分しており、垂直同期信号V−SYNCに同期したサンプリングタイミングなると、割り込みが発生して図5のフローチャートを開始し、当該過去1垂直期間の手ぶれ速度の積分値を取り込む(ステップS101)。
そして、取り込んだ積分値の逆符号成分をフレーム間手ぶれ補正量ΔFstbとする(ステップS102)。次に、1フレーム前の撮像画像のフレーム先頭座標(SXp,SYp)に、フレーム間手ぶれ補正量ΔFstbに基づいて算出されたフレーム先頭座標のオフセット値を加算して、次フレームの先頭座標(SX,SY)を算出する(ステップS103)。
すなわち、
SX=SXp+α・ΔFstbx・・・(1)
SY=SYp+α・ΔFstby・・・(2)
なる演算式(1)、(2)により、次フレームの先頭座標(SX,SY)を算出する。
ここで、αは調整係数であり、α<1である。また、ΔFstbxは、フレーム間補正量ΔFstbの水平方向(x方向)成分であり、ΔFstbyは、フレーム間補正量ΔFstbの垂直方向(y方向)成分である。
そして、調整係数は、撮像素子の撮像画枠AFLから、切り出し画枠EFLの撮像画像が切り出されるとき、切り出し画枠EFLの位置が撮像画枠AFLの中央位置に寄るようにするための係数である。
すなわち、図6(A)に示すように、初期的には、切り出し画枠EFLが、撮像画枠AFLの中央になるように、フレーム先頭座標(SX,SY)は、原点座標ORに設定されるが、フレーム間手ぶれ補正により、フレームの先頭座標位置がシフトされると、切り出し画枠EFLが、図6(B)に示すように変化する。
この切り出し画枠EFLを、フレーム間手ぶれ補正量ΔFstbをそのまま用いた場合に、特に、その大きさ大きいときには、切り出し画枠EFLが撮像画枠AFL内のいずれかの方向に偏って張り付いてしまうような状態になり、その方向の手ぶれにはもはや対応できないようになってしまう。
この切り出し画枠EFLを、フレーム間手ぶれ補正量ΔFstbをそのまま用いた場合に、特に、その大きさが大きいときには、切り出し画枠EFLが撮像画枠AFL内のいずれかの方向に偏って張り付いてしまうような状態になり、その方向の手ぶれにはもはや対応できないようになってしまう。
図6(B)を参照して、この調整係数αによる処理効果を説明する。すなわち、前フレームの撮像画像に対するフレーム間手ぶれ補正量に対応して、前フレームのフレーム先頭座標が、原点座標ORから矢印AR1で示すようにシフトした座標M1に移動して、切り出し画枠が実線で示す画枠EFLbであったとする。
そして、当該前フレームについてのフレーム間手ぶれ補正量ΔFstbを算出し、そのフレーム間手ぶれ補正量ΔFstbそのものに応じて切り出し画枠を設定したとすると、現フレーム(これから切り出そうとするフレーム)のフレーム先頭座標は、図6(B)において、矢印AR2で示すようにシフトした座標M2になったとする。
すると、この座標M2をフレーム先頭座標とする現フレームの切り出し画枠は、図6(B)において一点鎖線で示す画枠EFLvとなり、撮像画枠AFLからはみ出てしまい、当該はみ出た部分は、データ補間などの処理により生成する他はない。
しかし、この実施形態では、前フレームについてのフレーム間手ぶれ補正量ΔFstbに調整係数αを乗じて、フレーム先頭座標を決定するようにするので、矢印AR2に対して、前フレームに対する現フレーム間のシフトは、矢印AR3のようになる。これにより、現フレームのフレーム先頭座標は座標M3のようになって、切り出し画枠は、破線で示す画枠EFLpのようになり、撮像画枠AFL内に入る。
なお、以上の説明では、フレーム間補正量ΔFstbに対して常に所定の調整係数αを乗じるようにしたが、前フレームの先頭座標は常に既知であるので、現フレームに対するフレーム間手ぶれ補正量ΔFstbにより切り出し画枠を設定したときに、撮像画枠AFLを越えてしまうようになったときに、調整係数αを乗じるようにしても良い。
また、上述の説明では、フレーム間補正量ΔFstbに対して常に所定の調整係数αを乗じるようにしたが、調整係数αは、前フレームの先頭座標に応じて変更するようにしても良い。すなわち、前フレームの先頭の座標の、原点座標ORに対する距離が大きいほど調整係数の値を大きくして撮像画枠AFLの中央側に切り出し画枠を寄せるようにすることもできる。
以上のようにして得られるフレーム先頭座標(SX,SY)が、制御部9から信号処理部5に供給される。
[フレーム内手ぶれ補正のための詳細構成例]
次に、図4の信号処理部5、画像メモリ6、手ぶれ速度処理部8の部分の、より詳細な構成ブロック図を図7に示す。
すなわち、手ぶれ補正処理や電子ズーム処理、出力データ生成処理のために、信号処理部5は、水平処理ブロック51と、垂直処理ブロック52と、レジスタブロック53とを含んでいる。そして、水平処理ブロック51は、水平手ぶれ補正量積分部511と水平画像処理部512とを備え、また、垂直処理ブロック52は、垂直手ぶれ補正量積分部521と垂直画像処理部522とを備える。
水平処理ブロック51は、データ変換部3からの撮像画像データDinに対して水平方向の処理を施す。この水平方向の処理には、水平方向の手ぶれ補正処理を含む。垂直処理ブロック52は、撮像画像データDinに対して垂直方向の処理を施す。この垂直方向の処理には、垂直方向の手ぶれ補正処理を含む。また、レジスタブロック53は、手ぶれ速度検出処理部8で検出された手ぶれ速度の情報を、水平処理ブロック51および垂直処理ブロック52に受け渡す処理を行なう。
手ぶれ速度検出部8は、サンプリング部81と、水平補正速度成分検出部82と、垂直補正速度成分検出部83とからなる。
サンプリング部81では、手ぶれ速度検出部7からの手ぶれ速度検出出力(図8(A)参照)を、タイミング信号発生部4からのサンプリング信号Spによりサンプリングすることにより、各分割画像区間Pdiv_0〜Pdiv_7についての手ぶれ速度ベクトルVec_0〜Vec_7(図8(B)参照)を取得する。この例では、サンプリング部81では、前述したように、手ぶれ速度ベクトルVec_0〜Vec_7は、各分割画像区間Pdiv_0〜Pdiv_7の先頭ラインに対するものが、垂直周期の1/8の周期でサンプリングされる。
ここで、取得すべき各手ぶれ速度ベクトルの値は、撮像素子2からの撮像画像データの対応する水平ラインのサンプリング時刻の値ではない。なぜなら、前述したように、撮像素子2上の各画素には露光時間があり、撮像素子2から取り出された撮像信号(色フィルタを通過した後の輝度値)は、各ラインのサンプリング時刻から露光時間分遡った時刻までの平均値であるからである。
このため、この実施形態では、手ぶれ速度ベクトルの値の検出点は、図9に示すように、各水平ラインの画像データのサンプリング時刻tsと、当該サンプリング時刻tsから露光時間分遡った時刻tbとの間の中央時刻となるように、サンプリング信号Spによるサンプリングタイミングが設定されている。
露光時間が短くなければ、水平ラインの画像データの先頭のタイミングでは、手ぶれ速度ベクトルの値を確定することができるが、露光時間が短くなった場合には、水平ラインの画像データの先頭のタイミングでは、手ぶれ速度ベクトルの値を確定することができない場合が生じる。そのような場合には、サンプリング部81では、過去の手ぶれ速度ベクトルを参照して、手ぶれ速度ベクトルの値を予測するようにする。
このサンプリング部81でサンプリングされて得られる、1フレーム(1垂直周期)について、8個の手ぶれ速度ベクトルVec_0〜Vec_7は、水平補正速度成分検出部82および垂直補正速度成分検出部83に供給される。
水平補正速度成分検出部82では、各分割画像区間Pdiv_0〜Pdiv_7における手ぶれ速度ベクトルVec_0〜Vec_7の水平方向成分を抽出し、その逆符号成分として、水平補正速度成分X_STB_0〜X_STB_7(図8(C)参照)を求める。
また、垂直補正速度成分検出部9では、各分割画像区間Pdiv_0〜Pdiv_7における手ぶれ速度ベクトルVec_0〜Vec_7の垂直方向成分を抽出し、その逆符号成分として、垂直補正速度成分Y_STB_0〜Y_STB_7(図8(D)参照)を求める。
この場合に、この実施形態では、水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7のそれぞれの値は、1水平ライン区間の時間長当たりの手ぶれ補正量として求められる。
すなわち、水平補正速度成分X_STB(X_STB_0〜X_STB_7)は、
X_STB=(水平手ぶれ補正量/1水平ライン区間の時間長)
とされる。
また、垂直補正速度成分Y_STB(Y_STB_0〜Y_STB_7)
Y_STB=(水平手ぶれ補正量/1水平ライン区間の時間長)
とされる。
そして、水平補正速度成分X_STB_0〜X_STB_7は、水平方向の画素ピッチ(画素の間隔)dxの倍数値(小数点以下の値を取り得る。以下同じ)、換言すれば、水平方向の画素数(小数点以下を取り得る)で表わされる。また、垂直補正速度成分Y_STB_0〜Y_STB_7は、垂直方向の画素ピッチ(画素の間隔)dyの倍数値(小数点以下を取り得る)、換言すれば、垂直方向の画素数(小数点以下を取り得る。以下同じ)で表わされる。
これは、サンプリング部81からの手ぶれ速度出力の水平方向成分と、垂直方向成分のそれぞれに対して、「速度成分の値→画素数(小数点以下の値を取り得る。以下同じ)の値」の対応テーブルを用意し、速度成分の値を入力値として、画素数の値を得るようにすることで実現される。そして、得られた画素数の値について、手ぶれの速度成分の方向とは逆方向に対応する符号を付加して、それぞれ、水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7とするものである。
この実施形態では、このように水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7の値を定めることにより、後述するライン単位の時間積分計算による水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDを、水平補正速度成分および垂直補正速度成分の単純加算により行なえるようにしている。
そして、これら水平補正速度成分検出部82および垂直補正速度成分検出部83で算出された水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7は、タイミング信号発生部4からのタイミング信号Stに応じたタイミングで、信号処理部5のレジスタブロック53のIF(インターフェース)レジスタ(図示は省略)に、順次取り込まれる。
そして、取り込まれた水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7は、水平処理ブロック51および垂直処理ブロック52での処理タイミングに対応して、レジスタブロック53内の水平処理ブロック用レジスタおよび垂直処理ブロック用レジスタ(何れも図示は省略)に、前記IFレジスタから、前記取り込まれたタイミングとは別のタイミングで、転送される。
水平処理ブロック51および垂直処理ブロック52の水平手ぶれ補正量積分部511および垂直手ぶれ補正量積分部521は、レジスタブロック53の水平処理ブロック用レジスタおよび垂直処理ブロック用レジスタに取り込まれている各分割画像区間Pdiv_0〜Pdiv_7の水平補正速度成分X_STB_0〜X_STB_7および垂直補正速度成分Y_STB_0〜Y_STB_7を積分することにより、各分割画像区間Pdiv_0〜Pdiv_7における各水平ラインに対する水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDを算出する。
水平処理ブロック51の水平画像処理部512では、水平手ぶれ補正量積分部511で算出された水平手ぶれ補正量SX_ADDを用いて、水平方向の手ぶれ成分を補正し、また、垂直処理ブロック52の垂直画像処理部522では、垂直手ぶれ補正量積分部521で算出された垂直手ぶれ補正量SY_ADDを用いて、垂直方向の手ぶれ成分を補正する。この補正処理においては、水平処理ブロック51の水平画像処理部512および垂直処理ブロック52の垂直画像処理部522では、それぞれ画像メモリ6に対して画像データの読み書きをしながら補正処理を実行するようにする。
この実施形態では、画像メモリ6は、水平処理用FIFOラインメモリ61と、垂直処理用小規模ラインメモリ62とからなる。水平処理用FIFOラインメモリ61は、この例では、1ライン分の容量を備える。また、垂直処理用小規模ラインメモリ62は、後述する垂直方向の補間処理用のFIR(Finite Impulse Response)フィルタのタップ数以上のライン数分の容量を有する。
水平処理ブロック51の水平画像処理部512には、水平処理用FIFOラインメモリ61への画像データの書き込み、読み出しを制御するFIFOメモリコントローラ(図7では図示を省略)が設けられていると共に、算出した水平手ぶれ補正量SX_ADDが小数点以下(補正後の画素位置が、水平方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう水平方向補間処理部(図7では図示を省略)が設けられている。この水平方向補間処理部は、後述するように、この実施形態では、水平方向のデジタルFIRフィルタ(以下、水平FIRフィルタという)が用いられる。
また、垂直処理ブロック52の垂直画像処理部522には、垂直処理用小規模ラインメモリ62への画像データの書き込み、読み出しを制御するメモリコントローラ(図7では図示を省略)が設けられていると共に、算出した垂直手ぶれ補正量SY_ADDが小数点以下(補正後の画素位置が、垂直方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう垂直方向補間処理部(図7では図示を省略)が設けられている。この垂直方向補間処理部は、後述するように、この実施形態では、垂直方向のデジタルFIRフィルタ(以下、垂直FIRフィルタという)が用いられる。
ここで、算出した水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDが小数点以下の値を持つ場合の補間処理について説明する。
例えば、手ぶれの水平方向の速度成分により、水平方向に図10に示すような画像歪みが生じた場合を想定する。すなわち、図10の例は、手ぶれが無ければ破線で示す直線上にあるべき画素G11,G21,G31・・・、G12,G22,G32・・・、G13,G23,G33・・・、が、手ぶれの水平方向の速度成分のために実線で示すような斜め位置となっている場合である。
この手ぶれを補正するためには、ずれている画素位置を本来の位置にあるようにずらせばよく、そのずれ量が、図10に示すように、前述した水平手ぶれ補正量SX_ADDに相当する。この水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍であれば、画素データを当該水平手ぶれ補正量SX_ADDに応じた画素ピッチ分だけずらして読み出すようにすることで補正することができる。
しかしながら、水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍ではなく、小数点以下のずれ量を含む場合には、そのずれ量に対応する位置は、画素データが存在する位置ではないので、その位置の近傍の複数個の画素データを用いた補間処理により、対応する画素位置の画素データを生成する必要がある。
図11は、その補間方法の一例を示すもので、求める画素データが、画素G1と画素G2との間の補間画素Gsである場合に、この補間画素Gsの位置と画素G1,G2の位置との距離k1,k2に応じた割合で、画素G1のデータと画素G2のデータとを加算することにより、補間画素Gsの画素データを生成するものである。この場合、k1:k2=W:(1−W)としたとき、
補間画素Gs=G1×W+G2×(W−1)
なる補間演算により、補間画素Gsの画素データを得る。
また、図11の例のような2個の画素データを用いるのではなく、図12の例のように2個以上(図12の例では4個)の近傍画素データを用いて、補間演算をして補間画素を求めることもできる。この場合、補間画素Gsの位置に対する画素G0,G1,G2,G3の位置との距離k0,k1,k2,k3に応じた割合となる乗算係数W0,W1,W2,W3を定めて、画素G0,G1,G2,G3のデータを加算することにより、補間画素Gsの画素データを得る。
すなわち、
補間画素Gs=G0×W0+G1×W1+G2×W2+G3×W3
なる補間演算により、補間画素Gsの画素データを得るようにする。
この図12の例の場合、乗算係数W0,W1,W2,W3の値の組は、画素G1または画素G2と補間画素Gsとの距離dsに対応するものとして関連付けられたテーブルを用意しておき、距離dsを検索子として、上記乗算係数W0,W1,W2,W3の組をテーブルから読み出すようにすることで得ることができる。なお、距離dsは、水平手ぶれ補正量SX_ADDの小数部に相当するものである。
この補間処理は、この実施形態では、水平FIRフィルタを用いて行なうようにする。すなわち、水平手ぶれ補正量SX_ADDの小数部に対応する前記乗算係数の組をテーブルから読み出し、その乗算係数を水平FIRフィルタに対して供給することで上記補間処理を行なうことができる。
以上は、水平方向の補間処理であるが、垂直方向についても、補間方向が垂直方向になるだけで、全く同様である。
[水平処理ブロック51における処理動作]
[水平手ぶれ補正量SX_ADDの積分処理]
図13に、水平手ぶれ補正量積分部511における積分値としての水平手ぶれ補正量SX_ADDを得るための積分処理動作のフローチャートを示す。
まず、制御部9からの初期y座標(水平ライン位置に対応)SYに、水平同期信号H−SYNC(ここでは、水平同期信号H−SYNCは、一般的な水平走査信号のうち、有効画像領域以外をマスクしたタイミング信号を意味するものとする)毎に「step」という値を加算して行く(ステップS1)。
初期y座標SYは、出力画像の最初の1水平ライン目が、CMOSイメージャ上の総画素の座標系(以後絶対座標系と呼ぶ)のどこに位置するかを表しており、一般的には「0」ではない。
これは、動画時には、通常、CMOSイメージャ上の全画素が、信号処理部5に入力されるのではなく、CMOSイメージャ内で垂直方向に平均加算されてから、後段の信号処理部5に入力されるからである。また、信号処理部5に入力されてからでも、幾つかの処理を経るため、1水平ライン目の絶対座標は、「0」でないことの方が多いからである。更に、入力画像データに対して、垂直方向の部分拡大処理を行なう場合には、初期y座標SYは、画面の中ほどの水平ライン位置となるので、非常に大きい値をとることもあり得るからである。
ステップS1で、1水平同期信号H−SYNC毎に加算する「step」という値は、ライン間隔の絶対座標系における垂直座標の増量を表わすが、上述したCMOSイメージャ内もしくは水平処理ブロックの前段における、垂直方向の複数ラインの画像データの平均加算により、1以外に2や4といった値をとる可能性がある。
さて、ステップS1で、初期y座標値SYに、1水平同期信号H−SYNC毎に、値stepを加算することにより、現在処理している水平ラインの絶対座標が求まり、当該絶対座標の整数成分vp_i(ステップS2)が、水平補正速度成分X_STB_*(*は0〜7のいずれかである。すなわち、水平補正速度成分X_STB_*は、X_STB_0〜X_STB_7のいずれかを意味する。以下、同じ。)を、現時点までに積分すべき積分回数に対応する。ここで、この積分回数は、1画面内における積算値である。
次に、現在処理している水平ライン(以下、現処理ラインという)の絶対座標の整数成分vp_iと、現処理ラインの1水平ライン前までに積分した回数(積分回数hstb_cnt)とを比較する。これにより、現処理ラインにおいて、あと何回積分すれば良いかが分かり、その回数分だけ、処理単位サイクル(1水平周期よりも十分に短い)毎にトリガTG1が発生する(ステップS3)。
このトリガTG1が発生する毎に、積分回数hstb_cntは1づつインクリメントする(ステップS4、ステップS5)。
そして、このトリガTG1ごとに、水平補正速度成分X_STB_0〜X_STB_7のうちの、現処理ラインが所在する分割画像区間についての水平補正速度成分を加算することにより、積分処理を行ない、水平手ぶれ補正量SX_ADDを得る(ステップS6)。ここで、図13のステップS6における「stb_x」は、水平補正速度成分X_STB_0〜X_STB_7のいずれかの値である。すなわち、「stb_x」は、現処理ラインが所在する分割画像区間についての水平補正速度成分の値である。
ステップS1で、1水平同期信号H−SYNC毎に加算される値「step」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG1は、1水平同期信号H−SYNC毎に発生するため、ステップS6では、1水平ライン毎に「stb_x」を加算(積分)するものである。
こうして得られる水平手ぶれ補正量SX_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置の補正量、すなわち、水平処理ブロック51における水平方向画像歪み補正処理における各ラインの水平初期位置(水平オフセット)そのものとなる。
上述したように、ステップS6では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、水平補正速度成分X_STB_0〜X_STB_7のうちの、いずれか1つを選択しなければならない。そのための仕組みが、図13の残りの部分の処理である。
この例では、分割画像区間分のライン数の加算値stb_gridが定義される(ステップS7)。この加算値stb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値stb_gridと、積分回数hstb_cntとを比較し、積分回数hstb_cntが加算値stb_gridを超える毎に、トリガTG2を発生する(ステップS8)。そして、トリガTG2が発生するごとに、加算値hstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS9)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG2が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値HDIV_CNTを定義し(ステップS10)、この分割区間値HDIV_CNTを、トリガTG2が発生する毎に、1づつインクリメントする(ステップS11)。すると、分割区間値HDIV_CNTは、現処理ラインが所在する各分割画像区間Pdiv_0〜Pdiv_7のそれぞれに対応して「0」〜「7」の値を取る。すなわち、分割区間値HDIV_CNTは、水平処理の進捗度合いを示すものとなる。ステップS6では、この分割区間値HDIV_CNTを参照して、「stb_x」を決定する。
なお、この例では、分割区間値HDIV_CNT=8のときには、1フレーム分の画像データについての処理が終了したことを意味する。そして、分割区間値HDIV_CNT=8に、「1」が加わると、分割区間値HDIV_CNT=0となるように計算される。
この分割区間値HDIV_CNTは、垂直処理ブロック52およびレジスタブロック53に、水平処理ブロック51での現処理ラインが何れの分割画像区間に所在しているかを示すために、すなわち、水平処理の進捗状況を報知するために供給される。
[水平画像処理部512の処理動作]
図14は、水平画像処理部512の構成例を示すものである。この図14の例では、前述の図13のフローチャートにおける水平同期信号H−SYNC毎に値「step」を初期y座標SYに加算する加算部101が、この水平画像処理部512に含まれるものとしており、このため、この水平画像処理部512に、制御部9からの初期y座標SYが入力される。さらに、この水平画像処理部512には、制御部9からの初期x座標SXが入力される。これら初期y座標SYおよび初期x座標SXは、前述したように、制御部9において、フレーム間手ぶれ補正がなされて、1フレームの先頭で設定されて、信号処理部5に入力される。
そして、加算部101からの、水平同期信号H−SYNC毎に値「step」が加算されたy座標値SY´は、水平手ぶれ補正量積分部511に供給される。すると、この水平手ぶれ補正量積分部511からは、現処理ラインの先頭のx座標のオフセット値として、水平手ぶれ補正量SX_ADDが返ってくる。
水平画像処理部512では、加算部102において、各水平ラインの先頭で一回だけ、水平手ぶれ補正量積分部511からの水平手ぶれ補正量SX_ADDを、初期x座標SXに加算する。
そして、この加算部102の出力値に対して、画素処理クロックCLKごとに、水平拡大・縮小のパラメータである値「hmag」を、加算部103により加算する。この加算部103の出力値X_ADDは、比較部104および105、また、小数部抽出部106および整数部抽出部107に供給される。
比較部104は、加算部103からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1以上であるとき、すなわち、画素位置が1画素分以上ジャンプしたときに、そのジャンプを示す信号SKIPを出力する。この例では、このジャンプを示す信号SKIPを参照することで、次に画素処理クロックCLKのタイミングで処理すべきジャンプした画素位置を知ることができる。この信号SKIPは、FIFOメモリコントローラ108に供給される。
また、比較部105は、加算部103からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1より小さいときに、その旨を示す信号HOLDを出力する。したがって、この信号HOLDを参照することで、読み出し画素を、1画素処理クロックCLKだけ前と同じであることを知ることができる。この信号HOLDは、FIFOメモリコントローラ108に供給される。
小数部抽出部106は、加算部103からの出力値X_ADDの小数部を、画素処理クロックCLK毎に抽出し、抽出した小数部の値X_PHASEを出力する。この少数部の値X_PHASEは、水平FIRフィルタ110を備える水平補間処理部109に供給される。水平補間処理部109では、この小数部の値X_PHASEに基づいて乗算係数テーブルを検索し、水平FIRフィルタ110に供給する乗算係数を得るようにする。
整数部抽出部107は、加算部103からの出力値X_ADDの整数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した整数部の値ST_POSを出力する。この整数部の値ST_POSは、現処理ラインの初期x座標としてFIFOメモリコントローラ108に供給される。
FIFOメモリコントローラ108は、入力画像データDinについて、水平処理用FIFOラインメモリ61を用いて、水平手ぶれ補正量SX_ADDに基づいた水平手ぶれ補正処理を行なうと共に、水平拡大・縮小処理を行なう。ここで、水平処理用FIFOラインメモリ61が、実際に1水平ライン分相当のサイズを必要とするのは、後述するように、画像の部分拡大処理をサポートすることを考慮する場合のみである。
すなわち、FIFOメモリコントローラ108は、入力画像データDinについて、前記整数部の値ST_POSを用いて、出力画像データとして読み出す各水平ラインの画素データの初期x座標を決める。また、FIFOメモリコントローラ108は、信号SKIPおよび信号HOLDを画素処理クロックCLKごとに参照し、水平処理用FIFOラインメモリ61から読み出す画素データを決定するようにする。
そして、FIFOメモリコントローラ108は、以上のようにして読み出した水平ラインの画素データを出力画像データとして、データイネーブル信号ENと共に、水平補間処理部109に供給する。
水平補間処理部109は、データイネーブル信号ENがイネーブル状態となっているときに入力される画像データを有効データとして、水平FIRフィルタ110を用いて水平方向の補間処理を実行する。前述したように、このときに水平補間処理部109に入力される小数部の値X_PHASEを用いて、水平FIRフィルタ110に供給する乗算係数が決定されている。
こうして、水平補間処理部109からは、水平手ぶれ補正量SX_ADDに応じて水平手ぶれ補正処理がなされると共に、水平方向の拡大・縮小処理がなされた画像データDHoutが得られる。このDHoutは、垂直処理ブロック52に供給される。
ところで、上述の説明では、水平手ぶれ補正量積分部511の水平手ぶれ補正量SX_ADDの積分処理と、水平画像処理部511の水平拡大・縮小画像処理の、互いの処理タイミングについて特に触れなかったが、水平手ぶれ補正量SX_ADDの積分処理を、遅延無しで、水平拡大・縮小画像処理との単純なシーケンス処理で行なうことが好都合なのは、図15の上側の図15(A)に示すように、垂直方向の部分切り出し及び部分拡大をサポートしない場合にほぼ限られる。図15で、V−SYNCは垂直同期信号を示し、また、ST_TGは、有効走査ラインの開始時点を示している。また、図15で、網掛けを付して示した四角で囲まれた区間は、それぞれの処理区間を示している。
一方、垂直方向の部分切り出し、もしくは部分拡大をサポートする場合、初期y座標SYが非常に大きな値を取り得るため、フレーム先頭の積分処理に、相当長いサイクル数(画素処理サイクル数)を要してしまう可能性がある。図15下側の(B)のシーケンスにおける期間tmがそのための積分期間である。
このようになると、図15上側の(A)のシーケンスでは、最初の拡大・縮小処理が水平同期信号H−SYNCの1周期期間をオーバーしてしまうため、次の水平同期信号H−SYNCで入力されて来る2ライン目の画像データを保持しておくためのラインメモリが必要となる。
そこで、この実施形態では、図15下側の(B)のシーケンスに示すように、水平拡大・縮小画像処理が開始される1水平周期前から積分処理の起動を行ない、常に画像処理に対して、1水平周期だけ先行して積分処理を行なうタイミングおよびシーケンスを採用する。このため、水平処理用FIFOラインメモリ61は、1水平周期分のサイズのものがこの実施形態では用いられている。
上述した問題は、画像の部分拡大等に関わらず、水平処理は常に全入力ラインに対して処理を施す、というアーキテクチャにすれば避けられる。しかし、いずれにしても、図12上側のシーケンスを実現しようとすると、積分処理の終了信号を新たに設け、それを受けて画像処理の起動をかけなければならず、やや煩雑である。つまり、換言すれば、上述したこの実施形態で採用した手法は、既存の画像処理の回路に新たな手を加えないで済む、というメリットがあるのである。
なお、上述した実施形態で採用した手法は、水平同期信号H−SYNCの1周期期間内の画素処理サイクル数よりも、絶対座標系の垂直サイズが大きい場合には採用できない。その場合には、水平処理は常に全入力ラインに対して処理を施すという、上述したアーキテクチャにすれば良い。
[垂直処理ブロック52における処理動作]
[垂直手ぶれ補正量SY_ADDの積分処理]
次に、垂直手ぶれ補正量積分部521における積分値としての垂直手ぶれ補正量SY_ADDを得るための積分処理動作について説明する。図16は、この垂直手ぶれ補正量SY_ADDを得るための積分処理動作のフローチャートを示すものである。
この垂直手ぶれ補正量SY_ADDを得るための積分処理動作は、図13を用いて上述した水平手ぶれ補正量SX_ADDを得るための積分処理動作と類似しているが、次の点が異なる。
すなわち、水平同期信号H−SYNC毎に初期y座標SYに加算する値が「vmag」であることと、水平処理の進捗度合いを表すHDIV_CNTを見て、ウエイト(WAIT)をかけることと、各ラインの積分処理が終了したことを表わす積分完了信号STB_RDYを生成して、垂直信号処理モジュールへ伝達すること、の以上3点である。
この実施形態では、垂直画像処理において垂直方向の拡大・縮小を想定しており、値「vmag」は垂直拡大・縮小の倍率パラメータを表わしている。したがって、垂直処理ブロック52では、水平処理ブロック51から出力される画像データを全て処理するのではなく、拡大・縮小処理後に出力するラインの垂直座標を基準として処理を行なう。
そのため、この垂直方向の積分処理においても、実際に、この垂直方向の積分処理後の垂直画像処理の対象となる座標における積分値を出力することが求められることから、垂直方向の座標増分パラメータを水平同期信号H−SYNC毎に加算するのである。なお、画像の拡大・縮小を伴わずに、CMOS手ぶれの補正のみを行なうのであれば、vmag = 1として良い。
水平方向の積分処理とは異なる二つ目の、分割区間値HDIV_CNTを見て、水平処理の進捗度合いを観測する必要性は、水平処理を垂直処理が追い越すことがあってはならないからである。一般的な画像の垂直拡大・縮小処理においては、垂直処理が水平処理を追い越す、というのは、まだ生成されていない画像に対して処理を施すことであるため、自ずとウエイトをかける仕組みが必要となる。同様に、この垂直方向の積分処理においても、画像を直接扱う訳ではないが、水平処理を追い越さない仕掛けが必要なのである。
もう少し詳細に説明する。水平および垂直方向の積分パラメータである水平補正速度成分X_STB_*(*は0〜7のいずれかであり、X_STB_*は、X_STB_0〜X_STB_7のいずれかを意味する。以下同じ)と、垂直補正速度成分Y_STB_*(*は0〜7のいずれかであり、Y_STB_0〜Y_STB_7のいずれかを意味する。以下、同じ)は、処理を行っている水平ラインのサンプリング時刻(厳密に言うと露光期間の中心時点であることは既に説明)付近の手ぶれ速度ベクトル(手ぶれの速度と方向)の、それぞれ水平成分、垂直成分の逆符号である。したがって、露光時間が極めて短い時間の場合まで考慮すると、水平補正速度成分X_STB_*と垂直補正速度成分Y_STB_*は、対応する水平ラインの画像データが入力される直前まで確定できない場合がある。
後で詳述するレジスタブロック53では、この事情を考慮し、水平方向の積分処理において現在処理しているラインが属する分割画像区間を意味する分割区間値HDIV_CNTの値を見て、水平補正速度成分X_STB_*と垂直補正速度成分Y_STB_*を、水平処理ブロック用レジスタと、垂直処理ブロック用レジスタにラッチする。したがって、水平処理ブロック51では、特別な仕組みを設けなくとも、入力された画像を順次処理して行けば良いのである。
一方、垂直処理ブロック52での積分処理では、当該積分処理を行なった結果を、後段の垂直方向画像処理の初期オフセット座標とするため、水平処理からの画像が未だ入って来ていないことに後から気付いても、その時点では既にそのラインの積分処理は終わってしまっている。つまり、そのときには、未確定の垂直補正速度成分が用いられて積分がなされてしまったことになる。
そのため、積分処理の段階で、処理しようとするラインに対応した積分パラメータである垂直補正速度成分Y_STB_*が、まだ確定前であることを、水平処理の進捗度合いから判断する必要があるのである。
そのための仕組みとして、図16のように、垂直処理の進捗度合いを表わす分割区間値VDIV_CNTが、水平処理の進捗度合いを表わす分割区間値HDIV_CNTを超えてしまっていれば、ウエイトを発行し、図16の左下で、垂直処理における現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である「stb_y」が未確定のままの垂直補正速度成分Y_STB_*が選択された状態で、垂直手ぶれ補正量SY_ADDに加算されるのを防ぐ。
垂直方向の積分処理(図16)が水平方向の積分(図13)と異なる、3つ目の点は、各ラインでの垂直積分が完了したことを表す積分完了信号STB_RDYの生成である。各ライン内で積分を繰り返して行なった結果、そのラインの絶対座標の整数成分vp_iと、そのフレーム内での累積積分回数vstb_cntとが一致したときに、後段の垂直画像処理モジュールに渡すべき垂直オフセットSY_ADDが求められ、それと同時に、後段の垂直画像処理の起動をかけるのが目的である。
既に説明した水平方向の積分処理においては、有効画像が入力されるタイミングよりも1水平同期信号H−SYNC(1水平周期)前から積分処理を開始しておけば、有効画像に対する水平画像処理が始まるまでに積分処理を完了できることが、殆どの場合、システム的に保証可能であるが、垂直方向の積分処理では、前述のウエイトが発生する可能性があるために、直前1水平周期の時間で積分が完了することを、全ての場合において保証するのは不可能だからである。すなわち、ウエイトが発生したときには、垂直積分が完了したことを表す積分完了信号STB_RDYが発生したときに、垂直手ぶれ補正および垂直拡大・縮小処理を含む垂直画像処理を実行するようにする。
以上の機能を有する、この垂直方向の積分回路を適用した垂直方向の積分処理を図16のフローチャートを参照しながら説明する。
まず、制御部9でフレーム間手ぶれ補正処理により設定された初期y座標(水平ライン位置に対応)SYに、水平同期信号H−SYNC毎に前述した値「vmag」を加算して行く(ステップS21)。
ステップS21で、初期y座標値SYに、1水平同期信号H−SYNC毎に、値vmagを加算することにより、現在処理している水平ラインの絶対座標が求まり、当該絶対座標の整数成分vp_i(ステップS22)が、垂直補正速度成分Y_STB_*(Y_STB_0〜Y_STB_7のいずれか)を、現時点までに積分すべき積分回数に対応する。ここで、この積分回数は、1画面内における積算値である。
次に、現在処理している水平ライン、すなわち、現処理ラインの絶対座標の整数成分vp_iと、現処理ラインの1水平ライン前までに積分した回数(積分回数vstb_cnt)とを比較する。これにより、現処理ラインにおいて、あと何回積分すれば良いかが分かり、その回数分だけ、処理単位サイクル(1水平周期よりも十分に短い)毎にトリガTG3が発生する(ステップS23)。
このトリガTG3が発生する毎に、積分回数vstb_cntは1づつインクリメントする(ステップS24、ステップS25)。
そして、このトリガTG3ごとに、垂直補正速度成分Y_STB_0〜Y_STB_7のうちの、現処理ラインが所在する分割画像区間についての垂直補正速度成分を加算することにより、積分処理を行ない、垂直手ぶれ補正量SY_ADDを得る(ステップS26)。ここで、図16のステップS26における「stb_y」は、垂直補正速度成分Y_STB_0〜Y_STB_7のいずれかの値である。すなわち、「stb_y」は、現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である。
ステップS21で、1水平同期信号H−SYNC毎に加算される値「vmag」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG3は、1水平同期信号H−SYNC毎に発生するため、ステップS26では、1水平ライン毎に「stb_y」を加算(積分)するものである。
こうして得られる垂直手ぶれ補正量SY_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの垂直方向の読み出し開始位置の補正量、すなわち、垂直処理ブロック52における垂直方向画像歪み補正処理における各ラインの垂直位置(垂直オフセット)そのものとなる。
上述したように、ステップS26では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、垂直補正速度成分Y_STB_0〜Y_STB_7のうちの、いずれか1つを選択しなければならない。
この例では、分割画像区間分のライン数の加算値vstb_gridが定義される(ステップS27)。この加算値vstb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値vstb_gridと、積分回数vstb_cntとを比較し、積分回数vstb_cntが加算値vstb_gridを超える毎に、トリガTG4を発生する(ステップS28)。そして、トリガTG4が発生するごとに、加算値vstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS29)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG4が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値VDIV_CNTを定義し(ステップS30)、この分割区間値VDIV_CNTを、トリガTG4が発生する毎に、1づつインクリメントする(ステップS31)。すると、分割区間値VDIV_CNTは、現処理ラインが所在する各分割画像区間Pdiv_0〜Pdiv_7のそれぞれに対応して「0」〜「7」の値を取る。すなわち、分割区間値VDIV_CNTは、垂直処理の進捗度合いを示すものとなる。
なお、この例では、分割区間値VDIV_CNT=8のときには、1フレーム分の画像データについての処理が終了したことを意味する。そして、分割区間値VDIV_CNT=8に、「1」が加わると、分割区間値VDIV_CNT=0となるように計算される。
この分割区間値VDIV_CNTは、水平処理ブロック51からの、水平処理の進捗度合いを示す分割区間値HDIV_CNTと比較され、分割区間値VDIV_CNTが分割区間値HDIV_CNTよりも大きくなったときには、水平処理を垂直処理が追い越してしまう状態を意味するので、ウエイト(WAIT)を発生して、トリガTG3の発生を待機させる。すなわち、トリガTG3は、ウエイトが解除された後に発生するように遅延させる(ステップS32)。
そして、この実施形態では、ステップS22で得られるy座標の整数成分vp_iと、積分回数vstb_cntとが等しいかどうかをチェックし、等しければ現処理ラインについての垂直方向の積分が完了したことを示す積分完了信号STB_RDYを生成して出力する(ステップS33)。この積分完了信号STB_RDYは、垂直画像処理部522に供給される。垂直画像処理部522では、この積分完了信号STB_RDYにより、現処理ラインについての垂直方向の手ぶれ補正処理を開始してよいことを認識し、次の水平同期信号H−SYNCのタイミングで垂直画像処理を再開する。
[垂直画像処理部522の処理動作]
図17は、垂直画像処理部522の構成例を示すものである。この図17の例では、前述の図16のフローチャートにおける水平同期信号H−SYNC毎に処理y座標SYに値「vmag」を加算する加算部201が、この垂直画像処理部522に含まれるものとしており、この垂直画像処理部522に、制御部9からの初期y座標SYが入力される。
そして、加算部201からの、垂直同期信号H−SYNC毎に値「vmag」が加算されたy座標値SY´は、垂直手ぶれ補正量積分部521に供給される。すると、この垂直手ぶれ補正量積分部521からは、現処理ラインの先頭のy座標のオフセット値として、垂直手ぶれ補正量SY_ADDが返ってくる。
垂直画像処理部522では、加算部202において、各水平ラインの先頭で一回だけ、垂直手ぶれ補正量積分部521からの垂直手ぶれ補正量SY_ADDを、初期y座標SYに加算する。この加算部202の出力値X_ADDは、小数部抽出部203および整数部抽出部204に供給される。
小数部抽出部203は、加算部202からの出力値Y_ADDの小数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した小数部の値Y_PHASEを出力する。この少数部の値Y_PHASEは、垂直FIRフィルタ207を備える垂直補間処理部206に供給される。
垂直FIRフィルタ207は、垂直方向に並ぶ複数ラインの画素データを用いて補間処理を行なうもので、垂直補間処理部206では、この小数部の値Y_PHASEに基づいて乗算係数テーブルを検索し、垂直FIRフィルタ207に供給する乗算係数を得るようにする。これは、補間方向が垂直方向になるだけで、図10〜図12を用いて説明した水平FIRフィルタを用いる水平方向の補間処理とほぼ同様である。
整数部抽出部204は、加算部202からの出力値Y_ADDの整数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した整数部の値Y_POSを出力する。この整数部の値Y_POSは、現処理ラインのy座標としてメモリコントローラ205に供給される。
メモリコントローラ205は、水平処理ブロック51からの画像データDHoutについて、垂直処理用小規模ラインメモリ62を用いて、垂直手ぶれ補正量SY_ADDに基づいた垂直手ぶれ補正処理を行なうと共に、垂直拡大・縮小処理を行なう。ここで、垂直処理用小規模ラインメモリ62は、少なくとも、垂直FIRフィルタ207における補間処理に用いるライン数分、すなわち、垂直FIRフィルタのタップ数分の容量を有する。
メモリコントローラ205は、その入力画像データDHoutを垂直処理用小規模ラインメモリ62に一時保存すると共に、前記整数部の値Y_POSを用いて、出力画像データDYout_0、DYout_1、・・・、DY_nとして出力する複数の水平ラインのデータを決める。そして、メモリコントローラ205は、以上のようにして決定した複数水平ラインの画素データDYout_0、DYout_1、・・・、DY_nを、小規模ラインメモリ62から読み出して垂直補間処理部206に供給する。
垂直補間処理部206は、入力される画像データDYout_0、DYout_1、・・・、DY_nを、垂直FIRフィルタ207を用いて垂直方向の補間処理を実行する。前述したように、このときに垂直補間処理部206に入力される小数部の値Y_PHASEを用いて、垂直FIRフィルタ207に供給する乗算係数が決定されている。
こうして、垂直補間処理部206からは、垂直手ぶれ補正量SY_ADDに応じて垂直手ぶれ補正処理がなされると共に、垂直方向の拡大・縮小処理がなされた画像データDoutが得られる。
次に、図18に、上説明した垂直方向の積分処理と、その後段の垂直画像処理のタイミング関係を示す。図18の上の図18(A)のように、垂直方向の部分切り出し、垂直方向の部分拡大・縮小のいずれもサポートしない場合には、前述したウエイトは発生せず、現処理ラインについての垂直方向の積分回数の上限は高々数回である。このため、同一のラインに対する積分処理と画像処理の両方を、同じ1水平同期信号H−SYNC期間内でシーケンス化可能である。したがって、この場合には、わざわざ積分完了信号STB_RDYを導入する必要はない。
一方、図18の下の図18(B)のように、垂直方向の部分切り出し、もしくは垂直方向の部分拡大をサポートする場合には、1ライン目の積分処理の途中でウエイトが発生する可能性があり、縮小をサポートする場合には、どこか途中の水平ラインでウエイトが発生する可能性がある。
いずれの場合でも、同一ラインの積分処理が、ウエイトによって数水平同期信号H−SYNC区間もしくはそれ以上に渡って中断されるため、積分処理が終了したことを後段に知らせるための積分完了信号STB_RDYが必要となる。そして、図18(B)の下2段に示すように、垂直拡大・縮小処理は、ウエイトが終了し、積分完了信号STB_RDYが発生した後の水平同期信号H−SYNCのタイミングから開始される。
また、同時に、あるラインの垂直画像処理が完了していない場合には、次の水平同期信号H−SYNCを、図18(B)において点線で示すように、マスクするようにする。すなわち、ウエイトが発生している間の水平同期信号H−SYNCは、マスクするようにする。
以上説明した水平処理ブロック51と垂直処理ブロック52を含む信号処理部5における処理の流れは、図19に示すように表わすことができる。すなわち、データ変換部3からの画像データDinは、水平処理用FIFOラインメモリ61に一旦書き込んで読み出し、水平画像処理部512および水平手ぶれ補正量積分部511を用いて水平手ぶれ補正および水平拡大・縮小処理を行なう。そして、水平画像処理部512の処理結果は、垂直処理用小規模ラインメモリ62に書き込む。
垂直処理用小規模ラインメモリ62に書き込まれた画像データは、垂直画像処理部522および垂直手ぶれ補正量積分部521を用いて垂直手ぶれ補正および垂直拡大・縮小処理を行なう。そして、垂直画像処理部522の処理結果は、垂直処理用小規模ラインメモリ62に書き戻す。そして、さらに、この垂直処理用小規模ラインメモリ62から、出力画像データDoutを読み出して出力する。
以上の処理の結果、図19の右下図のように、CMOS手ぶれに起因する歪み補正がなされた出力画像が得られる。
ここでの垂直処理用小規模ラインメモリ62としては、最低限、垂直FIRフィルタ207のタップ数分のラインメモリが必要であることを述べたが、現実的には、垂直方向の部分拡大処理を行なう場合には、垂直処理のスピードよりも水平処理のスピードの方が早くなるため、拡大対象となる水平処理結果を溜めておくだけのラインメモリが必要となる。
また、部分拡大をしない場合でも、垂直補正速度成分Y_STB_*が鉛直上向きである場合には、部分拡大の場合と動作上同じになるため、小規模ラインメモリ62としては、手ぶれが上下方向に変動する分を考慮したラインメモリが必要である。
なお、上述の実施形態の場合、1垂直周期が1/60秒であるとすると、分割画像区間Pdivの時間長DIVは、1/60÷8=1/480秒であるが、実験によれば、この程度の時間長DIVで、手ぶれ速度ベクトルを求めて手ぶれ補正をすることにより、必要十分な手ぶれ補正効果が得られ、補正後の出力画像としては、良好なものとなることが確認されている。
次に、以上の水平処理および垂直処理におけるレジスタブロック53におけるレジスタへのラッチタイミングを、図20に示す。
すなわち、この実施形態では、垂直同期信号V−SYNCの1周期について、各分割画像区間Pdiv_0〜Pdiv_7の先頭ラインよりも、前述した露光期間の中央の時点に対応する8個の時点で割り込み(マイコン割り込み)が発生する。
この割り込みにより起動されて、手ぶれ速度検出処理部8で、サンプリング信号Spにより手ぶれ検出出力がサンプリングされ、そのサンプリング結果から、前述したようにして、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*が生成され、その生成結果である水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*がレジスタブロック53のIFレジスタに取り込まれる。
水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*の値を、制御部13(マイコン)のソフトウエアで計算する場合、図20に示すような定期的な割り込みを発生させる方法が有効である。制御部13(マイコン)は、対象のフレームの露光時間を管理しているため、水平補正速度成分X_STB_*と垂直補正速度成分Y_STB_*に対して、どの時間の手ぶれ速度を元に反映すればよいかが分かっている。
しかしながら、露光時間が非常に短い場合、手ぶれ速度に基づく積分処理による手ぶれ補正量の計算が間に合わない場合も考えられ、その微妙なタイミングにおいては、ハードウェアの水平処理がどのラインまで到達しているか、観測出来る方が便利である。そのため、この実施形態では、水平処理の進捗度合いを示すHDIV_CNTを、制御部13(マイコン)から読み出し可能なレジスタ(レジスタブロック53内)に設定する。HDIV_CNTを観測出来ることは、ソフトウエアのデバッグにおいても非常に有用である。
また、レジスタブロック53内では、分割区間値HDIV_CNTの値の変化を見てラッチパルスを生成し、前述のように制御部13(マイコン)が設定した、対応する水平補正速度成分X_STB_*と垂直補正速度成分Y_STB_*とを、IFレジスタから、水平処理用レジスタおよび垂直処理用レジスタに、この生成したラッチパルスのタイミングでラッチする。つまり、水平処理ブロック51で用いる水平補正速度成分X_STB_*を、その使用直前でラッチするのである。このとき、垂直処理ブロック52で用いる垂直補正速度成分Y_STB_*も一緒にラッチしておく。
垂直処理ブロック52で使用する、垂直補正速度成分Y_STB_*は、基本的には、上記の水平処理ブロック51用の水平補正速度成分X_STB_*と一緒にラッチした、Y_STB_*の値を常にラッチし続ける。
ただし、それは、垂直処理ブロック52のフレーム処理起動パルスVL1がアクティブ(ハイ状態がアクティブ)になってから、水平処理ブロック51のフレーム処理起動パルスVL0がアクティブ(ハイ状態がアクティブ)になるまでの期間(図20のRVラッチイネーブルのアクティブ(ハイ状態がアクティブ)期間)に限られる。
これは、垂直処理の時間は長引くことがあり、入力画像の垂直同期信号V−SYNCだけでなく、次のフレームの水平処理ブロックのフレーム起動パルスVL0さえも跨ぐことがあるからである。
[他の実施形態および変形例]
上述の実施形態では、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*は、1水平ライン区間の時間長当たりの手ぶれ補正量として、水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDの時間積分演算を、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*の単純加算とするようにしたが、それぞれの検出した速度成分と、各ラインの時間とを乗算するようにしても良いことは言うまでもない。
また、各分割画像区間についての手ぶれ速度(ベクトル)は、角速度センサの出力や、加速度センサの出力を積分して得た速度出力を、露光期間の中央の時点でサンプリングするようにして取得するようにしたが、露光期間の全期間における角速度の平均値や露光期間の全期間における加速度の積分値の平均値を求めて、それを露光期間の中央の時点に対応する速度ベクトルとして求めることもできる。
また、露光期間の全期間ではなく、露光期間の中央の時点を中央の時点とする露光期間よりも短い期間における、角速度の平均値や加速度の積分値の平均値を求めて、それを露光期間の中央の時点に対応する速度ベクトルとして求めるようにしてもよい。
また、上述の実施形態では、手ぶれ速度を積分することにより手ぶれ補正量を求める際の、手ぶれ補正量の積分演算の開始時点の画像データに対する遅延を最小にするために、分割画像区間Pdivの先頭時点において、手ぶれ速度ベクトルを求めるようにしたが、遅延を許容するのであれば、各分割画像区間Pdivの手ぶれ速度ベクトルのサンプリング時点は、分割画像区間Pdivの先頭時点である必要はなく、当該分割画像区間内の任意の時点、例えば中央の時点でも良い。
また、分割画像区間Pdivの複数時点(センサ出力のサンプリングが可能な間隔)において手ぶれ速度ベクトルを求め、それらの平均値を、その分割画像区間Pdivの手ぶれ速度ベクトルとするようにしても良い。加速度を検出する場合も同様である。この複数時点は、分割画像区間PdivのDIVの全範囲である必要はなく、例えば、分割画像区間Pdivの中央時点を中心とするDIVよりも短い区間であっても良い。
このようにすれば、分割画像区間Pdiv内における手ぶれ速度ベクトルのばらつきを平均化加味した手ぶれ速度ベクトルを得ることができるというメリットがある。
また、上述の実施形態の説明は、撮像装置を操作するユーザにより生起される手ぶれによる画像歪みを補正する場合であったが、ユーザにより生起される手ぶれのみではなく、撮影時に、撮像素子に対して、その撮像画像の水平方向および/または垂直方向の位置的変化を生じるように加わった振動などの偏倚力に起因して生じる画像歪みをも補正することができることは言うまでもない。
また、上述の実施形態は、X−Yアドレス型の固体撮像素子としてCMOSイメージャを用いた場合であるが、撮像素子としてはCMOSイメージャに限定されるものでないことは勿論である。
また、この発明は、撮像装置(カメラ)にのみ適用されるものではなく、例えば携帯電話端末、情報携帯端末などに撮像素子が取付けられて、画像を撮影する場合にも適用できるものである。さらに、ユーザが手で持って撮影を行なう装置にのみに適用されるものではなく、パーソナルコンピュータやテレビ電話装置などの固定的に設置される装置に対して外力が加わって振動等が生じる場合、また、自動車などに撮像素子が取付けられて、画像を撮影する場合にも適用可能である。
なお、上述の実施形態では、フレーム間手ぶれ補正量の算出および補正処理は、マイクロコンピュータによるソフトウエア処理としたが、ハードウエア処理とすることも勿論できる。
また、逆に、上述の実施形態では、フレーム内手ぶれ補正量の算出および補正処理は、ハードウエア処理としたが、ソフトウエアとすることもできる。
2…撮像素子、5…信号処理部、6…画像メモリ、7…手ぶれ検出部、8…手ぶれ速度検出処理部、51…水平処理ブロック、52…垂直処理ブロック、53…レジスタブロック、511…水平手ぶれ補正量積分部、512…水平画像処理部、521…垂直手ぶれ補正量積分部、522…垂直画像処理部、61…水平処理用FIFOラインメモリ、62…垂直処理用小規模ラインメモリ、81…サンプリング部、82…水平補正速度成分検出部、83…垂直補正速度成分検出部