[この発明の実施形態]
以下に説明するこの発明による画像データ処理装置の実施形態は、撮像素子としてX−Yアドレス型の固体撮像素子の代表例であるCMOS(Complementary Metal−Oxide Semiconductor)イメージャ(CMOS型の固体撮像素子)を用いる撮像装置の場合の例である。そして、この撮像装置において、画像処理として、撮像した撮像画像について、手ぶれによる撮像画像歪みと、撮像レンズの歪曲収差特性による撮像画像歪みとを、併せて補正すると共に、電子ズーム処理および所望の解像度の出力画像データを得る解像度変換処理を行なうことができる場合である。
なお、この実施形態の撮像装置は、動画像および静止画像の両方を撮像可能であり、動画像の撮像画像データを処理する場合と、静止画像の撮像画像データを処理する場合の、何れの場合にも、上述の画像処理を適用することができるものである。
この発明の実施の形態の撮像装置を説明する前に、CMOSイメージャなどのX−Yアドレス型の固体撮像素子に特有の手ぶれによる画像ひずみについて説明する。
例えば従来一般的に用いられているCCD(Charge Coupled Device)を用いた固体撮像素子(以下、CCDを用いた固定撮像素子をCCDイメージャという)の場合には、全画素を同時期に露光し、1フレーム(または1フィールド。以下同じ)の画像データについては、データ取り出しタイミングが全く同一であるので、手ぶれ変位量としては、図2において矢印で示すように、1フレーム分の全画素について、1つの手ぶれ変位量Vcsを考えればよい。
つまり、図2において、本来、被写体は実線で示す領域FLaに蓄積されるものであったのに、手ぶれにより点線で示す領域FLbに移動した場合には、当該フレームで1つの手ぶれ変位量Vcsを検出し、当該手ぶれ変位量Vcs分だけ、読み出し画素位置(サンプリング画素位置)を補正することにより、手ぶれに起因する撮像画像歪を補正することができる。
なお、図2に示すように、一般に、撮像素子では、その全画素を有効画素として扱うのではなく、全画素からなる領域(以下、実効画像領域という)AFLのうちの、周辺の領域を除く、水平有効領域および垂直有効領域で定まる中央部を有効画像領域EFLとして用いているものが多い。
このようなイメージャを用いた場合、手ぶれ補正により読み出し画素位置が変化しても、手ぶれ量が、実効画像領域AFLと有効画像領域EFLとの差分よりも小さい範囲では、イメージャが元々有している画素のデータを用いて歪み補正をすることができるので、補間処理などにより、手ぶれ補正に必要なデータを生成する場合に比べて、画像の劣化は少なくなる。
これに対して、CMOS型イメージャのようなX−Yアドレス型の固体撮像素子の場合には、画面の水平方向(X方向)の位置と、垂直方向(Y方向)位置とを指定することにより、画素単位で撮像データを読み出すことが可能である。ただし、CMOSイメージャなどのX−Yアドレス型の固体撮像素子においては、実用上は、1水平ライン分の画素群単位で読み出し(サンプリング)して、撮像画像データを出力するものが一般的である。
このように、CMOSイメージャから撮像データを水平ライン単位で読み出す場合には、図3に示すように、各水平ラインのついての露光期間は、水平ライン単位の読み出し時間差に応じたΔtだけ、時間的なずれを生じる。なお、1画素単位で撮像画像データの読み出しがなされる場合であっても、ライン間の読み出し時間差に比べて、画素間の読み出し時間差は無視できるほど小さい。そこで、1画素単位で撮像画像データの読み出しがなされる場合であっても、同様な露光期間の時間的なずれを生じるものとすることができる。
このため、CMOSイメージャを用いた撮像装置により、例えば走る電車の中から外の景色を撮影すると、本来は図4(A)のような画像が得られるべきものであるのに、図4(B)に示すように、本来鉛直に立っている家や木が傾いた画像が出力撮像画像となってしまう。これがCMOSイメージャ特有のフォーカルプレーン現象である。
図4(B)の画像例は、水平方向に移動しながら撮影したものであるため、被写体が傾いて撮像されるが、例えば垂直方向に移動しながら撮影した場合には、図示は省略するが、被写体が垂直方向に縮んだり、伸びたりするような画像となる。
この現象が発現するのは、CMOSイメージャを使用する撮像装置を持つ撮影者が高速に移動しながら撮影したり、逆に、固定位置にいる撮影者が高速に移動する被写体を撮影したりした場合であり、撮像装置と被写体の相対速度が速い場合に顕著となる。ただし、一般的な撮影において、このような状況は稀であるといえる。
しかしながら、撮影者が撮像装置を手で持って撮影している場合に、撮像装置を持っている撮影者の手が、微小かつ高速に振動した場合、すなわち、手ぶれが発生した場合、上述したフォーカルプレーン現象が発現することになる。
なぜなら、CMOSイメージャの場合の手ぶれ(以下、CMOS手ぶれという)の値は、CCDイメージャのように1フレーム内で1個の値ではなく、前述したように、1フレーム内における画素やライン毎のサンプリング時刻の違いにより、画素や水平ラインごとに異なるものとなる。このため、CMOSイメージャを用いた撮像装置においては、単に、1フレーム単位での手ぶれ量を用いた補正を行っても、前述したフォーカルプレーン現象による歪みは、補正されずに残ってしまう。
この際、手ぶれの方向、大きさ、速度が、1フレーム内(1枚の撮像画像内)で一律でないことが原因となって、CMOSイメージャを用いた撮像装置で、CMOS手ぶれが生じた時の被写体の撮像画像出力は、図4(C)に示すように、グニャグニャした奇妙な画像歪みが生じたものとなる。
そこで、この実施の形態では、1水平ライン単位で撮像画像データがCMOSイメージャから読み出されるとき、各水平ラインについての手ぶれによる位置変位量(以下、手ぶれ量という)を検出し、当該検出した手ぶれ量分だけ、発生した手ぶれとは逆方向にずれた位置から当該水平ラインのデータを読み出すように補正するものである。
しかし、手ぶれ量を各水平ラインについて得ることは、手ぶれを検出するセンサのサンプリング周波数などの条件から困難であることに鑑み、この実施形態においては、画面の垂直方向の複数ライン分置きの位置での手ぶれ量を、離散的に検出する。そして、手ぶれ検出を行なうライン以外の、手ぶれ量を直接的には検出しないラインに対する手ぶれ量は、検出された手ぶれ量を用いるようにする。
先ず、図5を用いて、この発明による撮像画像信号の歪み補正方法の実施形態における手ぶれなどによる撮像素子の位置的変化に基づくフォーカルプレーン現象を含む撮像画像歪みの補正処理の概要を説明する。
図5の概要説明図においては、図5(A)に示すように、画像に生じるCMOS手ぶれによる歪みを判りやすく示すために、歪みの無いオリジナルの画像として多数個の長方形からなる格子縞模様の画像を想定している。したがって、CMOS手ぶれによる画像歪みは、当該格子縞模様を構成する長方形の変形歪みとして現れるものとなる。
なお、この実施形態においても、CMOSイメージャは、図2に示したような1画面とする水平有効領域および垂直有効領域で定まる有効画像領域EFL(1垂直周期分)よりも広い範囲の実効画像領域AFLを有するものが用いられるものである。なお、図5(A)〜(D)に示した1画面分の画像は、図2の有効画像領域EFLの大きさの画像である。
この実施形態では、水平方向の画素クロックの速度は、手ぶれの速度よりも十分に早いとし、また、撮像画像データの読み出しは、1水平ライン単位で順次に行なうものとして、手ぶれ補正は、1水平ライン単位で行なうようにする。
また、この実施形態では、図5(B),(C),(D)に示すように、CMOSイメージャの有効画像領域EFL分の画像区間は、垂直方向に複数に等分割し、各分割画像区間Pdivでは、同じ手ぶれ速度の手ぶれ変位を受けるものと仮定している。ここで、分割数は、手ぶれ補正したときに、必要十分な補正効果が得られる分割画像区間Pdivの大きさを考慮して定められる。以下に説明する例では、有効画像領域EFLの画像区間を垂直方向に8分割するようにする。すなわち、この例では、分割画像区間Pdivは、垂直同期信号の1周期を1/8に分割した区間となる。
1つの分割画像区間Pdivは、複数水平ライン分からなるが、この実施形態では、同じ分割画像区間Pdivに含まれる複数水平ラインは同じ手ぶれ速度の手ぶれ変位を受けるものと仮定して手ぶれ補正処理を行なうものである。
そして、この実施形態では、8個の分割画像区間Pdiv_0〜Pdiv_7のそれぞれの先頭の水平ラインに対する手ぶれ速度ベクトルを、図5(B)の左側の矢印に示すようなものとして、手ぶれ速度検出手段により検出する。すなわち、この例では、手ぶれ速度ベクトルは、1画面分の撮像画像について、8箇所において、離散的に検出するようにする。
図5(B)の画像は、手ぶれ速度ベクトルが、各分割画像区間Pdivで、左側の矢印のようなものとした時に生じる手ぶれによる撮像画像の歪みを示している。この実施形態では、この手ぶれによる撮像画像の歪みを、水平方向処理と垂直方向処理とに分けて、それぞれの方向の歪みを別々に補正するようにする。
補正処理の詳細については後述するが、この実施形態では、先ず、水平方向の歪みについて補正処理を行ない、次いで、垂直方向の歪みについての補正処理を行なう。この場合に、1画面分の撮像画像のすべてのデータについての水平方向の歪み補正処理が完了する前であっても、垂直方向の歪み補正処理が可能になった段階で、垂直方向の歪み補正処理を開始して、水平方向の歪み補正処理と並行して行なうようにすることにより、効率良く歪み補正処理を行なうようにする。
そこで、この実施形態では、先ず、手ぶれによる水平方向の画像歪みを補正するために、図5(C)の左側の矢印および図6の左側の矢印で示すように、各分割画像区間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の先頭の水平ライン時点を基準点とした時間で積分)して算出する。図6の右側に、その積分結果の値としての水平方向の手ぶれ補正量(以下、水平手ぶれ補正量という)SX_ADDを示す。
この図6から判るように、各水平ラインのそれぞれについての水平手ぶれ補正量SX_ADDは、各分割画像区間Pdiv_0〜Pdiv_7においては、一定の傾きで変化し、かつ、積分であるので、分割画像区間の境目では折れ線とはなるが、連続的なものとなり、ずれは生じない。
水平方向の歪み補正処理においては、以上のようにして求められた各ラインについての手ぶれ水平補正量SX_ADDを用いて、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。すなわち、各水平ラインの読み出し開始位置を、図5(B)における手ぶれに応じて水平方向にずれた位置からとすることにより、図5(C)の画像に示すように、水平方向の歪みが補正されることになる。
この図5(C)の画像は、図5(B)の画像歪みの内の水平方向の歪みは補正されて除去されているが、垂直方向の歪みが残っている。
そこで、この実施形態では、手ぶれによる垂直方向の画像歪みを補正するため、図5(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イメージャ上での各水平ラインの垂直方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。これにより、図5(D)の画像に示すように、水平方向の場合と同様にして垂直方向の歪みが補正され、歪みの除去された撮像画像データ出力が得られる。
なお、上述の説明では、手ぶれ速度ベクトルから水平成分および垂直成分を抽出するときに、その逆符号成分を算出して、補正速度成分とするようにしたが、速度成分あるいは手ぶれ量を逆符号として、補正速度成分あるいは手ぶれ補正量とするのは、撮像画像データに対する手ぶれ補正処理の実行開始前であれば、どの時点であっても良い。
次に、撮像レンズの歪曲収差特性による撮像画像歪みの補正について説明する。
前述したように、一般に撮像レンズは歪曲収差特性を有しており、このため、例えば図53(A)に示すような格子縞の被写体を、歪曲収差が大きい撮像レンズを用いて撮像したときには、その撮像画像は、図53(B)に示すように、格子縞を構成する縦横の直線が、湾曲するような画像歪みを生じる。この撮像レンズによる画像歪みは、撮像素子の各画素位置に応じたものであり、かつ、撮像レンズごとに特有のものであり、また、撮像素子に対する撮像レンズの位置が変化すると、その位置に応じたものとなる。
したがって、CMOSイメージャのようなX−Yアドレス型の撮像素子を用いて撮像する装置においては、手ぶれによる画像歪みを補正しただけでは、撮像レンズの歪曲収差特性に基づく画像歪みが残ってしまう。
そこで、この実施形態では、X−Yアドレス型の撮像素子を用いた撮像装置において、手ぶれ等が原因で生じる撮像画像の歪みと共に、撮像レンズの歪曲収差特性に基づく画像歪みを併せて軽減するようにしている。
この実施形態では、水平手ぶれ補正量および垂直手ぶれ補正量に、撮像レンズの歪曲収差特性に基づく画像歪み(以下、レンズ歪みという)の補正量を加算し、その加算した補正量により撮像画像データを補正処理することにより、手ぶれによる画像歪みと撮像レンズによる画像歪みの両方を同時に補正するようにするものである。
この実施形態では、以上のように、手ぶれ補正を水平処理と垂直処理に分けるのに合わせて、レンズ歪みの補正も水平処理と垂直処理に分けるようにする。前述もしたように、レンズ歪みは、撮像レンズに固有のものである。そこで、撮像素子上における各画素位置におけるレンズ歪みの補正量は、予め用意することができる。
この実施形態では、撮像素子上における各画素位置におけるレンズ歪みの補正量は、各画素位置に対する補正ベクトルとしてエンコードされて、撮像装置に設けられる補正量デコード部に与えられる。補正量デコード部は、各画素位置の座標(撮像素子上における絶対座標)を引数として、当該画素位置における前記補正ベクトルを得ると共に、その補正ベクトルをデコードして、当該画素位置におけるレンズ歪みの補正量の水平方向補正成分と垂直方向補正成分とを得る。
そして、撮像素子からの撮像画像データの各水平ラインの画素データは、上述のようにして求められた水平手ぶれ補正量SX_ADDにより、水平方向に手ぶれ速度の水平方向成分に応じた分だけシフトされた座標位置のものとされるが、当該座標位置(画素位置)におけるレンズ歪みの補正量の水平方向補正成分の分だけ、当該画素データの座標位置をさらに水平方向にシフトするように補正する。ここで、レンズ歪みの補正量の水平方向補正成分は、前記水平方向手ぶれ補正量SX_ADDにより補正された画素座標位置を引数として、上述のようにして取得される。
また、垂直方向についても、撮像素子からの撮像画像データの各水平ラインの画素データは、上述のようにして求められた垂直手ぶれ補正量SY_ADDにより、垂直方向に手ぶれ速度の垂直方向成分に応じた分だけシフトされた座標位置のものとされるが、当該座標位置(画素位置)におけるレンズ歪みの補正量の垂直方向補正成分の分だけ、当該画素データの座標位置をさらに垂直方向にシフトするように補正する。ここで、レンズ歪みの補正量の垂直方向補正成分は、前記垂直方向手ぶれ補正量SY_ADDにより補正された画素座標位置を引数として、上述のようにして取得される。
なお、レンズ歪みは、光学ズームにより撮像レンズの光軸上の位置が変更されるときには、その光軸上の位置に応じたものとなる。このため、光学ズームを用いる場合には、撮像レンズの光軸上の位置に応じた補正ベクトルが、前記補正量デコード部に供給されるように構成される。
さらに、この実施形態の撮像装置では、画像処理として、上述のような手ぶれ補正や撮像レンズの歪曲収差特性に基づく画像歪みの補正のみではなく、電子ズームによる画像の拡大・縮小処理および出力撮像画像の解像度を、例えばユーザが指定した所望のものとするようにするための画像処理も行なうようにする。
[この発明の実施形態の構成]
次に、この発明による画像データ処理方法および装置の実施形態を、図を参照しながら説明する。図1は、この発明による画像データ処理装置の実施形態が適用された撮像装置のブロック図を示すものである。
図1に示すように、撮像レンズ1Lを備えるカメラ光学系1を通じた被写体からの入射光は、撮像素子2に照射されて撮像される。この例では、撮像素子2は、前述したようにX−Yアドレス型の固体撮像素子の一例であるCMOSイメージャで構成されている。
この例では、撮像素子2からは、タイミング信号発生部4からのタイミング信号により1ライン単位が同時に取り出される(サンプリングされる)ことによりアナログ撮像信号とされて出力される。そして、出力されたアナログ撮像信号は、データ変換部3に供給される。
データ変換部3は、これに入力されたアナログ撮像信号に必要な補正処理を加えた後、タイミング信号発生部4からのクロック信号に同期してデジタル撮像信号に変換する。そして、データ変換部3は、デジタル撮像信号を輝度信号成分と色差信号成分とからなる撮像画像データDinに変換し、その撮像画像データDinを信号処理部5に供給する。
信号処理部5は、データ変換部3からの撮像画像データDinについて、これに接続されている画像メモリ6への書き込み/読み出しを制御しながら、手ぶれ補正およびレンズ歪み補正の補正処理や、撮像画像の電子ズーム処理(電子的拡大・縮小処理)を行なうとともに、指定された解像度の出力画像データDoutを生成して出力する。
画像メモリ6は、1個のメモリで構成されるが、4つのバンクBANK0,BANK1,BANK2,BANK3に分割されている。また、この実施形態では、画像メモリ6は、信号処理部5に含まれるメモリ制御部によるアドレス管理および書き込み/読み出し制御により、第1メモリ領域61と第2メモリ領域62との2つのメモリ領域に分割されて使用される。つまり、画像メモリの4つのバンクBANK0,BANK1,BANK2,BANK3は、それぞれ第1メモリ領域61と、第2メモリ領域62とに分割されて使用される。
そして、この実施形態では、図7に示すように、第1メモリ領域61と第2メモリ領域62との分割点のアドレス(セパレートアドレス)SepAdrは、4つのバンクBANK0,BANK1,BANK2,BANK3について同一とされ、かつ、このセパレートアドレスSepAdrは、対象となる画像処理に応じて、後述するように、変更されるようにされている。
このセパレートアドレスSepAdrは、後述するように、制御部10から信号処理部5に与えられて、設定される。制御部10には、ユーザインターフェース9を通じて、ユーザによる出力解像度の選択入力、電子ズーム率の入力、手ぶれ補正の有無の入力、レンズ歪み補正の有無の入力などが供給されており、制御部10は、当該入力情報に基づいて、セパレートアドレスSepAdrを決定する。その決定方法については後述する。
後述もするように、この実施形態では、第1メモリ領域61には、水平方向の画像処理結果の撮像画像データが書き込まれる。そして、この第1メモリ領域61に、垂直方向の画像処理が開始できるだけの容量の撮像画像データが書き込まれると、当該書き込まれた撮像画像データが、その先頭から読み出される。そして、第1メモリ領域61から読み出された撮像画像データは、垂直方向の画像処理がなされた後、その垂直方向の画像処理結果の撮像画像データが第2メモリ領域62に書き込まれる。
そして、この実施形態においては、画像データの画像メモリ6に対する書き込みおよび読み出しは、複数画素単位でなされる。ここで、書き込み及び読み出しの単位とされる複数画素の画素数は、1ラインの有効画素数の1/N(Nは2以上の正の整数)であることが好ましく、この例では、8画素単位でなされる。
そして、後述するように、画像メモリ6の4個のバンクBANK0,BANK1,BANK2,BANK3に対する画像データの書き込みは、所定のデータ長、例えば1ライン分ごとに、バンクを順次に切り換えて行ない、また、画像データの画像メモリ領域からの読み出しは、前記所定のデータ長分について、複数の前記バンクから同時に行なう。
すなわち、例えば、1つのバンクに、例えば1ライン分を書き込むと、次のバンクに次の1ライン分を書き込むというようにして、4個全てのバンクにそれぞれ1ライン分を書き込んだら、最初のバンクに戻って次の1ライン分を書き込むようにする。以降、同じ動作を続けることにより、画像の書き込みを行なう。
また、画像メモリ6からの画像データの読み出しは、例えば、連続する2ライン分を、2個のバンクから同時に読み出す、あるいは、連続する4ライン分を、4個のバンクから同時に読み出すようにする。
画像メモリ6の4個のバンクBANK0,BANK1,BANK2,BANK3の第1メモリ領域61および第2メモリ領域62は、後述するように、FIFO(First−In First−Out)動作により書き込みながら読み出しを行なうように制御されて、遅延は、あるものの、撮像画像データのリアルタイム処理がなされる。この場合に、この実施形態では、各バンクBANK0,BANK1,BANK2,BANK3の第1メモリ領域61および第2メモリ領域は、それぞれリングメモリバッファとして用いるようにアドレス制御される。
そして、第1メモリ領域61の記憶容量(4バンクの第1メモリ領域の合計の容量)は、垂直方向の画像処理が開始できるだけの容量に所定のマージン分を加えたものでよいので、1画面分(1フィールドあるいは1フレーム)以下とされる。この実施形態では、第1メモリ領域61の記憶容量(4バンクの第1メモリ領域の合計の容量)は、少なくとも垂直解像度変換用のデジタルフィルタのタップ数に応じた画像ライン数分の容量を必要とする。
一方、第2メモリ領域62(4バンクの第2メモリ領域の合計の容量)には、この実施形態では、少なくとも解像度変換後の出力画像データDoutの1画面分を記憶する記憶容量が必要である。つまり、第2メモリ領域62の記憶容量(4バンクの第2メモリ領域の合計の容量)は、出力画像データDoutの1画面分(1フィールド分または1フレーム分)以上である必要がある。
しかし、第1メモリ領域61(4バンクの第1メモリ領域の合計の容量)および第2メモリ領域62の記憶容量(4バンクの第2メモリ領域の合計の容量)は、水平方向の処理結果のデータ量および出力画像データDoutのデータ量に依存するので、撮像素子2の画素数が変化しても、変化させる必要はない。もっとも、画像メモリ6全体の記憶容量は、選択できる解像度のうちで、最も高解像度の場合を想定して、決定される。当該画像メモリ6を用いた画像処理については、後でさらに詳述する。
さらに、後述するように、各バンクの第1メモリ領域61および第2メモリ領域62では、画像データの書き込みが、その前に書き込まれた画像データの読み出しを追い越さないように、信号処理部5のメモリ制御部により、アドレス制御されるものである。
なお、この画像メモリ6に対する画像データの書き込みおよび読み出しアクセス方法の詳細については、後で詳述する。
信号処理部5には、タイミング信号発生部4から、出力画像データの水平周期に同期する信号、すなわち、水平同期信号H−SYNCと、出力画像データの垂直周期に同期する信号、すなわち、垂直同期信号V−SYNCと、1画素周期のクロック信号CLKと、それらに同期するクロックが、処理タイミング信号として供給される(図1では、これらの信号の図示は省略)。
また、撮影時に撮像装置を保持している撮影者による手ぶれ速度を検出する手ぶれ速度検出部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に供給する。
また、この例の撮像装置は、全体を制御するためのマイクロコンピュータを搭載する制御部10を備える。この制御部10には、ユーザインターフェース9が接続されている。そして、このユーザインターフェース9を通じて、ユーザからの画像拡大・縮小指示入力や、解像度指示入力、また、ズーム倍率の値の指示入力などが制御部10に与えられる。制御部10は、それらの指示入力に応じた制御信号を形成し、タイミング信号発生部4や信号処理部5に供給する。
また、この実施形態では、制御部10は、ユーザインターフェース9を通じた前述の画像処理に関する入力に応じて、画像メモリ6の第1メモリ領域61と第2メモリ領域との分割点アドレスとしてのセパレートアドレスSepAdrを設定し、信号処理部5に供給するようにする。信号処理部5のメモリ制御部は、このセパレートアドレスSepAdrにより、第1メモリ領域61と第2メモリ領域62とを認識して、これらのメモリ領域に対する画像データの書き込みおよび読み出しを実行する。
また、レンズ歪み補正用データ導出・エンコード部11が設けられる。この補正用データ導出・エンコード部11は、ユーザインターフェース9を通じて入力されたレンズ1Lの歪曲収差に関するデータおよび制御部10からの光学ズームの操作情報に応じた撮像レンズの光軸位置に関する情報などから、撮像素子2の全画素の撮像素子2上の各位置に応じたレンズ歪み補正ベクトルを予め計算する。そして、補正用データ導出・エンコード部11は、求めた補正ベクトルを圧縮するなどしてエンコードし、レンズ歪み補正用データデコード部12に供給する。
この補正用データ導出・エンコード部11は、非常に負荷の大きな演算が必要となるので、専用のマイクロコンピュータやDSP(Digital Signal Processor)が用いられて構成される。
レンズ歪み補正用データデコード部12は、レンズ歪み水平補正量データデコード部121と、レンズ歪み垂直補正量データデコード部122とを備える。そして、補正用データ導出・エンコード部11からのレンズ歪み補正ベクトルから、レンズ歪み水平補正量データデコード部121は、レンズ歪み水平補正量データを生成し、レンズ歪み垂直補正量データデコード部122は、レンズ歪み垂直補正量データを生成する。
そして、レンズ歪み水平補正量データデコード部121、レンズ歪み垂直補正量データデコード部122のそれぞれは、信号処理部5からの歪み補正対象部位としての画素位置の情報を引数として受けて、当該画素位置における水平レンズ歪み補正量データ、垂直レンズ歪み補正量データをそれぞれ信号処理部5に返す。
信号処理部5では、画像メモリ6への画像データの書き込み/読み出しを制御しながら、後で詳述するようにして、手ぶれ速度検出処理部8からの水平補正速度成分と垂直補正速度成分とから、各水平ラインの水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDを算出する。
そして、信号処理部5では、これら算出した水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDと、前記レンズ歪み補正データデコード部12からのレンズ歪み水平補正量データおよびレンズ歪み垂直補正量データとを用いて、データ変換部3からの撮像画像データDinについての手ぶれによる画像歪み補正処理およびレンズ歪みを補正処理し、出力画像データDoutを得る。
なお、前述したように、信号処理部5では、上述の歪み補正処理の他、電子ズーム(画像拡大・縮小)処理を行なうと共に、標準精細度、高精細度などに応じた解像度変換処理なども行なう。
信号処理部5からの出力画像データDoutは、記録処理部13により例えばデータ圧縮されると共に、記録メディア14への記録に適した変調が施された後、記録メディア10に記録される。記録メディア14としては、磁気テープや磁気ディスクなどの磁気記録媒体、DVD(Digital Versatile Disc)などの光ディスク媒体、ハードディスク、カード型メモリなどを用いることができる。なお、出力撮像画像データをインターネットやワイヤレス通信手段を介して記録メディア14に記憶するようにすることもできる。
信号処理部5からの出力画像データDoutは、また、表示系処理部15を通じて表示モニターとしての、例えばLCD(Liquid Crystal Display)などのディスプレイに供給され、画像表示される。記録メディア14に記録された撮像画像データも、再生処理部16により再生され、表示系処理部15を通じて表示モニターに供給され、再生画像表示される。
次に、図1の信号処理部5、画像メモリ6、手ぶれ速度処理部8の部分の、より詳細な構成ブロック図を図8に示す。
すなわち、手ぶれ補正およびレンズ歪み補正処理や電子ズーム処理、解像度変換処理、出力データ生成処理のために、信号処理部5は、水平処理ブロック51と、垂直処理ブロック52と、レジスタブロック53と、メモリ制御部の機能を備えるメモリインタフェース54とを含んでいる。そして、水平処理ブロック51は、水平処理用手ぶれ補正量積分部511と水平画像処理部512とを備え、また、垂直処理ブロック52は、垂直処理用手ぶれ補正量積分部521と垂直画像処理部522とを備える。
また、水平画像処理部512に対して、レンズ歪み水平補正量データデコード部121が接続され、垂直画像処理部522に対して、レンズ歪み垂直補正量データデコード部122が接続される。
水平処理ブロック51は、データ変換部3からの撮像画像データDinに対して水平方向の処理を施す。この水平方向の処理には、水平方向の手ぶれ補正およびレンズ歪み補正処理、水平方向の画像拡大・縮小処理、水平方向の解像度変換を含む。垂直処理ブロック52は、撮像画像データDinに対して垂直方向の処理を施す。この垂直方向の処理には、垂直方向の手ぶれ補正およびレンズ歪み補正処理、垂直方向の画像拡大・縮小処理、垂直方向の解像度変換を含む。
また、レジスタブロック53は、手ぶれ速度検出処理部8で検出された手ぶれ速度の情報を、水平処理ブロック51および垂直処理ブロック52に受け渡す処理を行なう。レジスタブロック53は、また、画像メモリ6のセパレートアドレスSepAdrを、メモリインタフェース54に受け渡す処理も行なう。
手ぶれ速度検出部8は、サンプリング部81と、水平補正速度成分検出部82と、垂直補正速度成分検出部83とからなる。
サンプリング部81では、手ぶれ検出部7からの手ぶれ速度検出出力(図9(A)参照)を、タイミング信号発生部4からのサンプリング信号Spによりサンプリングすることにより、各分割画像区間Pdiv_0〜Pdiv_7についての手ぶれ速度ベクトルVec_0〜Vec_7(図9(B)参照)を取得する。この例では、サンプリング部81では、前述したように、手ぶれ速度ベクトルVec_0〜Vec_7は、各分割画像区間Pdiv_0〜Pdiv_7の先頭ラインに対するものが、垂直周期の1/8の周期でサンプリングされる。
ここで、取得すべき各手ぶれ速度ベクトルの値は、撮像素子2からの撮像画像データの対応する水平ラインのサンプリング時刻の値ではない。なぜなら、前述したように、撮像素子2上の各画素には露光時間があり、撮像素子2から取り出された撮像信号(色フィルタを通過した後の輝度値)は、各ラインのサンプリング時刻から露光時間分遡った時刻までの平均値であるからである。
このため、この実施形態では、手ぶれ速度ベクトルの値の検出点は、図10に示すように、各水平ラインの画像データのサンプリング時刻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(図9(C)参照)を求める。
また、垂直補正速度成分検出部9では、各分割画像区間Pdiv_0〜Pdiv_7における手ぶれ速度ベクトルVec_0〜Vec_7の垂直方向成分を抽出し、その逆符号成分として、垂直補正速度成分Y_STB_0〜Y_STB_7(図9(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を用いて、水平方向の手ぶれ成分を補正するように、各水平ラインの画素データのx座標を、水平方向にシフトする。また、水平方向のレンズ歪みを補正するために当該画素のy座標が必要になることを考慮して、垂直処理用手ぶれ補正量積分部521で算出された垂直手ぶれ補正量SY_ADDを用いて、当該補正対象部位の画素データのy座標を、垂直方向の手ぶれ成分を補正するようにシフトしたものとして求める。
そして、水平画像処理部512は、当該手ぶれに応じて水平方向および垂直方向にシフトした各画素データのx座標と、y座標とを、引数としてレンズ歪み水平補正量データデコード部121に供給し、このレンズ歪み水平補正量データデコード部121から、当該x座標およびy座標位置の画素位置に対するレンズ歪み水平補正量データ(水平方向の座標シフト量)を得る。
そして、水平画像処理部512は、水平手ぶれ補正量SX_ADDを用いて補正したx座標データに、取得したレンズ歪み水平補正量データを加算して、さらにシフトする。そして、当該シフトされたx座標データを用いて、水平方向の手ぶれ成分およびレンズ歪みの水平方向成分を補正する。
また、垂直処理ブロック52の垂直画像処理部522では、垂直処理用手ぶれ補正量積分部521で算出された垂直手ぶれ補正量SY_ADDを用いて、垂直方向の手ぶれ成分を補正するように、各水平ラインの画素データのy座標を、垂直方向にシフトする。また、垂直方向のレンズ歪みを補正するために当該画素のx座標が必要になることを考慮して、水平処理用手ぶれ補正量積分部511で算出された水平手ぶれ補正量SX_ADDを用いて、当該補正対象部位の画素データのx座標を、水平方向の手ぶれ成分を補正するようにシフトしたものとして求める。
そして、垂直画像処理部522は、当該手ぶれに応じて水平方向および垂直方向にシフトした各画素データのx座標とy座標とを、引数としてレンズ歪み垂直補正量データデコード部122に供給し、このレンズ歪み垂直補正量データデコード部122から、当該x座標およびy座標位置の画素位置に対するレンズ歪み垂直補正量データ(垂直方向の座標シフト量)を得る。
そして、垂直画像処理部522は、垂直手ぶれ補正量SY_ADDを用いて補正したy座標データに、取得したレンズ歪み垂直補正量データを加算して、さらにシフトする。そして、当該シフトされたy座標データを用いて、垂直方向の手ぶれ成分およびレンズ歪みの垂直方向成分を補正する。
以上の補正処理においては、水平処理ブロック51の水平画像処理部512および垂直処理ブロック52の垂直画像処理部522では、それぞれ画像メモリ6に対して画像データの読み書きをしながら補正処理を実行するようにする。
この実施形態では、画像メモリ6は、前述したように、メモリインタフェース54によるアドレス管理に基づいて、第1メモリ領域61と第2のメモリ領域62とに論理的に分割されており、第1メモリ領域61には、水平処理ブロック51の水平画像処理部512で処理された結果の撮像画像データが書き込まれる。
この例では、第1メモリ領域61は、後述する垂直方向の補間処理用のFIR(Finite Impulse Response)フィルタのタップ数以上のライン数分の容量を有する。この垂直方向の補間処理用のFIRフィルタは、垂直方向の手ぶれ補正用フィルタ、垂直方向のレンズ歪み補正用フィルタおよび垂直解像度変換フィルタを構成しているものである。
そして、この第1メモリ領域61に必要な記憶容量は、上記の垂直処理用のFIRフィルタのタップ数のみではなく、電子ズーム率、レンズ歪み補正率、手ぶれ補正率にしたがって変化する。
第1メモリ領域61に垂直画像処理を開始することができる画像データが書き込まれると、この第1メモリ領域61から画像データが読み出されて、垂直ブロック52の垂直画像処理部522で垂直方向の画像処理がなされ、その処理結果が第2メモリ領域62に書き込まれる。そして、この第2メモリ領域62から出力画像データDoutが読み出される。
したがって、この第2メモリ領域の記憶容量としては、出力画像データDoutの1画面分(1フィールドまたは1フレーム)の容量が最低必要とされる。
水平処理ブロック51の水平画像処理部512には、後述するように、1ライン分の容量の水平処理用FIFOラインメモリが設けられ、この水平処理用FIFOラインメモリへの画像データの書き込み、読み出しを制御するFIFOメモリコントローラ(図8では図示を省略)が設けられていると共に、算出した水平手ぶれ補正量SX_ADDが小数点以下(補正後の画素位置が、水平方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう水平方向補間処理部(図8では図示を省略)が設けられている。この水平方向補間処理部は、後述するように、この実施形態では、水平方向のデジタルFIRフィルタ(以下、水平FIRフィルタという)が用いられる。
なお、1ライン分の容量の水平処理用FIFOラインメモリも、画像メモリ6の一部のメモリ領域として設定しておき、FIFOメモリコントローラを、メモリインタフェース54により構成するようにしても良い。
そして、メモリインタフェース54は、第1メモリ領域61への水平画像処理後の画像データの書き込みを制御すると共に、第1メモリ領域61からの画像データの読み出しを制御して、垂直処理ブロック52の画像処理部522に供給する。また、メモリインタフェース54は、画像処理部522で垂直方向処理がなされた画像データの、第2のメモリ領域62への書き込み、読み出しを制御する。
第2メモリ領域62から読み出された画像データは、画像データ出力部523に供給され、この画像データ出力部523から出力画像データDoutが導出される。
また、垂直処理ブロック52の垂直画像処理部522には、算出した垂直手ぶれ補正量SY_ADDが小数点以下(補正後の画素位置が、垂直方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう垂直方向補間処理部(図8では図示を省略)が設けられている。この垂直方向補間処理部は、後述するように、この実施形態では、垂直方向のデジタルFIRフィルタ(以下、垂直FIRフィルタという)が用いられるが、レンズ歪み補正のために必要なライン数および垂直解像度変換を考慮したタップ数とされる。
ここで、算出した水平手ぶれ補正量SX_ADDとレンズ歪み水平補正量との加算量および垂直手ぶれ補正量SY_ADDとレンズ歪み垂直補正量との加算量が小数点以下の値を持つ場合の補間処理について説明する。
まず、手ぶれ補正について説明する。例えば、手ぶれの水平方向の速度成分により、水平方向に図11に示すような画像歪みが生じた場合を想定する。すなわち、図11の例は、手ぶれが無ければ破線で示す直線上にあるべき画素G11,G21,G31・・・、G12,G22,G32・・・、G13,G23,G33・・・、が、手ぶれの水平方向の速度成分のために実線で示すような斜め位置となっている場合である。
この手ぶれを補正するためには、ずれている画素位置を本来の位置にあるようにずらせばよく、そのずれ量が、図11に示すように、前述した水平手ぶれ補正量SX_ADDに相当する。この水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍であれば、画素データを当該水平手ぶれ補正量SX_ADDに応じた画素ピッチ分だけずらして読み出すようにすることで補正することができる。
しかしながら、水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍ではなく、小数点以下のずれ量を含む場合には、そのずれ量に対応する位置は、画素データが存在する位置ではないので、その位置の近傍の複数個の画素データを用いた補間処理により、対応する画素位置の画素データを生成する必要がある。
図12は、その補間方法の一例を示すもので、求める画素データが、画素G1と画素G2との間の補間画素Gsである場合に、この補間画素Gsの位置と画素G1,G2の位置との距離k1,k2に応じた割合で、画素G1のデータと画素G2のデータとを加算することにより、補間画素Gsの画素データを生成するものである。この場合、k1:k2=W:(1−W)としたとき、
補間画素Gs=G1×W+G2×(W−1)
なる補間演算により、補間画素Gsの画素データを得る。
また、図12の例のような2個の画素データを用いるのではなく、図13の例のように2個以上(図13の例では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の画素データを得るようにする。
この図13の例の場合、乗算係数W0,W1,W2,W3の値の組は、画素G1または画素G2と補間画素Gsとの距離dsに対応するものとして関連付けられたテーブルを用意しておき、距離dsを検索子として、上記乗算係数W0,W1,W2,W3の組をテーブルから読み出すようにすることで得ることができる。なお、距離dsは、水平手ぶれ補正量SX_ADDの小数部に相当するものである。
この補間処理は、この実施形態では、水平FIRフィルタを用いて行なうようにする。すなわち、水平手ぶれ補正量SX_ADDの小数部に対応する前記乗算係数の組をテーブルから読み出し、その乗算係数を水平FIRフィルタに対して供給することで上記補間処理を行なうことができる。
以上は、水平方向の手ぶれ補正の場合の補間処理であるが、垂直方向の手ぶれ補正の場合の補間処理についても、補間方向が垂直方向になるだけで、全く同様である。
この手ぶれ補正の場合の補間処理動作は、この実施形態では、レンズ歪みが全く無いとした場合にのみ行なわれることになる。この実施形態では、手ぶれ補正のための補正量とレンズ歪み補正のための補正量との加算量により補正された座標位置の画素データを得るように補間処理を行なうものである。この補間処理も基本的な考え方は、上述の図12、図13の場合と全く同様である。
このレンズ歪みを含む場合における補間処理を、図14を参照して説明する。なお、図14においては、x方向およびy方向にそれぞれ4つ並んだ4×4=16個からなる画素データを用いて出力画像の画素データを決定する場合の例示である。なお、このレンズ歪み補正についての補間処理の方法は、特開2004−80545公報に詳細に記載されているものを適用したものであり、詳細な説明は、上記公報に譲り、ここでは要点のみを説明する。
図14(A)は、歪みを伴う画像データを構成する点B1〜B4が、水平方向の補間により、それぞれ点B10〜B40の画像データに変換された様子を示す図である。また、図14(B)は、さらに垂直方向の補間により、点B10〜B40が、それぞれb1〜b4の画素データに変換された様子を示している。
この場合、この実施形態では、図14(A)の左側の歪みを伴う画像データを構成する点B1〜B4は、水平方向の手ぶれ補正量が含まれたものと考えることができる。図14(A)の場合の水平方向の補間は、各点B1〜B4のそれぞれに対して、前述した例えば図の場合を適用することで行なうことができる。つまり、水平FIRフィルタを用いる1次元補間演算でよい。
また、図14(B)の垂直方向の場合にも同様に、図14(B)で、例えば点B30に対しては、垂直方向に連続した当該点B30を跨ぐ、破線内の4つの格子点(点K20〜K23)における画像データに、前述した図12または図13と同様の考え方による乗算係数を用いて補間処理を実行することにより、点b3の画素データが算出される。したがって、垂直方向についても、垂直FIRフィルタによる1次元補間演算でよい。
[水平処理ブロック51における処理動作]
[水平処理用手ぶれ補正量積分部511の積分処理]
図15に、水平処理用手ぶれ補正量積分部511における積分処理動作のフローチャートを示す。
まず、初期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)。ここで、図15のステップS6における「stb_x」は、水平補正速度成分X_STB_0〜X_STB_7のいずれかの値である。すなわち、「stb_x」は、現処理ラインが所在する分割画像区間についての水平補正速度成分の値である。
また、水平レンズ歪み水平補正量データを、水平レンズ歪み水平補正量データデコード部121から取得するためには、補正対象部位の画素のx座標だけではなくy座標も必要であり、かつ、当該y座標は、CMOS手ぶれの影響を受けているため、この水平処理用手ぶれ補正量積分部511においても、垂直手ぶれ補正量SY_ADDを積分して得るようにする。
すなわち、ステップS3で発生するトリガTG1ごとに、垂直補正速度成分Y_STB_0〜Y_STB_7のうちの、現処理ラインが所在する分割画像区間についての垂直補正速度成分を加算することにより、積分処理を行ない、垂直手ぶれ補正量SY_ADDを得る(ステップS7)。ここで、図15のステップS7における「stb_y」は、垂直補正速度成分Y_STB_0〜Y_STB_7のいずれかの値である。すなわち、「stb_y」は、現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である。
ステップS1で、1水平同期信号H−SYNC毎に加算される値「step」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG1は、1水平同期信号H−SYNC毎に発生するため、ステップS6では、1水平ライン毎に「stb_x」を加算(積分)し、ステップS7では1水平ライン毎に「stb_y」を加算(積分)するものである。
こうして得られる水平手ぶれ補正量SX_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置の補正量、すなわち、水平処理ブロック51における水平方向画像歪み補正処理における各ラインの水平初期位置(水平オフセット)そのものとなる。補正対象部位としての水平ラインの各画素のx座標は、この水平手ぶれ補正量SX_ADDだけ、水平方向にシフトされたものとなる。
また、垂直手ぶれ補正量SY_ADDは、CMOSイメージャ上での各水平ラインの垂直方向の座標シフト量となる。この値は、同一水平ライン内では同じであり、したがって、補正対象部位としての水平ラインの各画素のy座標は、当該垂直手ぶれ補正量SY_ADDだけ、垂直方向にシフトされたものとなる。
このように、水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDにより、CMOS手ぶれに応じて補正された画素位置の情報は、後述するように、当該画素位置における水平方向のレンズ歪みを取得するための情報として用いられる。
上述したように、ステップS6およびステップS7では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、水平補正速度成分X_STB_0〜X_STB_7のうちのいずれか1つ、および垂直補正速度成分Y_STB_0〜Y_STB_7のうちのいずれか1つを選択しなければならない。そのための仕組みが、図15の残りの部分の処理である。
この例では、分割画像区間分のライン数の加算値stb_gridが定義される(ステップS8)。この加算値stb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値stb_gridと、積分回数hstb_cntとを比較し、積分回数hstb_cntが加算値stb_gridを超える毎に、トリガTG2を発生する(ステップS9)。そして、トリガTG2が発生するごとに、加算値hstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS10)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG2が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値HDIV_CNTを定義し(ステップS11)、この分割区間値HDIV_CNTを、トリガTG2が発生する毎に、1づつインクリメントする(ステップS12)。すると、分割区間値HDIV_CNTは、現処理ラインが所在する各分割画像区間Pdiv_0〜Pdiv_7のそれぞれに対応して「0」〜「7」の値を取る。すなわち、分割区間値HDIV_CNTは、水平処理の進捗度合いを示すものとなる。
ステップS6、ステップS7では、この分割区間値HDIV_CNTを参照して、「stb_x」、「stb_y」を決定する。
なお、この例では、分割区間値HDIV_CNT=8のときには、1フレーム分の画像データについての処理が終了したことを意味する。そして、分割区間値HDIV_CNT=8に、「1」が加わると、分割区間値HDIV_CNT=0となるように計算される。
この分割区間値HDIV_CNTは、また、垂直処理ブロック52およびレジスタブロック53に、水平処理ブロック51での現処理ラインが何れの分割画像区間に所在しているかを示すために、すなわち、水平処理の進捗状況を報知するために供給される。
[水平画像処理部512の処理動作]
図16は、水平画像処理部512の構成例を示すものである。この図16の例では、前述の図15のフローチャートにおける水平同期信号H−SYNC毎に値「step」を初期y座標SYに加算する加算部101が、この水平画像処理部512に含まれるものとしており、このため、この水平画像処理部512に初期y座標SYが入力される。さらに、この水平画像処理部512には初期x座標SXが入力される。これら初期y座標SYおよび初期x座標SXは、1フレームの先頭で、例えば制御部10で設定されて入力される。
そして、加算部101からの、水平同期信号H−SYNC毎に値「step」が加算されたy座標値SY´は、水平処理用手ぶれ補正量積分部511に供給される。すると、この水平処理用手ぶれ補正量積分部511からは、現処理ラインの先頭のx座標のオフセット値として、水平手ぶれ補正量SX_ADDが返ってくると共に、現処理ラインのy座標のオフセット値SY_ADDが返ってくる。
水平画像処理部512では、加算部102において、各水平ラインの先頭で一回だけ、水平処理用手ぶれ補正量積分部511からの水平手ぶれ補正量SX_ADDを、初期x座標SXに加算する。また、加算部103において、各水平ラインの先頭で一回だけ、水平処理用手ぶれ補正量積分部511からの垂直手ぶれ補正量SY_ADDを、初期y座標SYに加算する。
そして、加算部102の出力値に対して、画素処理クロックCLKごとに、水平拡大・縮小のパラメータ並びに水平方向の解像度変換のパラメータである値「hmag」を、加算部104により加算する。この加算部104の出力値hx_addは、レンズ歪み水平補正量データデコード部121に対する引数としての座標(x、y)データのうちのx座標として供給する。
また、加算部103の出力値hy_addは、レンズ歪み水平補正量データデコード部121に対する引数としての座標(x,y)データのうちのy座標として供給する。
レンズ歪み水平補正量データデコード部121からは、これに入力された座標(x,y)の撮像素子上のレンズ歪み水平補正量データCORR_Xが出力される。このレンズ歪み水平補正量CORR_Xは、加算部104の出力値hx_addに、画素処理クロックCLKごとに加算部106で加算される。
なお、加算部104からの水平座標の補正出力値hx_addは、レンズ歪み水平補正量データデコード部121からレンズ歪み水平補正量データCORR_Xを得るときの遅延量分の遅延部105を介して加算部106に供給される。
そして、加算部106からの出力値X_ADDは、比較部107および108、また、小数部抽出部109および整数部抽出部110に供給される。
比較部107は、加算部106からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1以上であるとき、すなわち、画素位置が1画素分以上ジャンプしたときに、そのジャンプを示す信号SKIPを出力する。この例では、このジャンプを示す信号SKIPを参照することで、次に画素処理クロックCLKのタイミングで処理すべきジャンプした画素位置を知ることができる。この信号SKIPは、FIFOメモリコントローラ111に供給される。
また、比較部108は、加算部106からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1より小さいときに、その旨を示す信号HOLDを出力する。したがって、この信号HOLDを参照することで、読み出し画素を、1画素処理クロックCLKだけ前と同じであることを知ることができる。この信号HOLDは、1ライン分の容量のFIFOラインメモリ112への書き込み及び読み出しを制御するFIFOメモリコントローラ111に供給される。FIFOラインメモリ112は、前述したが、画像メモリ6のメモリ領域の一部を用いても良い。その場合には、FIFOメモリコントローラ111は、メモリインタフェース54内に設けられる。
小数部抽出部109は、加算部106からの出力値X_ADDの小数部を、画素処理クロックCLK毎に抽出し、抽出した小数部の値X_PHASEを出力する。この少数部の値X_PHASEは、水平FIRフィルタ113を備える水平補間処理部114に供給される。水平補間処理部114では、この小数部の値X_PHASEに基づいて乗算係数テーブルを検索し、水平FIRフィルタ113に供給する乗算係数を得るようにする。
整数部抽出部110は、加算部106からの出力値X_ADDの整数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した整数部の値ST_POSを出力する。この整数部の値ST_POSは、現処理ラインの初期x座標としてFIFOメモリコントローラ111に供給される。
FIFOメモリコントローラ111は、入力画像データDinについて、水平処理用FIFOラインメモリ112を用いて、水平手ぶれ補正量SX_ADDとレンズ歪み水平補正量CORR_Xとの加算量の整数部に基づいた補正処理を行なうと共に、水平拡大・縮小処理および水平方向の解像度変換を行なう。ここで、水平処理用FIFOラインメモリ112が、実際に1水平ライン分相当のサイズを必要とするのは、後述するように、画像の部分拡大処理をサポートすることを考慮する場合のみである。
すなわち、FIFOメモリコントローラ111は、入力画像データDinについて、前記整数部の値ST_POSを用いて、出力画像データとして読み出す各水平ラインの画素データの初期x座標を決める。また、FIFOメモリコントローラ111は、信号SKIPおよび信号HOLDを画素処理クロックCLKごとに参照し、水平処理用FIFOラインメモリ112から読み出す画素データを決定するようにする。
そして、FIFOメモリコントローラ111は、以上のようにして読み出した水平ラインの画素データを出力画像データDHimdとして、データイネーブル信号ENと共に、水平補間処理部114に供給する。
水平補間処理部114は、データイネーブル信号ENがイネーブル状態となっているときに入力される画像データを有効データとして、水平FIRフィルタ113を用いて前述したような水平方向の補間処理を実行する。前述したように、このときに水平補間処理部114に入力される小数部の値X_PHASEを用いて、水平FIRフィルタ113に供給する乗算係数が決定されている。
こうして、水平補間処理部114からは、水平手ぶれ補正量SX_ADDとレンズ歪み水平補正量CORR_Xとの加算量に応じて水平方向補正処理がなされると共に、水平方向の拡大・縮小処理および水平方向の解像度変換がなされた画像データDHoutが得られる。このDHoutは、データイネーブル信号ENと共に、メモリインタフェース54を通じて画像メモリ6の第1メモリ領域61に書き込まれる。
ところで、上述の説明では、水平処理用手ぶれ補正量積分部511の水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDの積分処理と、水平画像処理部511の水平拡大・縮小画像処理、水平解像度変換処理の、互いの処理タイミングについて特に触れなかったが、水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDの積分処理を、遅延無しで、水平拡大・縮小画像処理、水平解像度変換処理との単純なシーケンス処理で行なうことが好都合なのは、図17の上側の図17(A)に示すように、垂直方向の部分切り出し及び部分拡大をサポートしない場合にほぼ限られる。図17で、V−SYNCは垂直同期信号を示し、また、ST_TGは、有効走査ラインの開始時点を示している。また、図17で、網掛けを付して示した四角で囲まれた区間は、それぞれの処理区間を示している。
一方、垂直方向の部分切り出し、もしくは部分拡大をサポートする場合、初期y座標SYが非常に大きな値を取り得るため、フレーム先頭の積分処理に、相当長いサイクル数(画素処理サイクル数)を要してしまう可能性がある。図17下側の(B)のシーケンスにおける期間tmがそのための積分期間である。
このようになると、図17上側の(A)のシーケンスでは、最初の拡大・縮小処理が水平同期信号H−SYNCの1周期期間をオーバーしてしまうため、次の水平同期信号H−SYNCで入力されて来る2ライン目の画像データを保持しておくためのラインメモリが必要となる。
そこで、この実施形態では、図17下側の(B)のシーケンスに示すように、水平拡大・縮小画像処理が開始される1水平周期前から積分処理の起動を行ない、常に画像処理に対して、1水平周期だけ先行して積分処理を行なうタイミングおよびシーケンスを採用する。このため、水平処理用FIFOラインメモリ61は、1水平周期分のサイズのものがこの実施形態では用いられている。
上述した問題は、画像の部分拡大等に関わらず、水平処理は常に全入力ラインに対して処理を施す、というアーキテクチャにすれば避けられる。しかし、いずれにしても、図18上側のシーケンスを実現しようとすると、積分処理の終了信号を新たに設け、それを受けて画像処理の起動をかけなければならず、やや煩雑である。つまり、換言すれば、上述したこの実施形態で採用した手法は、既存の画像処理の回路に新たな手を加えないで済む、というメリットがあるのである。
なお、上述した実施形態で採用した手法は、水平同期信号H−SYNCの1周期期間内の画素処理サイクル数よりも、絶対座標系の垂直サイズが大きい場合には採用できない。その場合には、水平処理は常に全入力ラインに対して処理を施すという、上述したアーキテクチャにすれば良い。
[垂直処理ブロック52における処理動作]
[垂直処理用手ぶれ補正量積分部521の積分処理]
次に、垂直処理用手ぶれ補正量積分部521における積分処理動作について説明する。図18は、この垂直手ぶれ補正量SY_ADDを得るための積分処理動作のフローチャートを示すものである。
この垂直処理用手ぶれ補正量積分部521の積分処理動作は、図15を用いて上述した水平処理用手ぶれ補正量積分部511の積分処理動作と類似しているが、次の点が異なる。
すなわち、水平同期信号H−SYNC毎に初期y座標に加算する値が「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_*が、まだ確定前であることを、水平処理の進捗度合いから判断する必要があるのである。
そのための仕組みとして、図18のように、垂直処理の進捗度合いを表わす分割区間値VDIV_CNTが、水平処理の進捗度合いを表わす分割区間値HDIV_CNTを超えてしまっていれば、ウエイトを発行し、図18の左下で、垂直処理における現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である「stb_y」が未確定のままの垂直補正速度成分Y_STB_*が選択された状態で、垂直手ぶれ補正量SY_ADDに加算されるのを防ぐ。
垂直方向の積分処理(図18)が水平方向の積分(図15)と異なる、3つ目の点は、各ラインでの垂直積分が完了したことを表す積分完了信号STB_RDYの生成である。各ライン内で積分を繰り返して行なった結果、そのラインの絶対座標の整数成分vp_iと、そのフレーム内での累積積分回数vstb_cntとが一致したときに、後段の垂直画像処理モジュールに渡すべき垂直オフセットSY_ADDが求められ、それと同時に、後段の垂直画像処理の起動をかけるのが目的である。
既に説明した水平方向の積分処理においては、有効画像が入力されるタイミングよりも1水平同期信号H−SYNC(1水平周期)前から積分処理を開始しておけば、有効画像に対する水平画像処理が始まるまでに積分処理を完了できることが、殆どの場合、システム的に保証可能であるが、垂直方向の積分処理では、前述のウエイトが発生する可能性があるために、直前1水平周期の時間で積分が完了することを、全ての場合において保証するのは不可能だからである。すなわち、ウエイトが発生したときには、垂直積分が完了したことを表す積分完了信号STB_RDYが発生したときに、垂直手ぶれ補正および垂直拡大・縮小処理を含む垂直画像処理を実行するようにする。
以上の機能を有する、この垂直方向の積分回路を適用した垂直方向の積分処理を図18のフローチャートを参照しながら説明する。
まず、初期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)。ここで、図18のステップS26における「stb_y」は、垂直補正速度成分Y_STB_0〜Y_STB_7のいずれかの値である。すなわち、「stb_y」は、現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である。
また、垂直レンズ歪み水平補正量データを、垂直レンズ歪み水平補正量データデコード部122から取得するためには、補正対象部位の画素のy座標だけではなくx座標も必要であり、かつ、当該x座標は、CMOS手ぶれの影響を受けているため、この垂直処理用手ぶれ補正量積分部521においても、水平手ぶれ補正量SX_ADDを積分して得るようにする。
すなわち、ステップS23で発生するトリガTG3ごとに、水平補正速度成分X_STB_0〜Y_STB_7のうちの、現処理ラインが所在する分割画像区間についての水平補正速度成分を加算することにより、積分処理を行ない、水平手ぶれ補正量SX_ADDを得る(ステップS27)。ここで、図18のステップS27における「stb_x」は、水平補正速度成分X_STB_0〜X_STB_7のいずれかの値である。すなわち、「stb_x」は、現処理ラインが所在する分割画像区間についての水平補正速度成分の値である。
ステップS21で、1水平同期信号H−SYNC毎に加算される値「vmag」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG3は、1水平同期信号H−SYNC毎に発生するため、ステップS26では、1水平ライン毎に「stb_y」を加算(積分)し、ステップS27では1水平ライン毎に「stb_x」を加算(積分)するものである。
こうして得られる垂直手ぶれ補正量SY_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの垂直方向の読み出し開始位置の補正量、すなわち、垂直処理ブロック52における垂直方向画像歪み補正処理における各ラインの垂直位置(垂直オフセット)そのものとなる。補正対象部位としての水平ラインの各画素のy座標は、この垂直手ぶれ補正量SY_ADDだけ、垂直方向にシフトされたものとなる。
また、水平手ぶれ補正量SX_ADDは、CMOSイメージャ上での各水平ラインの水平方向の座標シフト量となる。したがって、補正対象部位としての水平ラインの各画素のx座標は、当該水平手ぶれ補正量SX_ADDだけ、水平方向にシフトされたものとなる。
このように、水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDにより、CMOS手ぶれに応じて補正された画素位置の情報は、後述するように、当該画素位置における垂直方向のレンズ歪みを取得するための情報として用いられる。
上述したように、ステップS26およびステップS27では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、垂直補正速度成分Y_STB_0〜Y_STB_7のうちのいずれか1つ、および水平補正速度成分X_STB_0〜X_STB_7のうちのいずれか1つを選択しなければならない。
この例では、分割画像区間分のライン数の加算値vstb_gridが定義される(ステップS28)。この加算値vstb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値vstb_gridと、積分回数vstb_cntとを比較し、積分回数vstb_cntが加算値vstb_gridを超える毎に、トリガTG4を発生する(ステップS29)。そして、トリガTG4が発生するごとに、加算値vstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS30)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG4が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値VDIV_CNTを定義し(ステップS31)、この分割区間値VDIV_CNTを、トリガTG4が発生する毎に、1づつインクリメントする(ステップS32)。すると、分割区間値VDIV_CNTは、現処理ラインが所在する各分割画像区間Pdiv_0〜Pdiv_7のそれぞれに対応して「0」〜「7」の値を取る。すなわち、分割区間値VDIV_CNTは、垂直処理の進捗度合いを示すものとなる。
ステップS6、ステップS7では、この分割区間値HDIV_CNTを参照して、「stb_x」、「stb_y」を決定する。
なお、この例では、分割区間値VDIV_CNT=8のときには、1フレーム分の画像データについての処理が終了したことを意味する。そして、分割区間値VDIV_CNT=8に、「1」が加わると、分割区間値VDIV_CNT=0となるように計算される。
この分割区間値VDIV_CNTは、水平処理ブロック51からの、水平処理の進捗度合いを示す分割区間値HDIV_CNTと比較され、分割区間値VDIV_CNTが分割区間値HDIV_CNTよりも大きくなったときには、水平処理を垂直処理が追い越してしまう状態を意味するので、ウエイト(WAIT)を発生して、トリガTG3の発生を待機させる。すなわち、トリガTG3は、ウエイトが解除された後に発生するように遅延させる(ステップS33)。
そして、この実施形態では、ステップS22で得られるy座標の整数成分vp_iと、積分回数vstb_cntとが等しいかどうかをチェックし、等しければ現処理ラインについての垂直方向の積分が完了したことを示す積分完了信号STB_RDYを生成して出力する(ステップS34)。
この積分完了信号STB_RDYは、垂直画像処理部522に供給される。垂直画像処理部522では、現処理ラインについての垂直方向の手ぶれ補正処理のみを行なうのであれば、この積分完了信号STB_RDYにより、現処理ラインについての垂直方向の手ぶれ補正処理を開始してよいことを認識し、次の水平同期信号H−SYNCのタイミングで垂直画像処理を再開することができる。
しかし、この実施形態では、垂直方向の手ぶれと同時に垂直方向のレンズ歪みを補正するようにしているので、ライン単位のレンズ歪み補正完了信号DIST_RDY(図示せず)を、垂直画像処理部522が発生するようにしており、積分完了信号STB_RDYと、レンズ歪み補正完了信号DIST_RDYとの両方がアクティブになった後の、次の水平同期信号H−SYNCのタイミングで垂直画像処理を再開するようにする。
DIST_RDY信号の遅延は、レンズ歪み補正処理が扱う画像データが、水平処理ブロック51の処理ラインの画像と連動しておらず、場合によっては水平処理ブロックが数10ライン以上先行しないと生成されない画像データであるため、この水平処理の処理待ちのために発生する。
[垂直画像処理部522の処理動作]
図19は、垂直画像処理部522の構成例を示すものである。この図19の例では、前述の図18のフローチャートにおける水平同期信号H−SYNC毎に値「vmag」を加算する加算部201が、この垂直画像処理部522に含まれるものとしており、この垂直画像処理部522に初期y座標SYが入力される。
そして、加算部201からの、垂直同期信号H−SYNC毎に値「vmag」が加算されたy座標値SY´は、垂直処理用手ぶれ補正量積分部521に供給される。すると、この垂直処理用手ぶれ補正量積分部521からは、現処理ラインの先頭のy座標のオフセット値として、垂直手ぶれ補正量SY_ADDが返ってくると共に、現処理ラインのx座標のオフセット値SX_ADDが返ってくる。
垂直画像処理部522では、加算部202において、各水平ラインの先頭で一回だけ、垂直処理用手ぶれ補正量積分部521からの垂直手ぶれ補正量SY_ADDを、y座標SY´に加算する。また、加算部203において、各水平ラインの先頭で一回だけ、垂直処理用手ぶれ補正量積分部521からの水平手ぶれ補正量SX_ADDを、初期x座標SXに加算する。
そして、加算部203の出力値に対して、画素処理クロックCLKごとに、水平拡大・縮小のパラメータである値「hmag」を、加算部204により加算する。この加算部204の出力値vx_addは、レンズ歪み垂直補正量データデコード部122に対する引数としての座標(x、y)データのうちのx座標として供給する。
また、加算部202の出力値vy_addは、レンズ歪み垂直補正量データデコード部122に対する引数としての座標(x,y)データのうちのy座標として供給する。
レンズ歪み垂直補正量データデコード部122からは、これに入力された座標(x,y)の撮像素子上のレンズ歪み垂直補正量データCORR_Yが出力される。このレンズ歪み垂直補正量CORR_Yは、加算部202の出力値vy_addに、画素処理クロックCLKごとに加算部206で加算される。
なお、加算部202からの垂直座標の補正出力値vy_addは、レンズ歪み垂直補正量データデコード部122からレンズ歪み垂直補正量データCORR_Yを得るときの遅延量分の遅延部205を介して加算部206に供給される。
そして、加算部206からの出力値Y_ADDは、小数部抽出部207および整数部抽出部208に供給される。
小数部抽出部207は、加算部206からの出力値Y_ADDの小数部を、画素処理クロックCLK毎に抽出し、抽出した小数部の値Y_PHASEを出力する。この少数部の値Y_PHASEは、垂直FIRフィルタ210を備える垂直補間処理部209に供給される。
垂直FIRフィルタ210は、垂直方向に並ぶ複数ラインの画素データを用いて補間処理を行なうもので、垂直補間処理部209では、この小数部の値Y_PHASEに基づいて乗算係数テーブルを検索し、垂直FIRフィルタ210に供給する乗算係数を得るようにする。これは、補間方向が垂直方向になるだけで、図11〜図13を用いて説明した水平FIRフィルタを用いる水平方向の補間処理とほぼ同様である。
整数部抽出部208は、加算部206からの出力値Y_ADDの整数部を、画素処理クロックCLK毎に抽出し、抽出した整数部の値Y_POSを出力する。この整数部の値Y_POSは、現処理ラインの画素処理クロックCLK毎のy座標としてメモリインタフェース54に供給される。
メモリインタフェース54は、レジスタブロック53に保持されているセパレートアドレスSepAdrを取り込み、第1メモリ領域61と、第2メモリ領域62との分割点アドレスを認識して、第1メモリ領域61のアドレス範囲(書き込み、読み出し領域)を認識し、第1メモリ領域61に対する書き込みおよび読み出しを制御する。
メモリインタフェース54は、水平処理ブロック51からの画像データDHoutを、一旦、画像メモリ6の第1メモリ領域61に書き込む。そして、メモリインタフェース54は、垂直手ぶれ補正量SY_ADDとレンズ歪み垂直補正量CORR_Yとの加算量Y_ADDの整数部Y_POSに基づいて、出力画像データDHout_0〜DHout_nとして出力する複数の水平ラインの画像データを決める。
そして、メモリインタフェース54は、垂直方向の画像処理を開始することができるデータ量の画像データが第1メモリ領域61に書き込まれたら、垂直補間処理部209からの要求信号(ライン要求)REQに応じて、この第1メモリ領域61から、前記整数部Y_POSに基づいて決定された出力画像データDHout_0〜DHout_nを読み出して、垂直補間処理部209に送出する。
垂直補間処理部209では、これに入力された画像データDHout_0〜DHout_nについて、垂直手ぶれ補正量SY_ADDとレンズ歪み垂直補正量CORR_Yとの加算量Y_ADDの少数部Y_PHASEに基づいて、垂直FIRフィルタ210を用いて垂直方向の補間処理を行なって、垂直方向の手ぶれ補正およびレンズ歪み補正処理を行なうと共に、垂直拡大・縮小処理、垂直解像度変換処理を行なう。前述したように、このときに垂直補間処理部209に入力される小数部の値Y_PHASEを用いて、垂直FIRフィルタ210に供給する乗算係数が決定されている。
こうして、垂直補間処理部209からは、垂直手ぶれ補正量SY_ADDとレンズ歪み垂直補正量CORR_Yとの加算量に応じて垂直方向補正処理がなされると共に、垂直方向の拡大・縮小処理、垂直方向の解像度変換がなされた画像データDYoutが得られる。
この画像データDYoutは、データイネーブル信号ENと共に、メモリインタフェース54に送られる。メモリインタフェース54は、この画像データDYoutを第2メモリ領域62に書き込む。
そして、メモリインタフェース54は、画像データ出力処理部523からの要求信号REQに応じて、例えば、元の画像データのタイミングからみると、1垂直周期遅れたタイミングで、第2メモリ領域62から画像データを読み出して、画像データ出力処理部523に出力画像データDoutとして出力する。
次に、図20に、上説明した垂直方向の積分処理と、その後段の垂直画像処理のタイミング関係を示す。
垂直方向の部分切り出し、垂直方向の部分拡大・縮小のいずれもサポートしない場合には、前述したウエイト(WAIT)は発生せず、現処理ラインについての垂直方向の積分回数の上限は高々数回である。このため、同一のラインに対する積分処理と画像処理の両方を、同じ1水平同期信号H−SYNC期間内でシーケンス化可能である。したがって、この場合には、わざわざ積分完了信号STB_RDYを導入する必要はない。
一方、垂直方向の部分切り出し、もしくは垂直方向の部分拡大をサポートする場合には、1ライン目の積分処理の途中でウエイトが発生する可能性があり、縮小をサポートする場合には、どこか途中の水平ラインでウエイトが発生する可能性がある。そこで、積分完了信号STB_RDYがアクティブ(図20の例ではハイレベル)になるのを待つ必要がある。さらに、この実施形態の垂直処理ブロックでは、レンズ歪み補正も同時に行うので、レンズ歪み垂直補正完了信号DIST_RDYも、アクティブ(図20の例ではハイレベル)になるのを待って、次の水平ラインの処理のトリガとして、垂直処理用の水平同期信号H−SYNCが生成される。
すなわち、図20に示すように、垂直方向の部分切り出し、もしくは垂直方向の部分拡大のいずれの場合でも、同一ラインの積分処理が、ウエイトによって数水平同期信号H−SYNC区間もしくはそれ以上に渡って中断されるため、積分処理が終了したことを後段に知らせるための積分完了信号STB_RDYが必要となる。
そして、図20に示すように、レンズ歪み垂直補正処理が終了しないと次のラインの処理に移行できないため、レンズ歪み垂直補正完了信号DIST_RDYが、積分完了信号STB_RDYがアクティブになるのに加えて、アクティブになったときに、垂直処理終了信号を出し、その後の水平同期信号H−SYNCのタイミングから、垂直画像処理を次のラインの画像データの処理を行なうようにする。
また、同時に、あるラインの垂直画像処理が完了していない場合には、次の水平同期信号H−SYNCを、図20において点線で示すように、マスクするようにする。すなわち、垂直処理終了信号が立たない限り、水平ライン開始処理トリガとしての水平同期信号H−SYNCは、マスクされる。
[画像メモリ6のメモリアクセス制御および容量]
次に、以上説明した画像処理における画像メモリ6に対する書き込み、読み出しのアクセス制御および画像メモリ6の第1メモリ領域61および第2メモリ領域62として必要な容量について、さらに説明する。
この実施形態の撮像装置は、動作モードとして、
(a)動画撮影モード
(b)モニタリングモード(静止画記録の画枠を決定する際などに、モニター用表示画面に表示される映像を生成するモード)
(c)静止画記録モード
(d)静止画再生モード
などがある。
動画撮影モードには、HD(High Definition;高精細度)動画撮影モードと、SD(Standard Definition)動画撮影モードとがある。
静止画記録モードやHD動画撮影モードの場合には、出力画像解像度が大容量となるので、画像メモリ6は、1つのメモリ領域として動作させるようにする。一方、SD動画撮影モードやモニタリングモード、さらに静止画再生モードの場合には、出力画像解像度が比較的小さくなるので、上述したように、画像メモリ6を論理的に2分割して使用するようにする。
図21は、画像メモリ6を論理的に2分割して使用するようにした上述の画像処理の全体の流れを示す図である。
すなわち、入力撮像画像信号は、水平画像処理部512で上述したような水平方向の画像処理がなされ、その水平方向画像処理結果が、画像メモリ6の第1メモリ領域61の4つのバンクBANK0〜BANK3に書き込まれる。この水平方向画像処理結果の、画像メモリ6の4つのバンクBANK0〜BANK3への書き込みは、メモリインタフェース54の制御部541が制御する。
この第1メモリ領域61に書き込まれた水平方向画像処理結果は、垂直画像処理部522からの要求に応じて、メモリインタフェース54の制御部542の制御にしたがい読み出されて、垂直画像処理部522に供給され、垂直画像処理が実行される。
そして、垂直画像処理部522で上述したような垂直方向の画像処理がなされ、その垂直方向画像処理結果が、画像メモリ6の第2メモリ領域62の4つのバンクBANK0〜BANK3に書き込まれる。この垂直方向画像処理結果の、画像メモリ6の4つのバンクBANK0〜BANK3への書き込みは、メモリインタフェース54の制御部543が制御する。
そして、この第2メモリ領域62に書き込まれた垂直方向画像処理結果は、画像データ出力処理部523からの要求に応じて、メモリインタフェース54の制御部544の制御にしたがい読み出されて、画像データ出力処理部523に供給され、出力撮像画像信号が生成されて出力される。
以上のように、この実施形態では、メモリインタフェース54は、水平方向処理後の画像データの書き込み制御部541と、垂直方向処理のための画像データの読み出し制御部542と、垂直方向処理後の画像データの書き込み制御部543と、画像データ出力のための読み出し制御部544を備える。
したがって、メモリインタフェース54の4個の制御部541〜544による画像メモリに対するアクセスを調停する必要がある。また、上述のように、この実施形態では、画像メモリ6は、4個のバンクBANK0〜BANK3からなっているので、この4個のバンクBANK0〜BANK3に対する書き込みおよび読み出し制御も必要である。そこで、画像メモリ6に対する画像の書き込みおよび読み出しについて、さらに、図22を参照しながら詳細に説明する。
図22に示すように、メモリインタフェース54は、前述した4個の制御部541〜544を備えると共に、これら制御部541〜544からの要求(リクエスト)REQを調停するための調停部545を備える。
この調停部545は、制御部541〜544からのリクエストREQを受けたとき、それがいずれの制御部541〜544からのリクエストREQであるかを判別する。そして、調停部545は、4個の制御部541〜544からのリクエストREQについて予め定められた優先順位にしたがって、各制御部541〜544からのリクエストREQを調停する。
この実施形態では、この優先順位の決定に際しては、画像データの書き込みよりも読み出しを優先し、さらに、それぞれの書き込み/読み出し処理が複雑であればあるほど優先するものとする。
したがって、この実施形態では、
優先度第1位;垂直方向処理のための画像データの読み出し(制御部542)
優先度第2位;画像データ出力のための読み出し(制御部544)
優先度第3位;水平方向処理後の画像データの書き込み(制御部541)
優先度第4位;垂直方向処理後の画像データの書き込み(制御部543)
というように優先順序付けをする。
そして、この実施形態では、画像データの画像メモリ6への読み書き単位は、1画素分単位ではなく、複数画素分単位、この例では、8画素分単位として、水平方向の8画素を、1メモリサイクルでアクセスするメモリ・アーキテクチャーである。
この実施形態では、画像データの輝度成分Y、色差成分CrおよびCbとは標本化周波数比が、4:1:1とされているので、8画素分が最適である。もっとも、画像データの輝度成分Y、色差成分CrおよびCbとは標本化周波数比が、4:1:1でない場合であっても、水平方向の8画素分を読み書き単位としても、勿論良い。
なお、この実施形態では、輝度成分Yは8ビット、色差成分CrおよびCbはそれぞれ2ビットとされ、1画素は12ビットとなる。したがって、8画素分単位では、96ビット単位で書き込みがなされることになる。
したがって、この実施形態では、各制御部541〜544は、8画素分の画像データが取得(パッキング)できるまで画像データのバッファリングを行なう。
図22に示すように、水平処理ブロック51の水平方向処理の書き込みにおいては、水平処理ブロック51からは、有効画素データであることを示すデータイネーブル信号ENと共に、当該有効画素データData(12ビット/画素)が、画素クロックCLKに同期して制御部541に出力される。同様に、垂直処理ブロック52の垂直方向処理の書き込みにおいては、垂直処理ブロック52からは、有効画素データであることを示すデータイネーブル信号ENと共に、当該有効画素データData(12ビット/画素)が、画素クロックCLKに同期して制御部543に出力される。
例えば、水平処理ブロック51の水平方向処理の書き込みあるいは垂直処理ブロックの垂直方向処理の書き込みにおいて、画素クロックCLK(図23(A)参照)に同期して、データイネーブル信号EN(図23(B)参照;ハイレベルがアクティブ)と、画像データの輝度成分Yi(i=0,1,2・・・)(図23(C)参照)および色差成分Cr0,4・・・、Cb0,4・・・)(図23(D)参照)が出力されたときには、制御部541あるいは制御部543は、破線で囲んで示す8画素分を取得するまで待って、8画素分取得したら書き込みのリクエストREQ(図23(E)参照)を、調停部545を通じて画像メモリ6に送出する。
したがって、画像メモリ6の第1メモリ領域61あるいは第2メモリ領域62には、画像データは、8画素分(96ビット)単位で書き込みがなされる。
また、書き込み制御部541および543は、画像データを、1バンクごとに行なう。そして、書き込み制御部541および543は、所定データ長単位、この例では、1ライン単位で、バンクを順次に切り換えて書き込むようにする。
例えば図24の左側に示すように、水平方向処理後の画像空間のうちの垂直方向処理対象領域の画像データを、画像メモリ6の第1メモリ領域61の4個のバンクBANK0〜BANK3に書き込む場合、その書き込みは、図24の右側に示すようになる。
すなわち、書き込み制御部541は、先ず、最初の1ラインの画像データを、8画素分単位で、バンクBANK0に書き込む。次に、当該最初の1ラインの画像データのバンクBANK0への書き込みが終了すると、2番目のラインの画像データは、バンクBANK1に、8画素分単位で書き込む。そして、この2番目の1ラインの画像データのバンクBANK1への書き込みが終了すると、3番目のラインの画像データは、バンクBANK2に、8画素分単位で書き込む。さらに、この3番目の1ラインの画像データのバンクBANK2への書き込みが終了すると、4番目のラインの画像データは、バンクBANK3に、8画素分単位で書き込む。
そして、この4番目の1ラインの画像データのバンクBANK3への書き込みが終了すると、次の5番目のラインの画像データは、バンクBANK0に戻って、8画素分単位で書き込む。以下、同様にして、1ライン毎に、バンクを切り換えながら、画像データの書き込みを行なう。
そして、図24にも示したように、4バンク構成の画像メモリ6の各バンクBANK0〜4では、上述のようなラインメモリ動作をしながら、FIFOメモリ(リングメモリ)動作を行なう。
これに対して、画像メモリ6からの画像データの読み出しは、複数バンクごとに行なう。つまり、複数のバンクからの画像データを同時に読み出すようにする。
すなわち、この実施形態では、垂直方向処理のための画像データの読み出し制御部542は、図25(A)に示すように、画像メモリ6の4バンクBANK0〜3のすべてから、合計4ライン分を同時に読み出すようにする。つまり、制御部542は、画素クロックCLKの1周期に対応する1メモリサイクルで、垂直方向の4ラインの4画素を読み出し、1ライン分の読み出し区間で、4ラインの画素データを読み出すようにする。次の1ライン分の読み出し区間では、次の4ラインの画素データを読み出すようにする。
また、画像データ出力のための読み出し制御部544は、図25(B)に示すように、画像メモリ6の4バンクBANK0〜3のうちの、2個づつから、それぞれ1ライン分、合計2ライン分を同時に読み出すようにする。つまり、制御部544は、画素クロックCLKの1周期に対応する1メモリサイクルで、垂直方向の2ラインの2画素を読み出し、1ライン分の読み出し区間で、2ライン分の画素データを読み出すようにする。
そして、図25(B)に示すように、この例では、制御部544は、バンクBANK0,1の組と、バンクBANK2,3の組とを、順次に、1ライン分の読み出し区間毎に切り換えて読み出しを実行する。
また、この実施の形態では、上述したように、画素クロックCLKの1サイクルが、1メモリアクセスサイクルとなるが、4個の制御部541〜544による書き込みアクセスおよび読み出しアクセスを1セットとして、その1セットを実行する区間をアクセス権周期区間としたとき、このアクセス権周期区間は、複数メモリサイクル(書き込み、読み出しの制御部の数以上のサイクル数)からなり、このアクセス権周期区間を繰り返すことにより、画像メモリ6に対する書き込み/読み出しがなされて、画像データがリアルタイム処理されるようにしている。
この実施形態では、アクセス権周期区間は、8メモリサイクル(8クロックサイクル)を1周期としている。そして、各制御部541〜544のメモリアクセス権は、前述した各制御部についてのアクセスについての優先順位と同様の考えから、1処理アクセス周期内で、
制御部541のアクセス権は、1回
制御部542のアクセス権は、最低2回、最大5回
制御部543のアクセス権は、1回
制御部544のアクセス権は、1回
を割り当てるようにしている。
この場合に、アクセス権周期区間である8クロックサイクル区間の各々の1クロックサイクル区間で、制御部541〜544のいずれかから、必ず、リクエストREQが発生するわけではなく、リクエストREQが発生しない場合もある。
また、同じ1クロックサイクル区間で、複数の制御部からのリクエストREQが重なる場合もある。その場合には、前述した各制御部541〜544に割り当てられた優先順位意したがって、調停部545が、そのアクセス権をどれに割り付けるかを決定して調停するようにする。
図26の例では、1アクセス権周期区間において、始めの2クロックサイクル区間では、制御部542からの読み出しリクエストのみが発生しているので、調停部545は、アクセス権を制御部542に渡し、垂直方向処理のための画像データの読み出し制御が実行されるようにする。
次の、3番目のクロックサイクル区間では、制御部542からの読み出しリクエストと、制御部544からの読み出しリクエストとが重なって発生するが、優先順位に従い、調停部545は、この3番目のクロックサイクル区間も、アクセス権を制御部542に渡し、垂直方向処理のための画像データの読み出し制御が実行されるようにする。
そして、次の4番目のクロックサイクル区間では、制御部543からの書き込みリクエストが発生するが、3番目のクロックサイクル区間で実行できなかった制御部544からの読み出しリクエストの方が優先順位が高いので、調停部545は、アクセス権を制御部544に渡し、出力画像データの読み出し処理が実行されるようにする。
次の5番目のクロックサイクル区間では、制御部541からの書き込みリクエストが発生し、この制御部541の方が制御部543よりも優先順位が高いので、調停部545は、アクセス権を制御部541に渡し、水平方向処理後の画像データの書き込みを実行させるようにする。
次の6番目および7番目のクロックサイクル区間では、最先優先順位である制御部542のリクエストが発生するので、調停部545は、この6,7番目のクロックサイクル区間は、アクセス権を制御部542に渡し、垂直方向処理のための画像データの読み出し制御が実行されるようにする。
最後の8番目のクロックサイクル区間では、何れの制御部からもリクエストが発生していないので、実行されずに残っている制御部543のリクエストに対する要求に答えるために、調停部545は、アクセス権を制御部543に渡し、垂直方向処理後の画像データの書き込みを実行させるようにする。
以上のように、アクセス権周期区間において、上述のようなアクセス権調停を行なうと共に、上述のような、複数バンクに対する書き込み、読み出しを制御することにより、リアルタイムで、手ぶれ補正、レンズ歪み補正および解像度変換などの画像処理が可能となる。各制御部541〜544では、データはパイプライン処理されており、図26に示したような8サイクルで、全ての制御部541〜544の8画素分のアクセスを実現することにより、リアルタイムで歪み補正かつ解像度変換が可能となる。
例えば、画像処理として図27に示すように、撮像素子2の全有効画素領域AFLのうちの、解像度変換用の有効画素領域FLkから、横×縦=720画素×240画素の出力画像に解像度変換する場合を想定し、この場合における、画像メモリ6の第1メモリ領域61および第2メモリ領域62における画像データの書き込み、読み出しの様子を図28に示す。
すなわち、撮像素子2からの入力撮像画像信号は、水平画像処理部512において、上述のような水平方向の画像処理がなされた後、画像メモリ6の第1メモリ領域61に書き込まれる。
このとき、第1メモリ領域61は、前述したように、垂直画像処理が開始できるだけの容量+マージン分の記憶容量を備えるもので、1画面分(1フィールド分または1フレーム分)よりも少なくてよく、垂直FIRフィルタのタップ数に応じた複数ライン分以上であれば良い。
したがって、入力撮像画像信号(図28(C))の1画面分は、水平方向の画像処理がなされた後、第1メモリ領域61に対して、図28(A)において実線で示すようにして、1垂直周期の間で複数回書き込まれることになる。第1メモリ領域61に書き込まれた水平処理後の画像信号は、図28(D)のように入力撮像画像信号よりも遅延したものとなる。この実施形態では、この遅延は、上述したように、1ライン分FIFOメモリ112によるものとされている。
そして、1画面分の画像データの第1メモリ領域61への初回の書き込みが終了してから、垂直方向の画像処理が開始可能なデータ量が第1メモリ領域61に書き込まれると、次の第1メモリ領域61への書き込みが始まる前に、図28(A)において太い点線で示すように、この第1メモリ領域61から、先に書き込まれた画像データの読み出しが開始される。
そして、第1メモリ領域61から読み出された撮像画像データは、垂直画像処理部522で、垂直方向の画像処理がなされた後、図28(A)において、1点鎖線で示すようにして、第2メモリ領域62に書き込まれる。したがって、第2メモリ領域62に書き込まれた垂直処理後の画像信号は、図28(E)のように遅延したものとなる。この実施形態では、この遅延は、上述したように、垂直FIRフィルタのタップ数に応じてものとされている。
こうして、入力撮像画像信号の1画面分は、第1メモリ領域61に対して複数回読み書きされながら、垂直方向の画像処理がなされ、その垂直方向画像処理結果が、第2メモリ領域62に書き込まれてゆく。そして、1垂直周期経過すると、図28(A)において、2点鎖線で示すようにして、次の垂直同期信号(図28(B)参照)の時点から、第2メモリ領域62から前記垂直方向画像処理結果が、次の画像データの第2メモリ領域62への書き込みに先立ち、読み出される。すなわち、読み出された出力画像データは、図28(F)に示すようなタイミングで出力される。
以下、上述の処理が、撮像画像データの1画面分単位で、順次に繰り返され、入力撮像画像データは、上述のような画像処理が施された後、1垂直周期遅れで、垂直同期信号および水平同期信号に同期した状態で出力画像データとされる。
この場合、第1メモリ領域61は、リングバッファメモリとしてFIFO動作により読み書きがなされる。図28の例では、1画面分の画像データは、第1メモリ領域61において、2回、折り返されて書き込まれ、また、読み出されるようにされている。
以上の説明は、垂直同期信号を跨ぐことなく、垂直同期信号区間で、画像メモリ6への書き込み、読み出しが行なわれる場合であるが、画像の部分拡大を行なう場合には、その処理区間が垂直同期信号を跨ぐことがある。しかし、出力画像信号は、1垂直周期遅れで出力されるので、出力画像信号としては同期規格を満たしており、問題とはならない。
すなわち、例えば画像処理として図29に示すように、撮像素子2の解像度変換用の有効画素領域FLkのうちの、例えばユーザにより指定された部分拡大領域を、電子ズーム処理により拡大して、横×縦=720画素×240画素の出力画像に解像度変換する場合を想定し、この場合における、画像メモリ6の第1メモリ領域61および第2メモリ領域62における画像データの書き込み、読み出しの様子を図30に示す。
この場合、撮像素子2からの入力撮像画像信号(図30(C))のうちの部分拡大領域に対応する部分の信号は、水平画像処理部512において処理された後、図30(A)において実線で示すようにして、第1メモリ領域61に書き込まれる。図30(D)の水平処理後画像信号においては、当該書き込まれた画像部分は、網点を付して示している。
第1メモリ領域61に、部分拡大領域の画像データが、垂直画像処理が可能なデータ量分以上書き込まれると、当該書き込まれた部分拡大領域の画像データが、図30(A)において太い点線で示すように、第1メモリ領域61から読み出されて、垂直画像処理がなされる。そして、垂直画像処理後の画像データは、図30(A)において、1点鎖線で示すようにして、第2メモリ領域62に書き込まれる。したがって、垂直処理後の画像信号は、図30(E)のように、垂直同期信号を跨いだ区間で、第2メモリ領域62に書き込まれる。
そして、図30(A)において、2点鎖線で示すようにして、当該跨いだ垂直同期信号(図30(B)参照)の時点から、第2メモリ領域62から前記垂直方向画像処理結果が、次の画像データの第2メモリ領域62への書き込みに先立ち、読み出される。すなわち、読み出された出力画像データは、図30(F)に示すようなタイミングで出力される。
次に、画像メモリ6の第1メモリ領域に必要な容量について説明する。前述したように、第1メモリ領域61として必要な容量は、垂直解像度変換や補間処理のための垂直FIRフィルタのタップ数、電子ズーム率、レンズ歪み補正率、手ぶれ補正率に応じて変化する。
第1メモリ領域61の容量の決定方法を、図31のフローチャートを参照しながら説明する。この実施形態の撮像装置は、手ぶれ補正の有無、電子ズームの有無、レンズ歪み補正の有無を、ユーザが選択設定できるようにしており、それらのユーザ選択設定に応じて、第1メモリ領域61の容量が変更決定される。このフローチャートの処理は、制御部10で、ユーザインターフェース9を通じたユーザ入力された選択設定情報に基づいてなされる。
図31においては、先ず、手ぶれ補正無しに設定されているかどうか判別する(ステップS101)。手ぶれ補正無しではなく、手ぶれ補正有りに設定されているときには、電子ズーム無しに設定されているかどうか判別する(ステップS102)。そして、このステップS102で、電子ズーム有りに設定されていると判別したときには、制御部10は、電子ズーム率(最大電子ズーム倍率)と、手ぶれ補正率(どの程度の大きさの手ぶれ補正までを補正することが可能であるかの率)とを考慮した容量MAに、第1メモリ領域61の記憶容量を設定する(ステップS103)。すなわち、第1メモリ領域61の記憶容量が、メモリ容量MAに設定されるように、セパレートアドレスSepAdrを決定し、レジスタブロック53のセパレートアドレスSepAdrを設定すべきレジスタに設定する。
このステップS103では、電子ズーム率と手ぶれ補正率とを考慮した場合において、最も容量を必要とする条件での容量を設定容量MAとすればよい。手ぶれ補正有り、電子ズーム有りというモードにおいて、最も容量を必要とする条件は、図32に示すように、「(n−1)フィールドで、手ぶれ補正範囲を含む入力画像最下段を拡大」を行ない、続いて「nフィールドで入力画像最上段を含む、第1メモリ領域61の容量を超えるライン数からの拡大」を行なうときである。
(n−1)フィールドで、手ぶれ補正を含む入力画像最下段を、出力画像信号として拡大すると、入力垂直同期Vを跨いで垂直方向処理用のデータ読み出しが行なわれ、さらに入力画像の最下段の処理であることから、読み出し開始が最も遅れる。そのとき、nフィールドの垂直方向読み出し処理は待ち状態となるが、nフィールドの最上段の処理を行なう場合は、その待ち時間分の入力画像を保存しておく必要があり、必要ラインメモリが増加する。また、水平方向処理結果の画像データの書き込みが、垂直方向処理のための画像データの読み出しを追い越してはならないため、必要とされる電子ズーム率、手ぶれ補正率を満足するようにラインメモリ数に、第1メモリ領域61の容量を設定する必要があるのである。
この場合における、画像メモリ6の第1メモリ領域61および第2メモリ領域62における画像データの書き込み、読み出しの様子を図33に示す。
この場合、撮像素子2からの入力撮像画像信号(図33(C))のうちの部分拡大領域に対応する部分の信号は、水平画像処理部512において処理された後、図33(A)において実線で示すようにして、第1メモリ領域61に書き込まれる。図33(D)の水平処理後画像信号においては、当該書き込まれた画像部分は、網点を付して示している。
第1メモリ領域61に、(n−1)フィールドの部分拡大領域の画像データが、垂直画像処理が可能なデータ量分以上書き込まれると、当該書き込まれた部分拡大領域の画像データが、図33(A)において太い点線で示すように、第1メモリ領域61から読み出されて、垂直画像処理がなされる。そして、垂直画像処理後の画像データは、図33(A)において、1点鎖線で示すようにして、第2メモリ領域62に書き込まれてゆく。したがって、垂直処理後の画像信号は、図33(E)のように、垂直同期信号を跨いだ区間で、第2メモリ領域62に書き込まれる。
このため、nフィールドの部分拡大領域の画像データ部分になると、図33(A)において、実線で示すように、当該画像データの水平方向画像処理がなされ、その処理結果の第1メモリ領域61への書き込みが開始される。そして、セパレートアドレスSepAdrのところで、折り返されて、nフィールドの部分拡大領域の画像データの全てが第1メモリ領域61に書き込まれる。
このnフィールドの画像データの水平処理結果の書き込み時にも、(n−1)フィールドの部分拡大領域の水平処理結果の画像データの読み出しが行なわれるので、この読み出しを、nフィールドの部分拡大領域の水平処理結果の画像データの書き込みが追い越してしまわないようにしなければならず、そのようにするために、第1メモリ領域61の容量が設定されるものである。
そして、第2メモリ領域への垂直処理結果の画像データの書き込みが完了すると、図33(A)において、2点鎖線で示すようにして、第2メモリ領域62から前記垂直方向画像処理結果が、次の画像データの第2メモリ領域62への書き込みに先立ち、読み出される。すなわち、読み出された出力画像データは、図33(F)に示すようなタイミングで出力される。
以上のように、(n−1)フィールドで、手ぶれ補正を含む入力画像最下段を、拡大画像の出力信号にしようとすると、入力同期Vを跨いで垂直方向処理用のデータ読み出しが行われ、さらに入力画像の最下段の処理であることから、読み出し開始が最も遅れる。
その時、次フィールドであるnフィールドの垂直方向読み出し処理は、待ち状態となるが、nフィールドの最上段の処理を行なう場合は、その待ち時間分の入力画像を保存しておく必要があり、必要ラインメモリが増加する。また、図33に示したように、水平方向処理結果の画像データの第1メモリ領域61への書き込みが、当該第1メモリ領域61からの垂直方向処理のための画像データの読み出しを追い越してはならないため、必要とされる電子ズーム率、手ぶれ補正率を満足するようなラインメモリ数分の記憶容量MAを設定する必要がある。
次に、ステップS101で、手ぶれ補正なしであると判別したときには、制御部10では、電子ズームなしであるかどうか判別し(ステップS104)、電子ズーム有りであると判別したときには、手ぶれ補正無しであるので、電子ズーム率のみを考慮した容量MBを、第1メモリ領域61の容量として設定する(ステップS105)。すなわち、第1メモリ領域61の記憶容量が、メモリ容量MBに設定されるように、セパレートアドレスSepAdrを決定し、レジスタブロック53のセパレートアドレスSepAdrを設定すべきレジスタに設定する。
この場合の容量MBは、図34に示すように、「(n−1)フィールドの中心部分の拡大電子ズーム処理」を行ない、続いて「nフィールドで、通常の解像度変換処理」を行なうときを考慮して設定すればよい。この場合は、手ぶれ補正が行なわれないため、その分、垂直方向処理の読み出しを早く実行でき、垂直方向処理の入力垂直同期Vを跨いで処理する時間が短くなる。そのため、上述のステップS103の場合と比べて、第1メモリ領域61の容量を小さくできる。
この場合における、画像メモリ6の第1メモリ領域61および第2メモリ領域62における画像データの書き込み、読み出しの様子を図35に示す。
この場合、撮像素子2からの入力撮像画像信号(図35(C))のうちの部分拡大領域に対応する部分の信号は、水平画像処理部512において処理された後、図35(A)において実線で示すようにして、第1メモリ領域61に書き込まれる。図35(D)の水平処理後画像信号においては、当該書き込まれた画像部分は、網点を付して示している。
第1メモリ領域61に、(n−1)フィールドの部分拡大領域の画像データが、垂直画像処理が可能なデータ量分以上書き込まれると、当該書き込まれた部分拡大領域の画像データが、図35(A)において太い点線で示すように、第1メモリ領域61から読み出されて、垂直画像処理がなされる。そして、垂直画像処理後の画像データは、図35(A)において、1点鎖線で示すようにして、第2メモリ領域62に書き込まれてゆく。したがって、垂直処理後の画像信号は、図35(E)のように、垂直同期信号を跨いだ区間で、第2メモリ領域62に書き込まれる。
このため、次フィールドであるnフィールドの画像データ部分になると、図35(A)において、実線で示すように、当該画像データの水平方向画像処理がなされ、その処理結果の第1メモリ領域61への書き込みが開始される。そして、セパレートアドレスSepAdrのところで、折り返されて、nフィールドの部分拡大領域の画像データの全てが第1メモリ領域61に書き込まれる。
このnフィールドの画像データの水平処理結果の書き込み時にも、(n−1)フィールドの部分拡大領域の水平処理結果の画像データの読み出しが行なわれるので、この読み出しを、nフィールドの部分拡大領域の水平処理結果の画像データの書き込みが追い越してしまわないようにしなければならず、そのようにするために、第1メモリ領域61の容量が設定されるものである。
そして、第2メモリ領域への垂直処理結果の画像データの書き込みが完了すると、図35(A)において、2点鎖線で示すようにして、第2メモリ領域62から前記垂直方向画像処理結果が、次の画像データの第2メモリ領域62への書き込みに先立ち、読み出される。すなわち、読み出された出力画像データは、図35(F)に示すようなタイミングで出力される。
次に、ステップS104で、電子ズーム有りであると判別したときには、制御部10では、レンズ歪み補正無しかどうか判別する(ステップS106)。ステップS102で、電子ズーム有りであると判別したときにも、このステップS106に進み、レンズ歪み補正無しかどうか判別する。
ステップS106で、レンズ歪み補正有りと判別したときには、制御部10は、図36に示すようなレンズ歪みの最大歪み量を見込んだライン数に対応できるメモリ容量MCに、第1メモリ領域61の記憶容量が設定されるように、セパレートアドレスSepAdrを決定し、レジスタブロック53のセパレートアドレスSepAdrを設定すべきレジスタに設定する(ステップS107)。
すなわち、レンズ歪みの補正をするときには、注目するラインを処理するためには、最大歪み分のライン数のデータが確保されている必要があるからである。このステップS107では、手ぶれ補正、電子ズームを行なわないため、垂直方向処理が入力垂直同期Vを跨ぐことがないことから、上書きを考慮する必要はない。よって、最大歪み分のラインメモリで対応できる。
最後に、ステップS106で、レンズ歪み補正無しと判別したときには、制御部10は、解像度変換のみを考慮して、垂直解像度変換フィルタとしての垂直FIRフィルタのタップ数分のラインメモリ容量として、第1メモリ領域61の記憶容量MDを設定する(ステップS108)。すなわち、第1メモリ領域61の記憶容量が、メモリ容量MDに設定されるように、セパレートアドレスSepAdrを決定し、レジスタブロック53のセパレートアドレスSepAdrを設定すべきレジスタに設定する。
この場合、垂直解像度変換は、図52に示したように、垂直解像度変換処理前の画像の複数ラインから、垂直FIRフィルタを用いて、垂直解像度変換後の画像の1ラインの画像データを得るようにするものである。垂直解像度変換処理前の画像についての、ある要求ラインに対して、垂直解像度変換結果の1ラインを得るために垂直FIRフィルタで用いる垂直解像度変換処理前の画像の複数ラインは、垂直FIRフィルタのタップ数分である。よって、この複数ライン数分が、第1メモリ領域61に蓄積されると、垂直解像度変換を行なうことできるので、第1メモリ領域61の容量は、垂直FIRフィルタのタップ数分のライン数分である容量MDでよい。実際には、容量MDは、垂直FIRフィルタのタップ数分のライン数分の容量に、マージン分を付加した容量とする。
以上のようにして、第1メモリ領域61の容量が決定されるが、この図31のフローチャートの処理と同様にして、各モードや、手ぶれ補正の有無、レンズ歪み補正の有無、電子ズームの有無などの条件に応じて、予め、レジスタに容量MA,MB,MC,MDを記憶しておき、前記条件を制御部10が判断して、その判断結果に基づいて、適切なレジスタから第1メモリ領域61の容量を読み出して、セパレートアドレスを設定するようにしても良い。レジスタに容量MA,MB,MC,MDを記憶しておくのではなく、セパレートアドレスSepAdrの値をレジスタブロック53に予め設定しておき、それを必要に応じて読み出して、画像メモリ6のメモリ領域を分割するようにしても良い。
なお、この実施形態では、撮像装置の制御部10がユーザの入力選択設定情報に応じて、画像メモリ6の第1メモリ領域の大きさをダイナミックに変更するようにしたが、撮像装置の設計に当たって、電子ズームを設けるか、設けるとしたらどの程度のズーム率にするか、手ぶれ補正をつけるか、つけるとしたらどのくらいの大きさの手ぶれ補正を可能とするか、レンズ歪み補正を付けるか、付けるとしたらどの程度の補正率とするか、などを考慮して、固定的にセパレートアドレスSepAdrを設定する場合にも、図31のフローチャートと同様の手順により、メモリ領域61,62の大きさを決定するようにするものである。
次に、この実施形態の撮像装置における画像メモリ6として必要となるメモリ容量について、全画面縮小を例に挙げて説明する。ここで、全画面縮小とは、入力画像を部分切り出しするのではなく、入力画像全範囲から、必要な解像度の出力画像信号に変換する処理である。
この場合、画像の水平方向サイズをXピクセル(pixel=画素)、垂直サイズをYピクセル(pixel=画素)、1画素あたりの情報量を、Zビットとした時、保存するために必要となるメモリ容量は、
SUMmem=X×Y×Z(ビット)
となり、出力画像信号を、4:1:1の輝度信号、色差信号を持つNTSC(National Television System Committee)方式のSD画像とした場合、第2メモリ領域62で必要とする容量は、
SUMmem2=720×240×12=約2.0(メガビット)
となる。
次に、第1メモリ領域61において必要となる容量は、上で述べたように、垂直解像度変換のタップ数、手ぶれ補正範囲、電子ズーム率、電子歪み補正率などによって変化する。最もその容量を必要とする条件は、手ぶれ補正範囲を撮像素子の全有効画素領域に指定、電子ズーム率の限界として垂直タップ数の垂直サイズから出力画像信号サイズへの拡大を網羅、電子手ぶれ補正あり、とした場合であり、この場合に、第1メモリ領域61に必要な容量は、
SUMmem1=約2.0(メガビット)(実績値)
となる。
したがって、必要メモリ容量の合計は
SUMall=SUMmem1+SUMmem2=2.0+2.0=約4.0(メガビット)
となる。第2メモリ領域62には、解像度変換後の全データを書き込むため、入力画像サイズに関わらず、2.0(メガビット)となる。
一方、冒頭で説明した図49、図51の従来手法の場合は、入力画像サイズを、1152ピクセル×864ピクセル(1メガサイズ)とすると、SD画像は、それぞれ、
SUMall=1152×864×12=約11.0(メガビット)
SUMall=720×864×12=約7.0(メガビット)
となる。
したがって、上述したこの実施形態の場合には、従来手法に対して、画像メモリの必要メモリ容量を、それぞれ 40%、60%に削減できる。ここでは、1メガサイズの画像についてその効果を述べたが、入力サイズが増加しても、この実施形態では、必要メモリ容量が増加しないことから、入力サイズが増大するにつれて、その効果がより顕著となる。
[画像メモリ6の読み書きタイミング制御]
上述したように、この実施形態では、第1メモリ領域61には、水平方向の画像処理結果の画像データは1画面分の全てを書き込むのではなく、第1メモリ領域61の容量を1画面分よりも少ない容量としつつ、上書きにより消去される前に、書き込んだ画像データの読み出しを開始するようにしている。すなわち、水平方向の画像処理結果の画像データに対する垂直方向の画像処理は、1垂直周期待たずに処理を開始することが可能である。このことを可能にした画像メモリ6の第1メモリ領域61に対する読み出し開始タイミング制御の方法を、以下に説明する。
この実施形態では、前述した4種の撮像モードに応じて、2種類の読み出し開始タイミング制御方法を用いるようにしている。
方法1.読み出し開始タイミングを予め計算しておき、有効入力画像データの開始を示す水平および垂直同期信号などに基づいて、当該読み出し開始タイミングを検出して、読み出しを開始する。
方法2.メモリインタフェース54の内部で自ら開始タイミングを生成し、垂直方向処理の制御を行なう。
方法1では、手ぶれ補正、電子ズーム、電子歪み補正率などの条件により、第1メモリ領域61からの水平処理結果の画像データの読み出し開始タイミングを、予め詳細に決定しておくことは困難であるため、詳細な制御はできないが、メモリコントローラなどで詳細な制御する必要がなく、容易にタイミング制御を実現できる点と、読み出し開始タイミングの設定値によっては、処理開始以降は、回路が待ち状態になることがないような特殊な制御が可能となる点に長所がある。
この実施形態では、HD動画撮影モードおよび静止画記録モードでは、この方法1を用いるようにしている。
一方、方法2では、メモリインタフェース54自身が、読み出し開始タイミングを生成するため、それに必要な情報を管理・更新する必要があるが、画像メモリ6上の画像データをリアルタイムで管理可能となり、読み出し開始タイミングの詳細な制御ができるという長所がある。そして、この方法2は、メモリ容量の制限などで、詳細な制御を行ないたい場合に効果を発揮する。この実施形態では、SD動画撮影モードおよびモニタリングモードでは、方法2を用いるようにしている。
以上の方法1および方法2の適用例は、一例であり、これに限定されるものではない。
次に、上記の方法2について、その詳細を述べる。方法2を実現するための重要ポイントは、第1メモリ領域61上に存在する当該フィールド(フレーム)の画像管理情報(メモリ領域上に存在する1フィールド(1フレーム)中での画像範囲およびその開始アドレス、終了アドレス)を常に更新、管理することである。
一例として、図27、図28の例の場合における第1メモリ領域61についてのデータ書き込み/読み出しの挙動図をクローズアップしたものを図37に示す。また、1画面分の画像データが、そのときに、第1メモリ領域61にどのように書き込まれるかを、図38に示す。図38は、入力画像データについて水平方向の処理を全て行なった後、有効画像データ部分のみを第1メモリ領域61に書き込む場合を示している。
まず、図37において実線401で示すように、水平方向処理後の有効画像の書き込みが開始される。その時の書き込み開始アドレスは任意である。書き込み続けると、アドレスが第1メモリ領域61のメモリ上限に達し、折り返しが発生する。
そして、この折り返しが発生した状態で、さらに画像データを書き込み続けると、書き込みアドレスは、前に設定した書き込み開始アドレスに戻って、当該書き込み開始アドレスから、図37において実線402で示すように、第1メモリ領域61上で画像データの上書きが発生する。さらに、書き込み続けると、アドレスが、再度、第1メモリ領域61のメモリ上限に達し、折り返しが発生する。
この折り返しが発生した状態で、さらに画像データを書き込み続けると、書き込みアドレスは、再度、前に設定した書き込み開始アドレスに戻って、当該書き込み開始アドレスから、図37において実線403で示すように、第1メモリ領域61上で画像データの上書きが発生し、1画面分の残りの画像データが書き込まれる。
図37における実線401,402,403で示した書き込み区間の画像データは、1画面分の画像データとしては、図38に示すようになる。
図39(A)および(B)に、このときに、第1メモリメモリ61の1個のバンク上に存在する画像範囲の遷移を示す。なお、図39(B)では、第1メモリ領域61の1個のバンクの容量を、説明の便宜上、100ライン分として示している。
書き込みを始めてから第1メモリ領域61の1個のバンクの記憶容量分の書き込みがなされると、図39(B)に示すように、画像データの上書きが初めて発生する。その時、保存されていた書き込み開始ラインの画像データが上書きされ、消去されるが、存在終了ラインが増加する。したがって、存在開始ラインと存在終了ラインの相対的な差分は、上書きが開始された時点から常に一定となっている。この存在開始ラインと存在終了ラインのそれぞれのライン情報およびアドレス情報を、メモリインタフェース54で常に更新管理して、垂直方向読み出しタイミングを自動生成する。
すなわち、この実施形態では、第1メモリ領域61上に存在する画像範囲およびその開始アドレス、終了アドレスを管理することで、垂直方向処理のための読み出し開始タイミングを早めることができ、データの上書きが発生する前に所望のデータを読み出すことで、図49、図50の従来手法よりも少ないメモリ容量でかつ任意の入力画像サイズからのビデオ信号変換を可能とする。
さらに、この実施形態では、上述した存在開始ラインの情報をもとに、所望のラインの読み出しアドレス計算を行なうことで、従来では複雑になり得たアドレス計算を簡素化するようにしている。
すなわち、図49、図50に示した従来手法では、画像の読み出しアドレス計算には、図38に示した書き込み開始ラインおよびその開始アドレスをもとに計算している。つまり、従来手法では、書き込み開始ラインに対する相対アドレスを画像の読み出しのアドレス計算に利用している。その書き込み開始ラインおよびアドレス情報は、垂直ブランキング期間中に一度更新される。
図40に、従来方法の場合における垂直方向処理のための画像データの読み出し開始タイミングの計算方法を示す。すなわち、図40に示すように、垂直方向処理対象のラインが指定されて、その要求が垂直画像処理部で発生したとき、メモリコントローラは、要求されたラインを処理するために必要な画像範囲の複数ラインのアドレスを、書き込み開始ラインからの相対差分を利用して計算し、それらの必要な画像範囲の複数ラインの書き込みが終了していて、その読み出しが開始できるかどうかを判断するようにする。
しかし、この図40に示した垂直方向処理のための画像データの読み出し開始タイミングの計算方法として、書き込み開始アドレスを利用したアドレス計算を、この実施形態の撮像装置へ適用すると、次のような問題がある。すなわち、
1.任意の折り返しアドレスに対応するためには除算器が必要となる。
2.折り返しアドレスが2のべき乗の場合、シフト演算などを用いることで代用できるが、汎用性に欠け、また、動的に折り返しアドレスを変化させることが困難である。
という問題がある。
そこで、この実施形態では、アドレス計算には図39に示した存在開始ラインおよびそのアドレスを利用することでこれらの問題を解決するようにしている。
図41に、この実施形態における垂直方向処理のための画像データの読み出し開始タイミングの計算方法を示す。すなわち、図41に示すように、垂直方向処理対象のラインが指定されて、その要求が垂直画像処理部で発生したとき、メモリインタフェース54は、要求されたラインを処理するために必要な画像範囲の複数ラインの、その存在開始ラインからの相対差分を利用して計算し、それらの必要な画像範囲の複数ラインの書き込みが終了していて、垂直方向処理が開始できるかどうかを判断するようにする。
この実施形態では、存在開始ラインに対する相対アドレスを、垂直方向処理のための画像データの読み出し開始タイミングを決定する際のアドレス計算に利用することで、アドレス計算の際の折り返しは高々一回となる。このことより、除算器ではなく減算器などで実現することができ、計算の簡素化できる。
また、任意の折り返しアドレスに対応可能となる。そして、どのような入力画像サイズの場合でも、アドレス計算の際の折り返し回数は高々一回となるため、任意の入力画像サイズの画像データからの出力画像データへの変換が容易に実現できる。
この例におけるメモリインタフェース54の制御部542の、垂直処理のための画像データの読み出し制御動作のフローチャートを図42に示す。ただし、図42のフローチャートは、1画面分の画像データについての処理を示したもので、動画の画像データの場合には、この図42の処理が繰り返されることになる。
すなわち、この場合、図19に示したように、垂直補間処理部209は、前のラインについての垂直補間処理が終了すると、次のラインの垂直補間処理のために、メモリインタフェース54の制御部542(図19では制御部542は省略)に新たな要求ラインの情報を送る。
メモリインタフェース54の制御部542は、この要求ラインの情報を受け取ると(ステップS201)、要求ラインを垂直方向処理するために必要な複数ラインを認識し、それら複数ラインの、存在開始ラインに対する相対アドレスに関する計算を、上述したようにして行なう(ステップS202)。
このとき、レジスタブロック53には、制御部10から手ぶれ補正の有無、レンズ歪み補正の有無、電子ズームの有無などのモードに関する情報が保持されており、メモリインタフェース54の制御部542は、このレジスタブロック53のモードの情報から、そのときのモードにおいて、要求ラインを垂直方向処理するために必要な複数ラインを認識し、そのアドレス計算を行なう。
そして、メモリインタフェース54の制御部542は、必要な複数ラインの画像データの読み出しが可能になったか否か判別し(ステップS203)、未だ、それらの画像データの書き込みが終了していない場合には、垂直補間処理部209に供給するウエイト信号wait=1として、その旨を垂直補間処理部209に通知する(ステップS204)。そして、ステップS203に戻る。
また、ステップS203で、必要な複数ラインの画像データの読み出しが可能になったと判別したときには、メモリインタフェース54の制御部542は、垂直補間処理部209に供給するウエイト信号wait=0とすると共に、上記必要な複数ラインの画像データを読み出す(ステップS206)。このステップS206での読み出しアクセスは、前述したように、アクセス権周期区間(8メモリサイクル区間)において、レンズ歪みの大きさに応じて、最大5回なされ、画像データは、8画素単位で、4ライン分同時に読み出される。
そして、メモリインタフェース54の制御部542は、一回の読み出しで得た8画素のうち、垂直補間処理に必要な画素データのみを垂直補間処理部209に転送する(ステップS207)。したがって、垂直補間処理部209は、要求ラインについての垂直補間処理を開始する。
次に、メモリインタフェース54の制御部542は、垂直補間処理部209から要求されたラインについての垂直補間処理がすべて終了したか否か判別し(ステップS208)、終了していないと判別したときには、ステップS206に戻り、ステップS206,207、208を繰り返す。
また、ステップS208で、垂直補間処理部209から要求されたラインについての垂直補間処理がすべて終了したと判別したときには、メモリインタフェース54の制御部542は、1画面分の画像データの全てについての上記処理が終了したか否か判別し、終了してはいないと判別したときには、ステップS201に戻って、上述の処理を繰り返す。また、1画面分の画像データの全てについての上記処理が終了したと判別したときには、この処理ルーチンを終了する。
なお、上述の実施形態の説明では、主に動画記録モードのときの撮像画像信号の場合について述べたが、静止画記録、静止画再生などの際にも、上述と同様のアドレス計算方法を適用できることは勿論である。
[垂直方向処理のための読み出し制御(メモリインタフェース54の制御部542)]
次に、制御部542による垂直方向処理用の画像データの読出しについて、画像処理としてレンズ歪みの補正処理の場合について、さらに説明する。
まず、その説明に先立ち、レンズ歪み画像の歪みの「変動」について述べる。この実施形態の撮像装置では、図53に示した樽型の歪みの他に、それと逆方向に歪む糸巻き歪みにも対応している。まず、歪みの「変動」について定義する。
ここで、歪みの「変動」とは、ある一定の水平方向サイズの中で、画像が垂直方向にどれくらい歪んでいるかを示す数値であり、その水平方向サイズ内で最も下側に歪んでいる箇所から最も上側に歪んでいる箇所までの差を言うものとする。そして、この歪みの「変動」の値は正の値であり、0から定義する。ただし、変動0とは「歪み無し」とする。
この実施形態の撮像装置では、8画素単位で画像メモリ6に対して読み書きする処理を前提としている。そこで、水平方向8画素内の変動0〜4の一部を、例として図43〜図46に示す。これらの図は、要求するラインと、当該要求ラインを処理するために必要なラインとして上下8ラインを考えた場合の図である。
すなわち、図43(A),(B)は、水平方向8画素単位の変動1の場合の変動パターンを示している。図44(A),(B),(C)は、水平方向8画素単位の変動2の場合の変動パターンを示している。図45(A),(B),(C),(D)は、水平方向8画素単位の変動3の場合の変動パターンを示している。図46(A),(B),(C),(D)は、水平方向8画素単位の変動4の場合の変動パターンを示している。
前述したように、この実施形態では、画像メモリ6は、4バンク構成であることから一度に4ラインのメモリアクセスが可能である。さらに、この実施形態では、制御部542による垂直方向処理用の画像データの読出しには、アクセス権周期区間で、最大5回のアクセス権を与えているため、
4ライン×5回=20ライン
分のデータを、アクセス権周期区間で取得可能となる。
このため、アクセス権周期区間、すなわち、クロックCLKの8サイクル内(リアルタイム処理可能な範囲内)では、垂直方向8タップのFIRフィルタ210を用いて歪み補正と解像度変換を行った場合、図47に示すように、変動12までの歪みの「変動」の範囲内であれば、リアルタイム処理対応可能となる。
つまり、この実施形態の撮像装置では、水平8画素内での垂直方向の変動が12であるならば、その補正処理をリアルタイム処理可能となる。レンズ歪みは、通常、変動12以内の変動であるので、通常の歪みを十分カバーすることができ、高画質な画像歪み補正と解像度変換とが実現できる。なお、図47において、スロット1〜5は、それぞれ1回のアクセスを示している。
さらに、制御部542は、水平8画素内の垂直方向の歪みの変動をチェックした後、そのアクセス範囲を決定することで、垂直方向のメモリアクセスは、水平8画素内で最低限必要な範囲だけのアクセスが可能となり、不必要なデータの読出しは削減できる。
すなわち、この実施形態の手法では、図56に示したような綿密なアクセスは困難であるが、図55の場合と比べると、図48に示すように不必要なデータの読み出しは削減できていることがわかる。
また、図56の手法では、垂直1画素用ごとに常にアドレス計算、メモリアクセスを行なう必要あるため、垂直方向処理を8画素分行なうためには、8画素×8画素=64画素のデータが必要であるため、64回のアドレス計算およびコマンド発行が必要となる。
一方、この実施形態の手法では、一度のアクセスで水平方向8画素のデータを取得できるため、最大20ラインのアクセスの場合でも20回のアドレス計算およびコマンド発行で、垂直方向8画素分のデータを取得できる。
以上のことから、この実施形態の手法によれば、図55の場合および図56の場合とに存在する問題を解決して、低消費電力化と、高処理効率化を実現することができる。
以上説明したように、この実施形態によれば、1フィールド(1フレーム)分のメモリ容量に、垂直解像度変換などの垂直方向画像処理を開始するのに必要なメモリ容量を加えるだけで、任意データサイズの入力画像信号から、出力画像信号への変換が可能となり、入力画像分のメモリ容量相当を必要とする従来システムより少ない容量で、解像度変換などの画像処理をリアルタイム処理として実現できる。
そして、そのリアルタイム画像処理において、この実施の形態では、8画素単位で画像メモリに対する読み書きのアクセスを行なうようにすることにより、画像処理について、低消費電力化と、高処理効率化を実現することができる。
さらに、この実施の形態では、画像メモリを複数バンクの構成とすると共に、画像データの当該複数バンクに対する読み書きを工夫することにより、リアルタイム画像処理を容易に実現することができるようにしている。
また、水平方向処理および垂直方向処理のための画像データの、画像メモリ6に対する読み書きについて、4個のメモリ書き込みあるいは読み出し制御部541〜544を設けて、それぞれ独立に制御すると共に、それら4個の制御部によるアクセスを、調停部545によって調停するようにしたので、この点でも、リアルタイム画像処理を容易に実現することができる。
また、この実施形態では、レジスタ設定のセパレートアドレスによるメモリ分割を行なうことで、動的に回路構成を変化させることができ、その結果、さまざまな処理モードに対応することが可能であり、シームレスなモード遷移が可能となる。
また、メモリ上の画像管理情報をリアルタイムで管理・更新することで、読み出しの際のアドレス計算も簡素化でき、さらに、任意の折り返しアドレスに対応可能となる。
また、入力画像サイズによらず一定のメモリ容量にて解像度変換などの画像処理を実現できるため、入力画像サイズが大きくなればなるほど、従来システムに対して、その効果を、より発揮できる。さらに、動画像処理だけでなく、静止画処理に対しても適用できるため、より広い分野での利用が期待できる。
また、画像処理モードに応じてメモリ構成を動的に変化させることと、垂直処理の開始タイミングを2種類の方法を用いて柔軟に設定できることから、汎用性が高く、撮像装置だけでなく、さまざまな画像処理システムに組み込むことが期待できる。
[他の実施形態および変形例]
なお、上述の実施形態の説明は、撮像装置を操作するユーザにより生起される手ぶれによる画像歪みを補正する場合であったが、ユーザにより生起される手ぶれのみではなく、撮影時に、撮像素子に対して、その撮像画像の水平方向および/または垂直方向の位置的変化を生じるように加わった振動などの偏倚力に起因して生じる画像歪みをも補正することができることは言うまでもない。
また、上述の実施形態では、レンズの交換や光学ズームによるレンズの光軸上の移動を考慮するために、レンズ歪み補正用データ導出・エンコード部11を設けたが、レンズ交換を行なわず、光学ズームの機能を有しない撮像装置の場合であれば、レンズ歪み補正用ベクトルは、撮像素子の各画素位置に対して一意に定まるので、レンズ歪み補正用データデコード部の代わりに、レンズ歪み補正用データの格納部を設け、画素座標データを引数として、レンズ歪み水平方向補正量データやレンズ歪み垂直方向補正量データを読み出すようにすれば良い。
また、上述の実施形態は、X−Yアドレス型の固体撮像素子としてCMOSイメージャを用いた場合であるが、撮像素子としてはCMOSイメージャに限定されるものでないことは勿論である。また、撮像素子は、X−Yアドレス型のものに限定されるものではなく、CCD固体撮像素子であってもよい。
また、この発明は、撮像装置(カメラ)にのみ適用されるものではなく、例えば携帯電話端末、情報携帯端末などに撮像素子が取付けられて、画像を撮影する場合にも適用できるものである。
なお、メモリインタフェース54の制御部541〜544および調停部545は、上述の実施形態では、ハードウエアとして実現するようにしたが、ソフトウエアにより実現するようにしても良い。
また、上述の実施形態では、水平方向の画素列の画像データを先に読み出して、1ライン分を読み出したら、次のラインを読み出すようにしたので、水平方向処理を先に行ない、その処理結果を第1メモリ領域に書き込み、垂直方向処理のためには、この第1メモリ領域から水平方向処理結果を読み出すようにしたが、垂直方向の画素列を先に読み出し、垂直方向の1列を読み出したら、次の1列を読み出すようにして、垂直方向処理を先に行ない、その処理結果を第1メモリ領域に書き込み、水平方向処理のために、この第1メモリ領域から水平方向処理結果を読み出すようにしても良い。
2…撮像素子、5…信号処理部、6…画像メモリ、7…手ぶれ検出部、8…手ぶれ速度検出処理部、10…制御部、12…レンズ歪み補正データデコード部、51…水平処理ブロック、52…垂直処理ブロック、53…レジスタブロック、54…メモリインタフェース、61…第1メモリ領域、62…第2のメモリ領域、209…垂直補間処理部、541〜544…制御部、545…調停部、BANK0〜BANK3…画像メモリ6を構成するバンク