以下、この発明による画像信号の歪み補正装置および方法の実施の形態を、CMOSイメージャを撮像素子に用いた撮像装置に適用した場合を例に、図を参照しながら説明する。
[実施の形態におけるCMOS手ぶれに起因するフォーカルプレーン現象の歪み補正について]
CMOS手ぶれに起因するフォーカルプレーン現象の歪み補正および抑制技術としては、先に特許文献2(特開2004−266322公報)に記載されたものがある。
この特許文献2に記載される補正方法は、1水平ライン単位で撮像画像データがCMOSイメージャから読み出されるとき、各水平ラインについての手ぶれによる位置変位量(以下、手ぶれ量という)を検出し、当該検出した手ぶれ量分だけ、発生した手ぶれとは逆方向にずれた位置から当該水平ラインのデータを読み出すように補正するものである。
しかし、手ぶれ量を各水平ラインについて得ることは、手ぶれを検出するセンサのサンプリング周波数などの条件から困難であることに鑑み、この特許文献2においては、図61(A)に示すように、画面の垂直方向の複数ライン分置きの位置での手ぶれ量を、離散的に検出するようにしている。図61では、50ライン置きのライン位置での手ぶれ量Q1,Q2,Q3・・・(図61(B)参照;なお、図では水平方向の手ぶれ量のみを示している)を検出している。
そして、手ぶれ検出を行なうライン以外の、手ぶれ量を直接的には検出しない49ラインに対する手ぶれ量は、検出された手ぶれ量Q1,Q2,Q3・・・を用いて、補間により求めるようにする。この補間の方法としては、例えば図61(C)に例を示すように、幾通りかの方法がある。図61(C)の補間の方法は、基本的には、手ぶれ量を直接的には検出しない49ラインの直前ラインおよび直後ラインの2位置での2つの手ぶれ量QnおよびQn+1(nは1以上の整数)を用いて行なう。
例えば、補間(1)の方法では、直前ラインで検出された手ぶれ量Qnを、前記49ラインのうちの前半のラインではそのまま用い、前記49ラインのうちの後半のラインでは、直後ラインで検出された手ぶれ量Qn+1を用いるようにする。また、補間(2)の方法は、直前ラインで検出された手ぶれ量Qnと直後ラインで検出された手ぶれ量Qn+1とを直線で結んだときの各ラインでの値を、当該ラインの手ぶれ量とする、すなわち、いわゆる平均値補間を行なう方法である。
この特許文献2の方法によれば、手ぶれが原因で生じるCMOSイメージャにおけるフォーカルプレーン現象を含む歪を補正することが可能である。
しかしながら、この特許文献2で採用されている方法の場合には、離散的なサンプリング位置で手ぶれを検出し、その検出結果から前記離散的なサンプリング位置での手ぶれ量を求め、当該離散的なサンプリング位置での手ぶれ量を用いて補間をすることにより、各ライン位置での手ぶれ量を推定するようにしている。
このため、特許文献2の場合には、前記直前ラインの手ぶれ量Qnと、前記直後ラインの手ぶれ量Qn+1との両方が得られた後でないと、前記直前ライン後の各ラインの手ぶれ量を、補間処理により得るようにすることができない。このため、前記直前ラインの後の各ラインについての手ぶれ補正処理が、最大、離散的なサンプリング周期区間である複数ライン区間分だけ遅延することになる。
また、上述の補間(1)の方法を用いた場合には、補間値としての手ぶれ量の変化時間で、画像位置がずれる可能性がある。
また、補間(2)の方法の場合には、直前ラインの手ぶれ量Qnと直後ラインの手ぶれ量Qn+1とから、手ぶれ量の変化の傾きを求め、その傾きに、直前ラインからの対象ラインまでのライン数を乗算することにより、当該対象ラインの手ぶれ量を求めるようにしなければならない。このため、乗算器が必要になると共に、乗算パラメータを別途設定するためのレジスタを設ける必要があり、ハードウエアが複雑化すると共に、回路規模が大きくなる。さらに、乗算誤差のため、手ぶれ量のサンプリング値が変わる境界位置において、図61(C)の補間(2)の場合の図のように連続的にはならずに、画像位置がずれる可能性がある。
以下に説明する実施の形態では、上述のような問題を回避しつつ、CMOSイメージャなどのX−Yアドレス型の撮像素子を用いた撮像装置においても、手ぶれ等が原因で生じるフォーカルプレーン現象による撮像画像の歪を軽減することができるようにしている。
先ず、図1を用いて、この発明による画像信号の歪み補正方法の実施形態におけるフォーカルプレーン現象による撮像画像の歪を軽減する方法の概要を説明する。以下に説明する実施形態は、撮像素子としてX−Yアドレス型の固体撮像素子の代表例であるCMOSイメージャを用いて撮像した撮像画像について、前述したCMOS手ぶれを補正する場合の例である。なお、この発明は、撮像画像が動画像である場合と静止画像である場合の、何れの場合にも適用できるものである。
図1の概要説明図においては、図1(A)に示すように、画像に生じるCMOS手ぶれによる歪みを判りやすく示すために、歪みの無いオリジナルの画像として多数個の長方形からなる格子縞模様の画像を想定している。したがって、CMOS手ぶれによる画像歪みは、当該格子縞模様を構成する長方形の変形歪みとして現れるものとなる。
なお、この実施形態においても、CMOSイメージャは、図58に示したような1画面とする水平有効領域および垂直有効領域で定まる有効画像領域EFL(1垂直周期分)よりも広い範囲の実効画像領域AFLを有するものが用いられるものである。なお、図1(A)〜(D)に示した1画面分の画像は、図58の有効画像領域EFLの大きさの画像である。
この実施形態では、水平方向の画素クロックの速度は、手ぶれの速度よりも十分に早いとし、また、撮像画像データの読み出しは、1水平ライン単位で順次に行なうものとして、手ぶれ補正は、1水平ライン単位で行なうようにする。
また、この実施形態では、図1(B),(C),(D)に示すように、CMOSイメージャの有効画像領域EFL分の画像区間は、垂直方向に複数に等分割し、各分割画像区間Pdivでは、同じ手ぶれ速度の手ぶれ変位を受けるものと仮定している。ここで、分割数は、手ぶれ補正したときに、必要十分な補正効果が得られる分割画像区間Pdivの大きさを考慮して定められる。以下に説明する例では、有効画像領域EFLの画像区間を垂直方向に8分割するようにする。すなわち、この例では、分割画像区間Pdivは、垂直同期信号の1周期を1/8に分割した区間となる。
1つの分割画像区間Pdivは、複数水平ライン分からなるが、この実施形態では、同じ分割画像区間Pdivに含まれる複数水平ラインは同じ手ぶれ速度の手ぶれ変位を受けるものと仮定して手ぶれ補正処理を行なうものである。
そして、この実施形態では、8個の分割画像区間Pdiv_0〜Pdiv_7のそれぞれの先頭の水平ラインに対する手ぶれ速度ベクトルを、図1(B)の左側の矢印に示すようなものとして、手ぶれ速度検出手段により検出する。すなわち、この例では、手ぶれ速度ベクトルは、1画面分の撮像画像について、8箇所において、離散的に検出するようにする。
図1(B)の画像は、手ぶれ速度ベクトルが、各分割画像区間Pdivで、左側の矢印のようなものとした時に生じる手ぶれによる撮像画像の歪みを示している。この実施形態では、この手ぶれによる撮像画像の歪みを、水平方向処理と垂直方向処理とに分けて、それぞれの方向の歪みを別々に補正するようにする。
補正処理の詳細については後述するが、この実施形態では、先ず、水平方向の歪みについて補正処理を行ない、次いで、垂直方向の歪みについての補正処理を行なう。この場合に、1画面分の撮像画像のすべてのデータについての水平方向の歪み補正処理が完了する前であっても、垂直方向の歪み補正処理が可能になった段階で、垂直方向の歪み補正処理を開始して、水平方向の歪み補正処理と並行して行なうようにすることにより、効率良く歪み補正処理を行なうようにする。
そこで、この実施形態では、先ず、手ぶれによる水平方向の画像歪みを補正するために、図1(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の先頭の水平ライン時点を基準点とした時間で積分)して算出する。図2の右側に、その積分結果の値としての水平方向の手ぶれ補正量(以下、水平手ぶれ補正量という)SX_ADDを示す。
この図から判るように、各水平ラインのそれぞれについての水平手ぶれ補正量SX_ADDは、各分割画像区間Pdiv_0〜Pdiv_7においては、一定の傾きで変化し、かつ、積分であるので、分割画像区間の境目では折れ線とはなるが、連続的なものとなり、ずれは生じない。
水平方向の歪み補正処理においては、以上のようにして求められた各ラインについての手ぶれ水平補正量SX_ADDを用いて、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。すなわち、各水平ラインの読み出し開始位置を、図1(B)における手ぶれに応じて水平方向にずれた位置からとすることにより、図1(C)の画像に示すように、水平方向の歪みが補正されることになる。
この図1(C)の画像は、図1(B)の画像歪みの内の水平方向の歪みは補正されて除去されているが、垂直方向の歪みが残っている。
そこで、この実施形態では、手ぶれによる垂直方向の画像歪みを補正するため、図1(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イメージャ上での各水平ラインの垂直方向の読み出し開始位置を補正することにより、撮像画像を補正処理する。これにより、図1(D)の画像に示すように、水平方向の場合と同様にして垂直方向の歪みが補正され、歪みの除去された撮像画像データ出力が得られる。
水平手ぶれ補正量および垂直手ぶれ補正量を用いて、手ぶれによるCMOSイメージャについてのフォーカルプレーン現象による画像歪みが補正される様子は、前述した特許文献2と同様である。
しかし、特許文献2では、手ぶれ量を、垂直方向の離散的な水平ラインについて検出すると共に、直接的に手ぶれ量を検出しない、離散的な水平ラインの間の各水平ラインについては、前記離散的に検出した手ぶれ量を用いた補間処理により得るようにしているのに対して、この実施形態では、垂直方向の離散的な水平ラインについては手ぶれ速度を検出し、当該検出した手ぶれ速度を、各水平ラインについて順次に積分してゆくことにより、各水平ラインの手ぶれ量(手ぶれ補正量)を検出する点が大きく異なる。
このように、この実施形態では、各水平ラインの手ぶれ量(手ぶれ補正量)は、手ぶれ速度を積分することにより算出するものであるので、分割画像区間の境目では折れ線とはなるが、連続的なものとなり、ずれは生じない。
なお、この実施形態では、手ぶれ速度ベクトルから水平成分および垂直成分を抽出するときに、その逆符号成分を算出して、補正速度成分とするようにしたが、速度成分あるいは手ぶれ量を逆符号として、補正速度成分あるいは手ぶれ補正量とするのは、撮像画像データに対する手ぶれ補正処理の実行開始前であれば、どの時点であっても良い。
[手ぶれ動きベクトルおよび手ぶれ速度ベクトルの算出]
この実施の形態では、撮像画像の手ぶれ動きベクトルを検出する方法として、2画面間の相関を求めるブロックマッチングを用いる。このブロックマッチングを用いる方法は、ジャイロ(角速度)センサなどの機械的な部品が不要なので、撮像装置の小型、軽量化を実現することができるという点で有利である。
図3および図4は、ブロックマッチングの概要を図示したものである。また、図5には、その処理フローチャートの一般例を示す。
ブロックマッチングは、撮像装置部からの撮像画像について、注目画面である参照画面と、当該参照画面よりも1画面分前の撮像画面である元画面との間の1画面分単位での動きベクトルを、所定の大きさの矩形領域のブロックについて、参照画面と元画面との相関を算出することにより算出する方法である。
なお、ここで画面とは、1フレームまたは1フィールドの画像データからなる画像を意味しているが、この明細書では、説明の便宜上、画面は1フレームからなるものとして、画面をフレームと称することとする。したがって、参照画面は参照フレーム、元画面は元フレームと称する。
例えば、参照フレームの画像データは、撮像装置部からの現フレームの画像データ、または現フレームの画像データがフレームメモリに格納されて1フレーム分遅延されたものとされる。元フレームの画像データは、参照フレームの画像データがさらにフレームメモリに格納されて1フレーム分遅延されたものとされる。
図3および図4は、従来のブロックマッチングの概要を説明するための図である。また、図5は、従来のブロックマッチング処理のフローチャートの一例である。
ブロックマッチングにおいては、図3に示すように、元フレーム101の任意の所定の位置において、水平方向の複数画素および垂直方向の複数ライン分からなる所定の大きさの矩形領域からなるターゲットブロック103が設定される。
これに対して、参照フレーム102において、元フレームのターゲットブロック103の位置と同じ位置に、ターゲットブロックの射影イメージブロック104(図3の点線参照)を想定し、このターゲットブロックの射影イメージブロック104を中心としたサーチ範囲105(図3の一点鎖線参照)を設定すると共に、ターゲットブロック103と同じ大きさの参照ブロック106を考える。
そして、この参照ブロック106の位置を参照フレーム102のサーチ範囲105内において移動させ、各位置において参照ブロック106に含まれる画像内容と、ターゲットブロック103の画像内容との相関を求め、最も相関が強いとして検出された参照ブロック106の位置を、元フレームのターゲットブロック103が、参照フレーム102において移動した位置として検出するようにする。そして、その検出した参照フレーム106の位置と、ターゲットブロックの位置との間の位置ずれ量を、方向成分を含む量としての動きベクトルとして検出するようにする。
この場合、参照ブロック106は、サーチ範囲105を、例えば水平方向および垂直方向に、1画素または複数画素単位で移動させるようにする。したがって、サーチ範囲105内には、複数個の参照ブロックが設定されることになる。
ここで、ターゲットブロック103と、サーチ範囲105内を移動する各参照ブロック16との相関は、ターゲットブロック103内の各画素の輝度値と、参照ブロック106内の対応する各画素の輝度値との差分の絶対値の、ブロック内の全画素についての総和(この差分の絶対値の総和を差分絶対値和と呼ぶ。以下、この差分絶対値和をSAD(Sum of Absolute Difference)と記載することとする)を求めることにより検出する。すなわち、SAD値が最小となる位置の参照ブロック106が最も相関が強い参照ブロックとして検出され、その検出された参照ブロック106のターゲットブロック103の位置に対する位置ずれ量が動きベクトルとして検出される。
ブロックマッチングでは、サーチ範囲105内に設定される複数個の参照ブロック106のそれぞれの、ターゲットブロック103の位置に対する位置ずれ量は、方向成分を含む量としての参照ベクトル107(図3参照)で表現される。各参照ブロック106の参照ベクトル107は、参照ブロック106の参照フレーム102上の位置に応じた値となるが、従来のブロックマッチングでは、SAD値が最小値となる参照ブロック106の参照ベクトルを、動きベクトルとして検出するものである。
そこで、ブロックマッチングでは、一般に、図4に示すように、サーチ範囲105内において設定される複数個の参照ブロック106のそれぞれとターゲットブロック103との間におけるSAD値(以下、説明の簡単のため参照ブロックについてのSAD値という)を、それぞれの参照ブロック106の位置に応じた参照ベクトル107のそれぞれに対応させて、メモリに記憶しておき、そのメモリに記憶された全ての参照ブロック106についてのSAD値の中から、最小のSAD値の参照ブロック106を検出することで、動きベクトル110を検出するようにしている。
サーチ範囲105内に設定された複数個の参照ブロック106の位置に応じた参照ベクトル107のそれぞれに対応させて、それぞれの参照ブロック106についてのSAD値を記憶したものを、差分絶対値和テーブル(以下SADテーブルという)と呼ぶ。図4のSADテーブル108が、これを示しており、このSADテーブル108において、それぞれの参照ブロック106についてのSAD値をSADテーブル要素109という。
なお、上述の説明において、ターゲットブロック103および参照ブロック106の位置とは、それらのブロックの任意の特定の位置、例えば中心位置を意味するものであり、参照ベクトル107は、参照フレーム102におけるターゲットブロック103の射影イメージブロック104の位置と、参照ブロック106の位置との間のずれ量(方向を含む)を示すものである。図3および図4の例では、ターゲットブロック103は、フレームの中心位置にあるとしている場合である。
そして、各参照ブロック106に対応する参照ベクトル107は、参照フレーム102上のターゲットブロック103に対応する位置に対する当該各参照ブロック106の位置ずれとなっているので、参照ブロック106の位置が特定されると、その位置に対応して参照ベクトルの値も特定される。したがって、SADテーブル108のメモリにおける参照ブロックのSADテーブル要素のアドレスが特定されると、対応する参照ベクトルは特定されることになる。
以上説明した従来のブロックマッチングの処理を、図5のフローチャートを参照して説明すると、次のようになる。
先ず、サーチ範囲105内の1つの参照ブロックIiを指定するが、これは、当該参照ブロックIiに対応する参照ベクトルを指定することに等しい(ステップS1)。ここで、図5において、(vx,vy)は、ターゲットブロックのフレーム上の位置を基準位置(0,0)としたときに、指定された参照ベクトルにより示される位置を示し、vxは指定された参照ベクトルによる、基準位置からの水平方向のずれ量成分であり、また、vyは指定された参照ベクトルによる、基準位置からの垂直方向成分のずれ量成分である。
ここでは、ずれ量vx、vyは、画素を単位とした値とされ、例えばvx=+1は、基準位置(0,0)に対して、水平方向の右方向に1画素分ずれた位置を示し、また、vx=−1は、基準位置(0,0)に対して、水平方向の左方向に1画素分ずれた位置を示している。また、例えばvy=+1は、基準位置(0,0)に対して、垂直方向の下方向に1画素分ずれた位置を示し、また、vy=−1は、基準位置(0,0)に対して、垂直方向の上方向に1画素分ずれた位置を示している。
以上のように、(vx、vy)は、参照ベクトルで示される基準位置に対する位置(以下、簡単のため、参照ベクトルで示される位置という)を示しており、参照ベクトルのそれぞれに対応している。つまり、vxおよびvyを整数としたとき、(vx、vy)は参照ベクトルのそれぞれを表すことになる。したがって、以下の説明においては、(vx、vy)の位置を示す参照ベクトルを、参照ベクトル(vx、vy)と記載することがある。
ここで、サーチ範囲の中心位置をターゲットブロックの位置、つまり前記基準位置(0,0)とし、サーチ範囲を、水平方向には±Rx、垂直方向には±Ryとしたとき、
−Rx≦vx≦+Rx、−Ry≦vy≦+Ry
とされるものである。
次に、ターゲットブロックIo内の1つの画素の座標(x,y)を指定する(ステップS2)。次に、ターゲットブロックIo内の指定された1つの座標(x,y)の画素値Io(x,y)と、参照ブロックIi内の対応する画素位置の画素値Ii(x+vx,y+vy)との差分の絶対値αを算出する(ステップS3)。すなわち、差分絶対値αは、
α=|Io(x,y)−Ii(x+vx,y+vy)| ・・・(式1)
として算出される。
そして、算出した差分絶対値αを、当該参照ブロックIiの参照ベクトル(vx,vy)が指し示すアドレス(テーブル要素)の、それまでのSAD値に加算し、その加算であるSAD値を、当該アドレスに書き戻すようにする(ステップS4)。すなわち、参照ベクトル(vx,vy)に対応するSAD値を、SAD(vx,vy)と表すと、
SAD(vx,vy)=Σα=Σ|Io(x,y)−Ii(x+vx,y+vy)|
・・・(式2)
として算出し、当該参照ベクトル(vx,vy)が指し示すアドレスに書き込むようにする。
次に、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったか否かを判別し(ステップS5)、ターゲットブロックIo内の全ての座標(x,y)の画素については、未だ、演算は終了していないと判別したときには、ステップS2に戻り、ターゲットブロックIo内の次の座標(x,y)の画素位置を指定し、このステップS2以降の処理を繰り返す。
また、ステップS5で、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったと判別したときには、当該参照ブロックについてのSAD値の算出が終了したと判別して、サーチ範囲内の全ての参照ブロック、すなわち、全ての参照ベクトル(vx,vy)についての上記の演算処理を完了したか否か判別する(ステップS6)。
ステップS6で、未だ、上記の演算処理を完了していない参照ベクトル(vx,vy)があると判別すると、ステップS1に戻り、上記の演算処理を完了していない次の参照ベクトル(vx,vy)を設定して、このステップS1以降の処理を繰り返す。
そして、ステップS6で、上記の演算処理を完了していない参照ベクトル(vx,vy)はサーチ範囲内になくなったと判別すると、SADテーブルが完成したとして、当該完成したSADテーブルにおいて、最小値となっているSAD値を検出する(ステップS7)。そして、当該最小値となっているSAD値のアドレスに対応する参照ベクトルを動きベクトルとして検出する(ステップS8)。ここで、SADの最小値をSAD(mx,my)と書き表すと、目的とする動きベクトルは、位置(mx,my)を示すベクトル(mx,my)として算出される。
以上で、1つのターゲットブロックに対するブロックマッチングによる動きベクトルの検出処理は、終了となる
以上のようなブロックマッチングを用いたセンサレスの手ぶれ動きベクトルの検出方法の場合、原理的に、ピクセル精度の手ぶれベクトル検出が実現可能であり、また、センサやレンズシフト等の機構を削減できるため、コスト的にも相当優位である。
しかし、上述した従来のブロックマッチングに依存する技術の延長では、1画面分の画素数に比例してSADテーブルの規模が増加するため、現在の500万画素オーバーの静止画サイズの動きベクトル検出を、現実的な回路規模で実現するのは非常に困難である。
過去、各社様々な工夫を凝らしながら、NTSC(National Television System Committee)動画の高々17万画素の手ぶれベクトル検出の回路規模削減に苦慮していた背景がある上に、NTSC動画の場合、60fps(frame per second;フレーム/秒)のため手ぶれのサーチ範囲は狭くて済むが、静止画の場合、3fps程度が前提となり、サーチ範囲が極端に大きくなることも問題を困難にしている一因である。画素数と同じく、サーチ範囲にも比例してSADテーブルのテーブル要素数が増加するからである。
センサレス手ぶれ補正を静止画で実現する手法としては、特許文献3(特開平7−283999号公報)を始め、幾つか提案はされている。特許文献3は、手ぶれの発生しない程度の短い露光時間で何枚かの静止画を連写撮影し、その静止画間の手ぶれベクトルを求め、その手ぶれベクトルに従って、前記連射撮影した複数枚の静止画を平行移動(およびロール軸方向に回転)させながら加算(もしくは平均化)して行くことで、最終的に手ぶれと低照度ノイズの無い高画質の静止画を得る、というアルゴリズムである。
実現できるレベルの現実的な提案としては、特許文献4(特開2005−38396公報)を挙げることができる。この特許文献4に示されたものは、画像を縮小変換したサイズで動ベクトルを求める手段と、同一のSADテーブルを複数のブロックで共有する手段から構成される。画像の縮小変換と、SADテーブルの複数ブロックでの共有化は、SADテーブルサイズの削減を実現するための、非常に良い手法であり、MPEG(Moving Picture Experts Group)画像圧縮方式における動きベクトル検出やシーンチェンジ検出等、他分野でも使われている。
しかし、この特許文献4のアルゴリズムの問題点として、画像の縮小変換と、その際のメモリ(DRAM(Dynamic RAM(Random Access Memory)))アクセスに、時間とメモリ容量を消費することと、SADテーブルを複数ブロックで時分割アクセスする手法のため、メモリアクセスが非常に増加し、この処理にも時間を要してしまうという課題がある。動画の手ぶれ補正においては、リアルタイム性と同時にシステム遅延時間の短縮が求められるため、この処理時間の問題が課題となってしまうのである。
また、元画像を縮小変換する際には、エイリアシング(折り返し歪み)や、低照度ノイズ除去のためのローパスフィルタを、縮小処理の前処理として実装するが必要である。しかし、縮小倍率に応じて、ローパスフィルタの特性が変化する上、特に、垂直方向のローパスフィルタの場合、多タップのデジタルフィルタとした場合に、多くのラインメモリと演算ロジックを必要としなければならず、回路規模増加の問題が生じる。
他方、ブロックマッチングを使用しないアルゴリズムも提案されている(例えば特許文献5(特開平6−86149号公報)、特許文献6(特開2004−343483公報)など)。これらは、2つのフレーム画像内それぞれで、何らかの特徴点を複数点検出し、それらの2つのフレーム間の対応付けを取ることで全体の手ぶれベクトル(グローバルベクトル)を求める手法である。もしくは、片方のフレームのみで特徴点を検出し、その特徴点の周囲に関してのみ、もう一方のフレームに対してブロックマッチングを施しても良い。
この特許文献5や特許文献6のアルゴリズムは、回路規模を削減するうえで非常に有効であり、理想的ではあるものの、現実には、2フレームに共通して存在する、画像全体の真に特徴のある特徴点を、どこまで効率的に数を絞って特定出来るかに、その実効性が掛かっている。したがって、この特許文献5や特許文献6のアルゴリズムに比べると、民生機では森羅万象が撮像対象である限り、ロバスト性においてブロックマッチング手法に一日の長があると考えられる。
上述の通り、デジタルカメラなどの撮像装置では、今後益々高密度画素化が進み、高性能化が求められると予想されるが、このような状況においては、静止画の撮影時の手ぶれ補正を、ジャイロ(角速度)センサを用いないセンサレスで実現する意義は非常に大きい。
そこで、上述したように、ブロックマッチングを用いて、センサレスで、手ぶれ動きベクトルを検出し、その検出した動きベクトルを用いて手ぶれ補正を行なうことが有望であるが、ブロックマッチングの現実解として、回路規模、処理速度、ロバスト性を全て満たす提案はなされていないのが現状である。
そして、ブロックマッチング技法において、最大の問題となっているのが、SADテーブルの増大である。既に述べたように、デジタルカメラにおいては、そのイメージャが500万画素以上が前提の昨今において、画素数に比例してSADテーブルサイズが大きくならざるを得ない上、静止画の場合、3fps程度のため、動画の60fpsの手ぶれ範囲と比較して、何10倍も広いサーチ範囲が必要であり、当該サーチ範囲の拡大は、即ちSADテーブルの増大と等しいからである。
多人数評価の結果、3fpsの静止画の場合における手ぶれ範囲は、全フレームを100%として±10%程度であることが判明している。既に高級機では世に出ている1200万画素を仮定し、現状で提案されている技術のまま、必要なSADテーブルサイズを見積もると、約80メガビットである。しかも、現実的な処理速度を満たそうとすると、このSADテーブル情報を格納するメモリは、内蔵SRAM(Static RAM(Random Access Memory))であることが求められる。半導体プロセスルールが進んだとは言え、このサイズは、ほぼ3桁程度、現実的なレベルからはかけ離れている。
この実施の形態では、以上の点にかんがみ、ブロックマッチングを用いて2フレーム間の動きベクトルを検出する場合において、SADテーブルサイズの大幅な削減が可能である画像処理方法および装置を提供するようにする。
また、前述したブロックマッチングにおける従来の提案手法のうち、特許文献4に記載された画像の縮小変換によるSADテーブルの削減手法に関して、2つの問題を提起した。画像の縮小変換に伴う処理時間の増大並びにメモリ容量の消費と、画像の縮小変換に伴うエイリアシング回避のための適切なローパスフィルタの実装に伴う回路増大の問題である。以下に説明する実施の形態においては、これらの問題点をも解決したものである。
[実施の形態で用いる新規なブロックマッチング手法の概要]
この実施の形態においても、上述したブロックマッチングを用いて、2フレーム間の動きベクトルを検出するのであるが、ターゲットブロックと参照ブロック間において求められるSAD値を、参照ブロックの参照ベクトルに対応して記憶するのではなく、当該参照ベクトルを縮小し、その縮小した参照縮小ベクトルに対応する、当該参照縮小ベクトルの近傍の複数の参照ベクトルに分散加算して記憶するようにする。
これにより、従来のSADテーブルに比較して、SADテーブルのサイズを大幅に縮小するようにするものである。
図6〜図8は、実施の形態で用いる新規なブロックマッチング手法の概要を説明するための図である。図6は、従来のSADテーブルTBLoと、実施形態で用いる新規なブロックマッチング手法において生成される縮小SADテーブルTBLsとの関係を示すものである。
この実施形態においても、図3に示したように、従来と同様に参照フレームにおいて、元フレームに設定されたターゲットブロックの位置を中心としてサーチ範囲が設定される。そして、このサーチ範囲において、前述したような複数の参照ブロックが設定され、各参照ブロック内の画素とターゲットブロック内の対応する画素の輝度値の差分の絶対値の総和、つまり、SAD値が求められる。
従来は、求められたSAD値は、図6に示すように、対象となっている参照ブロックの参照ベクトルRVに対応するアドレスのテーブル要素tblとしてSADテーブルTBLoに書き込まれる。
したがって、従来のブロックマッチングでは、ターゲットブロックと参照ブロックとのフレーム画像上における位置ずれ量を表わす参照ベクトルRVと、SADテーブルTBLoの各テーブル要素である参照ブロックのSAD値とは、1対1に対応している。すなわち、従来のSADテーブルTBLoでは、サーチ範囲で取り得る参照ベクトルRVと等しい数のSAD値のテーブル要素数を備えるものとなっている。
これに対して、この実施形態におけるブロックマッチングでは、図6および図7(A)、(B)に示すように、対象となっている参照ブロックの参照ベクトルRVは、縮小率1/n(nは自然数)で縮小されて参照縮小ベクトルCVとされる。
ここで、以下の説明においては、説明の便宜上、水平方向縮小倍率と垂直方向の縮小倍率とを同じとしているが、水平方向縮小倍率と垂直方向の縮小倍率とは独立の異なる値でも良い。また、後で述べるが、水平方向縮小倍率と垂直方向の縮小倍率とを独立に任意の自然数分の1として設定できるようにしておく方が、柔軟性も高く好都合である。
この実施形態においても、前述の従来のブロックマッチング手法について説明したのと同様に、サーチ範囲の中心とされるターゲットブロックの位置を基準位置(0,0)とし、参照ベクトルは、当該基準位置からの画素単位の水平方向および垂直方向のずれ量(vx,vy)(vx、vyは、整数)を指し示すものとされ、参照ベクトルRVのそれぞれは、参照ベクトル(vx,vy)で表される。
参照ベクトル(vx,vy)が、水平方向および垂直方向のそれぞれについて1/nに縮小された参照縮小ベクトル(vx/n,vy/n)で示される位置(vx/n,vy/n)は、整数ではなく、小数成分が発生することがある。このため、この実施形態では、縮小前の元の参照ベクトルRVに対応して求められたSAD値を、参照縮小ベクトルCVに最も近い1つの参照ベクトルに対応するテーブル要素として記憶してしまうと誤差が生じることになる。
そこで、この実施形態では、まず、参照縮小ベクトルCVで示される位置(vx/n,vy/n)の近傍の複数の参照ベクトルで示される複数の位置(テーブル要素)を検出する。そして、参照ベクトルRVの参照ブロックについて求められたSAD値は、その検出した近傍の複数の参照ベクトルに対応するSAD値に分散して加算するようにする。
この場合に、この実施形態では、参照縮小ベクトルCVで示される位置の近傍の周囲の複数個の参照ベクトルで示される位置に対応するテーブル要素tblに書き込むべき成分として分散加算する値は、縮小前の元の参照ベクトルRVに対応して求められたSAD値から、参照縮小ベクトルとその近傍の参照ベクトルとのそれぞれが示す位置の関係を用いて、前記近傍の参照ベクトルのそれぞれに対応して分散加算するSAD値を算出し、算出したSAD値のそれぞれを、対応する参照ベクトルのテーブル要素成分として加算するようにする。
ここで、分散するだけでなく加算するというのは、参照縮小ベクトルの近傍の複数の参照ベクトルは、異なる複数の参照縮小ベクトルについて重複して検出されることになるので、1つの参照ベクトルについて、重複したSAD値は加算するという意味である。
なお、参照縮小ベクトルCVが示す位置(vx/n,vy/n)が、参照ベクトルが示す位置に一致する場合、つまり、vx/nおよびvy/nの値が整数であるときには、周辺の複数の参照ベクトルを検出する必要はなく、当該位置(vx/n,vy/n)を示す参照ベクトルに対応して、縮小前の元の参照ベクトルRVに対応して求められたSAD値を記憶するようにするものである。
次に、具体例を挙げて、以上の処理を説明する。例えば、ターゲットブロックの位置を基準(0,0)としたときに、図7(A)に示すように、(−3,−5)の位置を示す参照ブロックRVを、水平方向および垂直方向に、1/n=1/4倍に縮小すると、その参照縮小ベクトルCVで示される位置は、図7(B)に示すように、(−0.75,−1.25)となる。
したがって、参照縮小ベクトルCVで示される位置は小数成分が発生し、参照ベクトルで示される位置とは一致しない。
そこで、この場合には、図8に示すように、当該参照縮小ベクトルCVが示す位置の近傍位置を示す複数個の近傍参照ベクトルが検出される。図8の例では、1つの参照縮小ベクトルCVに対して、4個の近傍参照ベクトルNV1,NV2,NV3,NV4が検出される。
そして、前述したように、この実施形態では、参照ベクトルRVの参照ブロックについて求められたSAD値は、これら4個の近傍参照ベクトルNV1,NV2,NV3,NV4に対応するSAD値として分散加算される。
この場合に、この実施形態では、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれに分散加算するSAD値は、参照縮小ベクトルCVで示される位置P0(図8において×印として示す)と、4個の近傍参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4(図8において○印として示す)との位置関係を用いて線形加重分散値として算出する。
図8の例の場合には、参照縮小ベクトルCVで示される位置P0は、周辺近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4を、水平方向に1:3、垂直方向に3:1に内分する位置にある。
そこで、縮小前の元の参照ベクトルRVに対応して求められたSAD値をSαとしたとき、周辺近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4に対応するSADテーブル要素に分散加算する値SADp1,SADp2,SADp3,SADp4のそれぞれは、
SADp1=Sα×9/16
SADp2=Sα×3/16
SADp3=Sα×3/16
SADp4=Sα×1/16
となる。
そして、この実施形態では、求められた値SADp1,SADp2,SADp3,SADp4のそれぞれを、近傍の4個の参照ベクトルNV1,NV2,NV3,NV4のそれぞれで示される位置P1,P2,P3,P4に対応するSADテーブル要素にそれぞれ加算する。
この実施形態では、以上の処理を、サーチ範囲内のすべての参照ブロックについて行なう。
以上のことから、この実施形態では、参照ベクトルRVを1/nに縮小する場合には、全ての参照ベクトルに1対1に対応する従来サイズのSADテーブルTBLoに対して、水平方向に1/n、また、垂直方向に1/nに縮小した縮小SADテーブルTBLsを用意して、この縮小SADテーブルTBLsのテーブル要素として、参照縮小ベクトルCVの近傍の参照ベクトルに対応するSAD値を求めるようにすれば良い(図6参照)。
したがって、この実施形態の場合には、縮小SADテーブルTBLsのテーブル要素の数は、従来のSADテーブルTBLoのテーブル要素数の1/n2となり、テーブルサイズを大幅に小さくすることが可能である。
なお、上述の実施形態の説明においては、参照縮小ベクトルCVの近傍の4個の参照ベクトルを検出し、当該4個の近傍参照ベクトルに対応するSADテーブル要素に対して、対照の参照ブロック(参照ベクトルRV)について算出したSAD値を線形加重分散加算するようにしたが、参照縮小ベクトルCVの近傍の複数の参照ベクトルの選び方およびその近傍参照ベクトルに対応するSADテーブル要素に対する分散加算の方法は、上述の例に限られるものではない。
例えば、参照縮小ベクトルCVの近傍の9個もしくは16個の参照ベクトルを検出し、当該9個もしくは16個の近傍参照ベクトルに対応するSADテーブル要素に対して、いわゆるキュービック(Cubic)補間による分散加算を行なうようにすれば、より精度は高くなる。しかし、リアルタイム性と演算回路の削減を重視すると、上述した近傍4個の参照ベクトルに対応するテーブル要素への線形加重分散加算が、より有効である。
この実施形態においても、参照ブロックをサーチ範囲内で遍く移動させ、全ての参照ブロックのSAD値に対してSADテーブル(この実施形態では縮小SADテーブル)への代入を行う点は、従来手法と同じである。
ただし、従来は、参照ベクトルとSADテーブル要素のアドレスが1対1に対応していたため、SADテーブルへは単なる代入で済んだが、この実施形態による手法では、参照ブロックについて算出したSAD値を分散加算させるため、縮小SADテーブルにおいて、参照ベクトルとテーブルアドレスは1対1ではない。したがって、この実施形態の手法の場合には、SAD値のテーブルアドレスへの単なる代入ではなく、加算して代入する、いわゆる代入加算である必要がある。また、そのため、SADテーブル(縮小SADテーブル)の各テーブル要素は、最初に初期化(0クリア)しておかなければならない。
ところで、従来のブロックマッチング手法では、以上のようにして完成させたSADテーブルにおいて、SAD値が最小値となるテーブル要素を探索し、その最小値となるテーブル要素のテーブルアドレスを、参照ベクトルに変換すれば、動ベクトルの検出を完了した。
これに対して、この実施形態による手法では、SADテーブルは、参照ベクトルを縮小した参照縮小ベクトルに対応した縮小SADテーブルであるため、当該縮小SADテーブルの最小値がそのまま正確な動きベクトルには対応していない。
もっとも、ある程度の誤差を許す装置の場合には、縮小SADテーブルの最小値となるテーブル要素のテーブルアドレスを、参照ベクトルに変換したものを、さらに縮小率1/nの逆数倍、つまりn倍することで、動きベクトルを検出するようにすることもできる。
しかし、より正確な動きベクトルを検出するようにする場合には、以下に説明するように、縮小SADテーブルのテーブル要素値に対して補間処理を施すことで、元のベクトル精度で、正確な動きベクトルを検出するようにする。
[より正確な動きベクトルを検出するための補間処理の第1の例]
より正確な動きベクトルを検出するための補間処理の第1の例は、縮小SADテーブルにおける複数個のSADテーブル要素値(SAD値)を、1つの2次曲面で近似する手法である。この手法は、前述した特許文献1に記載されている手法を縮小SADテーブルに対して適用した手法である。
すなわち、縮小SADテーブルにおいて、SAD値が最小値となるテーブル要素(整数精度最小値テーブル要素(整数精度テーブルアドレス))と、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素とを求め、それらのテーブル要素のSAD値を用いて、最小自乗法によりSAD値の2次曲面を決定し、この2次曲面の最小値となるSAD値を検出し、当該検出した最小値となるSAD値に対応する位置(参照フレーム上において、基準位置に対してずれた位置)を検出し、当該検出した位置を小数精度の最小値テーブルアドレス(縮小SADテーブルにおいてSAD値が最小値となるベクトル(最小値ベクトルという)に対応)とする。
この場合、一意の2次曲面を定めるためには、図9(A)または(B)に示すように、整数精度最小値テーブル要素tmと、当該テーブル要素tmをその両側から挟む位置の、当該テーブル要素tmの近傍の4個の整数精度テーブル要素t1,t2,t3,t4が最低限必要である。
そして、図10に示すように、参照フレームのサーチ範囲内の縮小SADテーブルに対応する参照縮小ベクトルの範囲内において、ターゲットフレームの位置を基準位置(0,0)として、水平方向および垂直方向のずれ量(参照縮小ベクトルに対応)の軸vx/nおよび軸vy/nを考えると共に、これらの軸vx/nおよび軸vy/nに垂直な軸として、SAD値の軸を考え、これら3軸からなる座標空間を想定する。
そして、例えば、整数精度最小値テーブル要素tmのSAD値と、当該整数精度最小値テーブル要素tmを挟む2個のテーブル要素t1、t3のSAD値とから、図10の座標空間において2次曲線を生成する。また、整数精度最小値テーブル要素tmのSAD値と、当該最小値テーブル要素tmを挟む他の2個のテーブル要素t2、t4のSAD値とから、図10の座標空間において、他の2次曲線を生成する。そして、これら2個の2次曲線を含む2次曲面201を、最小自乗法により求め、その2次曲面201を、図10に示すように、座標空間において生成する。
そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図10の位置203)を検出し、当該検出した位置(vx/n,vy/n)を、小数精度のテーブル要素(テーブルアドレス)として検出する。そして、検出した小数精度テーブル要素に対応するベクトル(最小値ベクトル)204を、図11に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
例えば、図12に示すように、参照ベクトルを1/4に縮小した場合における縮小SADテーブルTBLsの、小数精度テーブル要素の最小値アドレスから求められる最小値ベクトル204が、(−0.777,−1.492)の場合に、これらを4倍した(−3.108,−5.968)が、動きベクトル205となる。この動きベクトル205は、元画像のスケールにおける動きベクトルを再現したものとなっている。
以上の説明は、整数精度最小値テーブル要素tmと、その近傍の4テーブル要素を用いた場合として説明したが、SAD値の2次曲面を最小自乗法により求めるためには、より多くの複数近傍テーブル要素を用いたほうがよい。そこで、一般には、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=m×m個(mは3以上の整数)の矩形領域のテーブル要素を用いるようにする。
しかし、この複数近傍テーブル要素の数は、多ければ良いというものではなく、広い範囲のテーブル要素を用いると、演算量の増加を招く上、画像パターンに依存するローカルミニマムの偽値を使用してしまう可能性も高まるので、適切な複数近傍テーブル要素の数からなる矩形領域のテーブル要素を用いるようにする。
適切な複数近傍テーブル要素の数からなる矩形領域のテーブル要素の例として、この実施形態では、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域のテーブル要素を用いるようにする例と、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域のテーブル要素を用いるようにする例とについて説明する。
[3×3個の矩形領域のテーブル要素を用いる例]
図13に、整数精度最小値テーブル要素tmを中心として、その周囲の水平方向×垂直方向=3×3個の矩形領域(図13で塗りを付して示してある)のテーブル要素を用いるようにする例を示す。
この図13の例の場合には、図13(A)に示すように、整数精度最小値テーブル要素tmと、その近傍の8個の近傍テーブル要素のSAD値を用いて、図13(B)に示すような2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図13(B)の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図11に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、SAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図14に示すように、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標を考える。この場合、周辺の8個のテーブル要素の位置は、3個のx軸方向の位置、すなわち、x=−1、x=0、x=1と、3個のY軸方向の位置、すなわち、y=−1、y=0、y=1との繰り合わせで表され、(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(0,1)、(−1,1)、(0,1)、(1,1)の8位置となる。
そして、図14のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、右下の位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx、dy)は、図15に示す(式A)および(式B)により、求めることができる。
図15の(式A)および(式B)において、
x=−1のとき、Kx=−1
x=0のとき、Kx=0
x=0のとき、Kx=1
となる。また、
y=−1のとき、Ky=−1
y=0のとき、Ky=0
y=0のとき、Ky=1
となる。
こうして求められた小数精度の位置(dx,dy)は、整数精度最小値テーブル要素tmの位置を原点(0,0)とする位置であるので、この小数精度の位置(dx,dy)と整数精度最小値テーブル要素tmの位置とから、求めるサーチ範囲の中心位置からの位置203を検出することができる。
[4×4個の矩形領域のテーブル要素を用いる例]
図16に、整数精度最小値テーブル要素tmをほぼ中心として、その周囲の水平方向×垂直方向=4×4個の矩形領域のテーブル要素(図16で塗りを付して示してある)を用いるようにする例を示す。
この場合に、整数精度最小値テーブル要素tmと、その近傍の8テーブル要素(3×3)や、その近傍の24テーブル要素(5×5)のように、前記mの値が奇数である場合には、整数精度最小値テーブル要素tmは、常に、使用する矩形領域の複数のテーブル要素の中心になるため、使用するテーブル範囲は単純に決定する。
これに対して、近傍の15テーブル要素(4×4)のように、mが偶数である場合には、整数精度最小値テーブル要素tmは、使用する矩形領域の複数のテーブル要素の中心位置とはならないので、若干の工夫が必要となる。
つまり、整数精度最小値テーブル要素tmから見て、水平方向に左右の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4列目として採用する。同様に、垂直方向に上下の隣接テーブル要素のSAD値を比較し、小さい値となった側の方向の、当該方向の隣接テーブル要素に隣接するテーブル要素を近傍テーブル要素の4行目として採用する。
図16の例では、整数精度最小値テーブル要素tmの水平方向に左右の隣接テーブル要素のSAD値は、「177」と「173」であるので、SAD値が小さい右隣の値「173」のテーブル要素のさらに右隣の列を第4列目として採用する。また、整数精度最小値テーブル要素tmの垂直方向に上下の隣接テーブル要素のSAD値は、「168」と「182」であるので、SAD値が小さい上隣の値「168」のテーブル要素のさらに上隣の行を第4行目として採用する。
そして、図16の例の場合には、整数精度最小値テーブル要素tmと、その近傍の15個の近傍テーブル要素のSAD値を用いて、2次曲面201を、最小自乗法により生成する。そして、生成されたSAD値の2次曲面201の最小値202を検出し、その最小値を取るSAD値に対応する位置(vx/n,vy/n)(図16の位置203)を検出し、当該検出した位置203を、小数精度の最小値テーブル要素位置(小数精度最小値テーブルアドレス)として検出する。
そして、検出した小数精度テーブル要素位置203に対応するベクトル(最小値ベクトル)204を、前述した図11に示すようにn倍して、元の大きさ精度の動きベクトル205を得る。
ここで、この例の場合におけるSAD値の2次曲面201の最小値202に対応する位置203の算出方法は、次のようになる。すなわち、図17に示すように、整数精度最小値テーブル要素tmの位置を原点(0,0)とする(x,y)座標を考える。
この例の場合には、16テーブル要素からなる矩形領域中における整数精度最小値テーブル要素tmの位置に応じて、図17(A),(B),(C),(D)のような4通りのテーブル要素配置を考える必要がある。
この場合、周辺の15個のテーブル要素の位置は、図17(A),(B),(C),(D)から分かるように、4個のx軸方向の位置、すなわち、x=−1、x=0、x=1、x=2またはx=−2と、4個のY軸方向の位置、すなわち、y=−1、y=0、y=1、y=2またはy=−2との繰り合わせで表される15位置となる。
そして、図17のテーブルにおける各テーブル要素のSAD値を、Sxyとする。したがって、例えば、整数精度最小値テーブル要素tm(位置(0,0))のSAD値はS00と表され、また、位置(1,1)のテーブル要素値のSAD値はS11と表される。
すると、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(x,y)座標における小数精度の位置(dx,dy)は、図18に示す(式C)および(式D)により、求めることができる。
ここで、図18の(式C)および(式D)において、KxおよびKyは、整数精度最小値テーブル要素tmおよびその周辺の16テーブル要素からなる矩形領域中の中心位置を原点(0,0)とする(Kx,Ky)座標を考えたときの、前記図17(A),(B),(C),(D)に示した4通りのテーブル要素配置に応じた値となる。このときの(Kx,Ky)座標を図19に示す。
すなわち、図17(A)の場合には、
x=−2のとき、Kx=−1.5
x=−1のとき、Kx=−0.5
x=0のとき、Kx=0.5
x=1のとき、Kx=1.5
となる。また、
y=−2のとき、Ky=−1.5
y=−1のとき、Ky=−0.5
y=0のとき、Ky=0.5
y=1のとき、Ky=1.5
となる。
また、図17(B)の場合には、
x=−2のとき、Kx=−1.5
x=−1のとき、Kx=−0.5
x=0のとき、Kx=0.5
x=1のとき、Kx=1.5
となる。また、
y=−1のとき、Ky=−1.5
y=0のとき、Ky=−0.5
y=1のとき、Ky=0.5
y=2のとき、Ky=1.5
となる。
また、図17(C)の場合には、
x=−1のとき、Kx=−1.5
x=0のとき、Kx=−0.5
x=1のとき、Kx=0.5
x=2のとき、Kx=1.5
となる。また、
y=−2のとき、Ky=−1.5
y=−1のとき、Ky=−0.5
y=0のとき、Ky=0.5
y=1のとき、Ky=1.5
となる。
また、図17(D)の場合には、
x=−1のとき、Kx=−1.5
x=0のとき、Kx=−0.5
x=1のとき、Kx=0.5
x=2のとき、Kx=1.5
となる。また、
y=−1のとき、Ky=−1.5
y=0のとき、Ky=−0.5
y=1のとき、Ky=0.5
y=2のとき、Ky=1.5
となる。
また、図18の(式C)および(式D)におけるΔxおよびΔyは、(Kx,Ky)座標に対する図17(A),(B),(C),(D)の各テーブル要素配置における(x,y)座標とのずれ量を表しており、
図17(A)の場合には、Δx=−0.5、Δy=−0.5、
図17(B)の場合には、Δx=−0.5、Δy=0.5、
図17(C)の場合には、Δx=0.5、Δy=−0.5、
図17(D)の場合には、Δx=0.5、Δy=0.5、
となる。
こうして求められた小数精度の位置(dx,dy)は、整数精度最小値テーブル要素tmの位置を原点(0,0)とする位置であるので、この小数精度の位置(dx,dy)と整数精度最小値テーブル要素tmの位置とから、求めるサーチ範囲の中心位置からの位置203を検出することができる。
[より正確な動きベクトルを検出するための補間処理の第2の例]
より正確な動きベクトルを検出するための補間処理の第2の例は、縮小SADテーブルにおける整数精度最小値テーブル要素を含む複数個の水平方向のテーブル要素のSAD値を用いて水平方向の3次曲線を生成すると共に、整数精度最小値テーブル要素を含む複数個の垂直方向のテーブル要素のSAD値を用いて垂直方向の3次曲線を生成し、それぞれの3次曲線の極小値となる位置(vx,vy)を検出して、検出した位置を小数精度の最小値アドレスとするものである。
図20は、この第2の例を説明するための図である。前述の第1の例と同様にして、整数精度最小値テーブル要素tmと、この整数精度最小値テーブル要素を中心とする複数の整数精度テーブル要素、図20の例では、4×4=16個のテーブル要素を求める(図20(A)で塗りを付した部分参照)。
次に、第1の例と同様にして、図20(B)に示すように、参照フレームのサーチ範囲内の縮小SADテーブルに対応する参照縮小ベクトルの範囲内において、ターゲットフレームの位置を基準位置(0,0)として、水平方向および垂直方向のずれ量(参照縮小ベクトルに対応)の軸vx/nおよび軸vy/nを考えると共に、これらの軸vx/nおよび軸vy/nに垂直な軸として、SAD値の軸を考え、これら3軸からなる座標空間を想定する。
次に、整数精度最小値テーブル要素tmの周囲の16個のテーブル要素のうち、整数精度最小値テーブル要素tmを含む4個の水平方向のテーブル要素のSAD値を用いて、前記座標空間に水平方向の3次曲線206を生成する。この水平方向の3次曲線206の極小値に対応する水平方向の位置vx/nとして、小数精度最小値テーブル要素位置の水平方向位置を検出する。
次に、整数精度最小値テーブル要素tmの周囲の16個のテーブル要素のうち、整数精度最小値テーブル要素tmを含む4個の垂直方向のテーブル要素のSAD値を用いて、前記座標空間に垂直方向の3次曲線207を生成する。この垂直方向の3次曲線207の極小値に対応する垂直方向の位置vy/nとして、小数精度最小値テーブル要素位置の垂直方向位置を検出する。
以上により求めた小数精度最小値テーブル要素位置の水平方向の位置と、垂直方向の位置から、小数精度最小値テーブル要素位置(小数精度最小値テーブルアドレス)208を検出する。そして、当該検出した小数精度テーブル要素位置208に対応するベクトル(最小値ベクトル)209を、前述した図11に示すようにn倍して、元の大きさ精度の動きベクトルを得る。
すなわち、第2の例は、第1の例で説明した方法により、水平方向、垂直方向のそれぞれの4個のテーブル要素を確定し、図20(B)に示すように、水平方向、垂直方向のそれぞれで、3次曲線を一意に定める手法である。
ここで、SAD値の3次曲線206および209の最小値202に対応する位置208の算出方法は、次のようになる。すなわち、水平方向または垂直方向のいずれかの方向における3次曲線において、最小値の近傍の4点のSAD値を、前記水平方向または垂直方向のいずれかの方向に沿った順番に、S0、S1、S2、S3としたとき、小数精度の最小値が、図21に示す3つの区間Ra,Rb,Rcのいずれにあるかにより、最小値を取る小数成分uを算出する式が異なる。
ここで、区間RaはSAD値S0となる位置とSAD値S1となる位置との間の区間、RbはSAD値S1となる位置とSAD値S2となる位置との間の区間、RcはSAD値S2となる位置とSAD値S3となる位置との間の区間である。
そして、小数精度の最小値が、図21に示す区間Raにあるときには、図22の(式E)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
また、同様に、小数精度の最小値が、図21に示す区間Rbにあるときには、図22の(式F)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
さらに、小数精度の最小値が、図21に示す区間Rcにあるときには、図22の(式G)により、整数精度の最小値の位置に対する最小値を取る位置までのずれの小数成分uが算出される。
そして、小数精度の最小値が、図21に示す3つの区間Ra,Rb,Rcのいずれにあるかの判別は、次のようにして行なう。
すなわち、図23は、その判別を説明するための図である。図23(A),(B),(C)に示すように、先ず、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とを検出し、小数精度の最小値は、検出された整数精度のSAD値の最小値Sminの位置と、2番目に小さい整数精度のSAD値Sn2の位置との間の区間に存在するとして検出する。次に、整数精度のSAD値の最小値Sminと、2番目に小さい整数精度のSAD値Sn2とが、図21に示したSAD値S0、S1、S2、S3のいずれの位置となっているかにより、検出した区間が区間Ra,Rb,Rcのいずれであるかの判別を行なう。
なお、図23(D)に示すように、整数精度のSAD値の最小値SminがSAD値のまたは位置にあって、4個のテーブル要素値の端に位置する場合には、最小位置が推定できないとして、この実施形態では、エラーとして扱い、最小値位置の算出は行なわないようにする。もっとも、この図23(D)のような場合においても、最小値位置を算出するようにしてもよい。
以上のようにして、この実施形態によれば、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いて、元の画像スケールにおける動きベクトルを検出することができる。この場合に、1/n2にスケールダウンした小さいサイズの縮小SADテーブルを用いているにも関わらず、従来とほぼ同様のベクトル検出結果が得られることを図24に示す。
図24の横軸は、水平方向または垂直方向の一方についての1次元方向の縮小倍率nであり、また、縦軸は、検出される動きベクトルについての誤差(ベクトル誤差)を示している。図24のベクトル誤差の数値は画素数で表されている。
図24において、曲線301は、縮小倍率に対するベクトル誤差の平均値である。また、曲線302は、縮小倍率に対するベクトル誤差の分散σの3倍値(3σ(99.7%))を示している。曲線303は、曲線302の近似曲線を示している。
図24は、1次元方向の縮小倍率nに対するベクトル誤差を示しているが、SADテーブルは2次元のため、図24に示されるものの2乗の割合でテーブルサイズ(テーブル要素数)が削減されるのに対し、ベクトル誤差は、線形程度にしか増加しないことから、この実施形態による手法の有用性が分かる。
また、n=64(縮小率1/64)倍の縮小倍率でも、ベクトル誤差は小さく、全く異なる動きベクトルを検出出力とするような破綻は見られないことから、実質、1/4096に、SADテーブルのサイズを削減可能であると言える。
また、前述したように、動画の手ぶれ補正においては、リアルタイム性とシステム遅延の削減が強く求められるのに対し、精度については、破綻した全く異なる動きベクトルが検出される場合を除き、ある程度のベクトル検出誤差に対して寛容である。したがって、破綻しないままSADテーブルのサイズを大きく削減することができる、この実施形態は有用性が高いと言える。
以上説明した実施形態の画像処理方法は、従来手法として説明した特許文献4に記載された画像を縮小変換したサイズで動きベクトルを検出する手法に比べて、次に挙げる2つの点において、大きく異なるメリットを有するものである。
まず、第一に、この実施形態による手法は、特許文献4に記載された従来手法と異なり、画像を縮小変換するプロセスを全く必要としない。この実施形態による手法においては、参照ブロックについて算出したSAD値を、SADテーブル(縮小SADテーブル)に代入加算する際に、同時に縮小倍率に相当するアドレス変換を行なうからである。
これにより、この実施形態による手法においては、特許文献4に記載された従来手法のような画像の縮小変換のためのロジックも、縮小した画像をメモリに格納する時間およびバンド幅の浪費も、縮小画像をメモリに貼る領域確保も必要ない、というメリットを有する。
特許文献4に記載された従来手法のもう1つ重要な問題点として、前述も使用にしたように、画像を縮小変換する際のエイリアシング(折り返し歪み)や、低照度ノイズ除去のためのローパスフィルタの存在の問題がある。すなわち、画像縮小する際には、適切なローパスフィルタを通してからリサンプリングを行なわなければならず、さもないと、不要なエイリアシングが発生し、その縮小画像を用いた動きベクトルの精度が著しく損なわれるからである。
縮小変換の際の理想的なローパスフィルタの特性としては、sinc関数に類似した関数であることが、理論的に証明されている。sinc関数自体は、sin(xπ)/(xπ)の形で表されるカットオフ周波数f/2の無限タップのFIR(Finite Impulse Response)フィルタであるが、縮小倍率1/nのときの理想的なカットオフ周波数f/(2n)のローパスフィルタとしては、sin(xπ/n)/(xπ/n)と表される。しかし、これもsinc関数の一形態として良い。
図25〜図27の上側には、それぞれ縮小倍率が1/2倍、1/4倍、1/8倍のときのsinc関数(ローパスフィルタの理想特性)の形状を示す。この図25〜図27から、縮小倍率が大きくなればなる程、関数がタップ軸方向に拡大して行くことが分かる。つまり、無限タップのsinc関数を主要な係数のみで近似する場合にも、FIRフィルタのタップ数を増加させなければならないと言える。
また、一般的に、より低い帯域のカットオフ周波数を実現するフィルタは、フィルタ形状よりもタップ数が、その性能に対して支配的になって行くことが知られている。
したがって、特許文献4に記載の従来手法の縮小画像を用いる動きベクトル演算手法の場合、画像の縮小倍率が大きくなればなる程、そのSADテーブル削減効果が大きいにも関わらず、画像生成する際の前処理用フィルタとしてのローパスフィルタは、縮小倍率が大きくなればなる程、コストが増加してしまう、という矛盾を併せ持つのである。
一般に、高次タップのFIRフィルタを実現する場合、演算ロジックのコストがタップ数の2乗に比例して増加するため、問題となるが、より大きい問題は、垂直フィルタ実現のためのラインメモリ数の増加である。近年のデジタルスチルカメラにおいては、画素数向上に伴うラインメモリのサイズ削減のため、いわゆる短冊処理を行なっているが、例え、1ライン当たりのサイズを削減したとしても、ラインメモリそのものの本数が増加することは、物理レイアウトエリアで換算されるトータルコストを著しく押し上げる。
以上、述べたように、特許文献4に記載の従来手法の画像縮小によるアプローチは、特に垂直ローパスフィルタの実現において、大きな壁が立ちはだかっていることが分かる。それに対し、この発明の手法は、全く異なる形で簡潔にこの問題を解決している。
図25〜図27の下側に、この実施の形態で用いる新規なブロックマッチング手法におけるローパスフィルタのイメージを示す。この実施の形態で用いる新規なブロックマッチング手法においては、画像縮小処理を伴っていないが、縮小SADテーブルの生成演算過程におけるローパスフィルタのイメージを図示したものである。
図25〜図27の下側に示されるように、このローパスフィルタの特性は、sinc関数の主要係数部分を線形で近似した、シンプルなフィルタ特性ではあるものの、縮小倍率に連動してタップ数が増加していることが分かる。これは、先に述べた、カットオフ周波数が低くなる程、ローパスフィルタの性能はタップ数が支配的になる、という事実に好適である。つまり、実施形態の線形加重分散加算を行なう処理のような、この発明におけるSAD値の分散加算を行なう処理そのものが、倍率連動の高性能ローパスフィルタを、シンプルな回路で実現していることと等価なのである。
このローパスフィルタに絡んで、他にもメリットがある。特許文献4記載の従来手法では、ローパスフィルタをかけた後、リサンプリングすることで画像を縮小するが、この時点で相当数の画像情報が失われる。つまり、ローパスフィルタの演算において、画像情報の輝度値の語長は大幅に丸められてメモリに格納され、殆どの画素情報の下位ビットは、縮小後の画像に影響を与えないのである。
一方、この実施の形態で用いる新規なブロックマッチング手法においては、全ての画素の輝度値の全ビット情報を、遍く平等に使用してSAD値を演算し、その分散加算値を求めて縮小SADテーブルに加算する。縮小SADテーブルの各テーブル要素値の語長さえ増やせば、最終的なSAD値の出力まで、一切の丸め誤差を含まない形で演算可能である。縮小SADテーブルの面積はフレームメモリに比較して小さいため、縮小SADテーブルの語長拡張は大きな問題にならない。その結果として、縮小SADテーブル並びに動きベクトル検出を、高精度に実現できるのである。
以上の説明は、注目画面である参照フレーム102について、一つのターゲットブロックを考え、当該ターゲットブロックを中心としたサーチ範囲を設定して、そのサーチ範囲における動きベクトルを検出する場合の説明であるが、実際の手ぶれ補正システムにおいては、元フレーム101を複数の領域に分割し、それぞれの分割領域において、それぞれターゲットブロック設定する。そして、参照フレーム102では、それぞれのターゲットブロックの射影イメージを中心としてサーチ範囲を設定して、それぞれのサーチ範囲において動きベクトル205を検出するようにする。
そして、CCDイメージャを撮像素子として使用する手ぶれ補正システムにおいては、参照フレームにおいて取得したそれらの複数個のターゲットブロックについて得られた複数個の動きベクトルを用いて、過去のフレームにおけるそれらの動きベクトルからの推移も加味しながら統計的に処理することで、1フレームについて1つのグローバルベクトル、即ち、フレームの手ぶれベクトルを確定するようにする。
これに対して、この実施の形態では、一つのフレームについて、複数個のターゲットブロックおよびサーチ範囲を設定し、それらの複数個のターゲットブロックについて得られた複数個の動きベクトルを用いて、前述した分割画像区間のそれぞれについての、手ぶれ速度ベクトルを算出するようにする。
すなわち、この実施の形態では、図28に示すように、1フレームの画像領域を、前述した分割画像区間に対応して、垂直方向に8分割すると共に、この例では、水平方向にも8分割して、合計64個の分割領域にする。
そして、図28に示すように、64個の分割領域のそれぞれにおいて検出したい64個の動きベクトル205の基準位置PO1〜PO64のそれぞれを中心とするサーチ範囲SR1,SR2,・・・,SR64を定め、各サーチ範囲において、ターゲットブロックの射影イメージブロックIB1,IB2,・・・,IB64を想定する。この場合、ターゲットブロックの射影イメージブロックIB1,IB2,・・・,IB64は、隣り合うもの同士で重なり合うことはないが、サーチ範囲SR1,SR2,・・・,SR64は、図28から明らかなように、隣り合うもの同士では、互いに領域的に重なり合うものとなってもよい。
そして、この射影イメージブロックIB1,IB2,・・・,IB64と同じ大きさの参照ブロックを設定し、各サーチ範囲SR1,SR2,・・・,SR64内を、設定した参照ブロックを移動させて、上述と同様にして、縮小SADテーブルを生成し、各サーチ範囲SR1,SR2,・・・,SR64のターゲットブロックTG1〜TG64(ターゲットブロックTG1〜TG64の図示は、省略)についての合計64個の動きベクトル205V01〜205V64を検出するようにする。
そして、この実施の形態では、図29に示すように、前述した分割画像領域Pdiv_0〜Pdiv_7のそれぞれに対応する同じ垂直方向の領域に含まれる8個のターゲットブロックについての8個の動き手ぶれベクトルを平均化することにより、それぞれの分割画像領域Pdiv_0〜Pdiv_7についての手ぶれ動きベクトルVCdiv_0〜VCdiv_7を算出するようにする。
すなわち、検出された動きベクトル205V1〜205V8について、平均化処理をすることにより、分割画像区間Pdiv_0についての手ぶれ動きベクトルVCdiv_0を算出し、検出された動きベクトル205V9〜205V16について、平均化処理をすることにより、分割画像区間Pdiv_1についての手ぶれ動きベクトルVCdiv_1を算出し、検出された動きベクトル205V17〜205V24について、平均化処理をすることにより、分割画像区間Pdiv_2についての手ぶれ動きベクトルVCdiv_2を算出し、検出された動きベクトル205V25〜205V32について、平均化処理をすることにより、分割画像区間Pdiv_3についての手ぶれ動きベクトルVCdiv_3を算出し、検出された動きベクトル205V33〜205V40について、平均化処理をすることにより、分割画像区間Pdiv_4についての手ぶれ動きベクトルVCdiv_4を算出し、検出された動きベクトル205V41〜205V48について、平均化処理をすることにより、分割画像区間Pdiv_5についての手ぶれ動きベクトルVCdiv_5を算出し、検出された動きベクトル205V49〜205V56について、平均化処理をすることにより、分割画像区間Pdiv_6についての手ぶれ動きベクトルVCdiv_6を算出し、検出された動きベクトル205V57〜205V64について、平均化処理をすることにより、分割画像区間Pdiv_7についての手ぶれ動きベクトルVCdiv_7を算出する。
ここで、平均化処理をする際には、各分割画像区間に含まれる8個の動きベクトル205Vi〜205V(i+7)(ただし、i=1、9、17、25、33、41、49、57である)について、例外的な動きベクトルがあれば、当該例外的な動きベクトルは平均化処理から除去するようにする。
例外的な動きベクトルであるかどうかの判別は、この実施の形態では、各動きベクトルについて、それと水平方向および垂直方向に隣接するターゲットブロックについて検出された動きベクトルと比較して、その比較結果のベクトル差が、予め定めたしきい値よりも大きいか否かにより行い、前記比較結果のベクトル差が、予め定めたしきい値よりも大きいと判別したときには、その動きベクトルは平均化処理から除去する動きベクトルであると判別するようにする。
なお、例外的な動きベクトルであるかどうかの判別は、上述のような判別方法に限られるものではない。例えば、一つの分割画像区間の動きベクトルについての例外的な動きベクトルの判別に際し、当該分割画像区間およびその上下に(垂直方向に)隣接する分割画像区間のすべての動きベクトルの平均値および分散を求め、求めた平均値と、判別対象の動きベクトルとの差が、求めた分散の範囲内であるか否かにより判別するようにしても良い。
そして、この実施の形態では、分割画像区間Pdiv_0〜Pdivのそれぞれの手ぶれ速度ベクトルVec_0〜Vec_7は、自分割画像区間の手ぶれ動きベクトルと、一つ後の隣接する分割画像区間の手ぶれ動きベクトルとの差分(変化分)として検出する。すなわち、
Vec_0=VCdiv_1−VCdiv_0
Vec_1=VCdiv_2−VCdiv_1
Vec_2=VCdiv_3−VCdiv_2
Vec_3=VCdiv_4−VCdiv_3
Vec_4=VCdiv_5−VCdiv_4
Vec_6=VCdiv_7−VCdiv_6
・・・(式3)
として手ぶれ速度ベクトルVec_0〜Vec_7を算出する。
1フレームの画像の垂直方向の最後の分割画像区間Pdiv_7の後の垂直方向の分割画像区間は存在しないので、当該分割画像区間Pdiv_7についての手ぶれ速度ベクトルは、上述のような差分演算では算出することができない。
この実施の形態では、この分割画像区間Pdiv_7についての手ぶれ動きベクトルは、当該分割画像区間Pdiv_7よりも垂直方向に前の1〜複数の分割画像区間の手ぶれ速度ベクトルから予測したものを用いるようにする。なお、垂直方向に一つ前の分割画像区間の手ぶれ速度ベクトルを、当該分割画像区間Pdiv_7の手ぶれ速度ベクトルとして用いるようにしても良い。
なお、求めた各分割画像区間Pdiv_0〜Pdiv_7についての手ぶれ速度ベクトルVec_0〜Vec_7の逆符号成分が、手ぶれ補正およびフォーカルプレーン現象による画像歪みを補正に用いられることは前述したとおりである。
そして、この実施の形態では、1フレームの垂直方向の先頭の分割画像区間Pdiv_0についての手ぶれ動きベクトルVCdiv_0は、当該1フレームの手ぶれベクトルとする。そして、当該フレームの画像データの画像メモリからの読み出しを、前フレームの画像データに対して、この分割画像区間Pdiv_0についての手ぶれ動きベクトルVCdiv_0に基づいて算出された変位量だけシフトした画像位置(対応するメモリアドレス位置)から開始するようにする。
さらに、この実施の形態では、各分割画像区間Pdiv_0〜Pdiv_7についての手ぶれ速度ベクトルVec_0〜Vec_7の逆符号成分を時間積分することにより算出した画像歪み変位量分だけ、画像メモリからの各画像データの水平方向および垂直方向の読み出し位置をシフトするようにすることにより、手ぶれおよびフォーカルプレーン現象に基づく画像歪みをキャンセルするように補正する。
[この発明による画像信号の歪み補正装置の第1の実施形態]
以上のような特徴を備える画像信号の歪み補正装置の第1の実施の形態として、撮像装置の場合を例にとって、図を参照しながら説明する。図30は、この発明の画像信号の歪み補正装置の実施形態としての撮像装置の一例のブロック図を示すものである。
図30に示すように、この実施形態の撮像装置は、システムバス2にCPU(Central Processing Unit)1が接続されると共に、システムバス2に、撮像信号処理系10や、ユーザ操作入力部3、画像メモリ部4、記録再生装置部5などが接続されて構成されている。なお、この明細書においては、CPU1は、種々のソフトウエア処理を行なうプログラムを記憶するROM(Read Only Memory)やワークエリア用RAMなどを含むものとしている。
ユーザ操作入力部3を通じた撮像記録開始操作を受けて、図30の撮像装置は、後述するような撮像画像データの記録処理を行なう。また、ユーザ操作入力部3を通じた撮像記録画像の再生開始操作を受けて、図30の撮像装置は、記録再生装置部5の記録媒体に記録された撮像画像データの再生処理を行なう。
そして、この実施の形態では、ユーザ操作入力部3を通じて、ユーザからの画像拡大・縮小指示入力や、解像度指示入力、また、ズーム倍率の値の指示入力が制御部としてのCPU1に与えられる。CPU1は、それらの指示入力に応じた制御信号を形成し、タイミング信号発生部12や各処理部に供給する。
図30に示すように、撮像レンズ10Lを備えるカメラ光学系(図示は省略)を通じた被写体からの入射光は、撮像素子11に照射されて撮像される。この例では、撮像素子11は、CMOS(Complementary Metal Oxide Semiconductor)イメージャで構成されている。
この例の撮像装置においては、撮像記録開始操作がなされると、撮像素子11からは、タイミング信号発生部12からのタイミング信号によりサンプリングされることにより、赤(R)、緑(G)、青(B)の3原色から構成されるベイヤー配列のRAW(Read After Write)信号であるアナログ撮像信号が出力される。
この例では、撮像素子11からは、タイミング信号発生部12からのタイミング信号により1ライン単位が同時に取り出される(サンプリングされる)ことによりアナログ撮像信号とされて出力される。
出力されたアナログ撮像信号は、前処理部13に供給され、欠陥補正やγ補正等の前処理が施され、データ変換部14に供給される。
データ変換部14は、これに入力されたアナログ撮像信号から、輝度信号成分Yと、色差信号成分Cb/Crとにより構成されるデジタル撮像信号(YCデータ)に変換し、そのデジタル撮像信号をシステムバスを介して、画像メモリ部4に供給する。
画像メモリ部4は、この図30の例においては、2個のフレームメモリ41,42からなり、データ変換部14からのデジタル撮像信号は、先ず、フレームメモリ41に格納される。そして、1フレーム経過すると、フレームメモリ41に記憶されているデジタル撮像信号が、フレームメモリ42に転送されると共に、フレームメモリ41には、データ変換部14からの新たなフレームのデジタル撮像信号が書き込まれる。したがって、フレームメモリ42には、フレームメモリ41に格納されているフレーム画像よりも1フレーム分前のフレーム画像が格納されている。
そして、手ぶれ動きベクトル検出部15は、システムバス2を介して、これら2個のフレームメモリ41およびフレームメモリ42をアクセスして、その格納データを読み出し、前述したような分割画像区間毎の動きベクトル検出処理を実行する。この場合、フレームメモリ42に格納されているフレーム画像は、元フレームの画像とされ、また、フレームメモリ41に格納されているフレーム画像は、参照フレームの画像とされる。
そして、手ぶれ動きベクトル検出部15は、その検出結果である前述したような分割画像区間毎の動きベクトルを、その後段の歪み補正解像度変換部16に制御信号として伝達する。
歪み補正解像度変換部16は、手ぶれ動きベクトル検出部15から受け取った分割画像区間毎の動きベクトルから手ぶれ速度ベクトルを算出し、算出した手ぶれ速度ベクトルに基づいて画像歪み補正量を算出する。そして、算出した画像歪み補正量にしたがって、フレームメモリ42に格納されている遅延フレームの画像データを切り出しながら、必要な解像度および画像サイズに変換する処理をする。このフレームメモリ42からの算出した画像歪み補正量にしたがった切り出しにより、変換後の画像は、手ぶれおよびフォーカルプレーン現象に基づく画像歪みが除去された画像となる。
この歪み補正解像度変換部16からの手ぶれおよびフォーカルプレーン現象に基づく画像歪みが除去された画像データは、NTSC(National Television System Committee)エンコーダ18によりNTSC方式の標準カラー映像信号に変換され、電子式ビューファインダーを構成するモニターディスプレイ6に供給され、撮影時の画像がその表示画面にモニター表示される。
このモニター表示と並行して、歪み補正解像度変換部16からの手ぶれが除去された画像データはコーデック部17で記録変調などのコーディング処理された後、記録再生装置部5に供給されて、DVD(Digital Versatile Disc)などの光ディスクやハードディスクなどの記録媒体に記録される。
この記録再生装置部5の記録媒体に記録された撮像画像データは、ユーザ操作入力部3を通じた再生開始操作に応じて読み出され、コーデック部17に供給されて、再生デコードされる。そして、再生デコードされた画像データはNTSCエンコーダ18を通じてモニターディスプレイ6に供給され、再生画像がその表示画面に表示される。なお、図30では、図示を省略したが、NTSCエンコーダ18からの出力映像信号は、映像出力端子を通じて外部に導出することが可能とされている。
上述した手ぶれ動きベクトル検出部15は、ハードウエアにより構成することできるし、また、DSP(Digital Signal Processor)を用いて構成することもできる。さらには、CPU1によりソフトウエア処理とすることもできる。同様に、歪み補正解像度変換部16も、ハードウエアにより構成することできるし、また、DSP(Digital Signal Processor)を用いて構成することもできる。さらには、CPU1によりソフトウエア処理とすることもできる。
[手ぶれ動きベクトル検出部15における処理動作]
<第1の例>
この手ぶれ動きベクトル検出部15における処理動作の第1の例の流れを、図31および図32のフローチャートを参照して、以下に説明する。
先ず、前述の図3あるいは図28に示したようなサーチ範囲105あるいはサーチ範囲SR1〜SR64のそれぞれ内の1つの参照ブロックIiに対応する参照ベクトル(vx、vy)を指定する(ステップS101)。前述したように、(vx,vy)は、ターゲットブロックのフレーム上の位置(サーチ範囲の中心位置である)を基準位置(0,0)としたときに、指定された参照ベクトルにより示される位置を示し、vxは指定された参照ベクトルによる、基準位置からの水平方向のずれ量成分であり、また、vyは指定された参照ベクトルによる、基準位置からの垂直方向成分のずれ量成分である。そして、前述の従来例で述べたのと同様に、ずれ量vx、vyは、画素を単位とした値とされている。
ここで、サーチ範囲の中心位置を前記基準位置(0,0)とし、サーチ範囲を、水平方向には±Rx、垂直方向には±Ryとしたとき、
−Rx≦vx≦+Rx、−Ry≦vy≦+Ry
とされるものである。
次に、ターゲットブロックIo内の1つの画素の座標(x,y)を指定する(ステップS102)。次に、ターゲットブロックIo内の指定された1つの座標(x,y)の画素値Io(x,y)と、参照ブロックIi内の対応する画素位置の画素値Ii(x+vx,y+vy)との差分絶対値αを、前述した(式1)に示したようにして算出する(ステップS103)。
そして、算出した差分絶対値αを、当該参照ブロックIiの参照ベクトル(vx,vy)が指し示すアドレス(テーブル要素)の、それまでのSAD値に加算し、その加算であるSAD値を、当該アドレスに書き戻すようにする(ステップS104)。すなわち、参照ベクトル(vx,vy)に対応するSAD値を、SAD(vx,vy)と表したとき、これを、前述した(式2)、すなわち、
SAD(vx,vy)=Σα=Σ|Io(x,y)−Ii(x+vx,y+vy)|
・・・(式2)
として算出し、当該参照ベクトル(vx,vy)が指し示すアドレスに書き込むようにする。
次に、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記のステップS102〜ステップS104の演算を行なったか否かを判別し(ステップS105)、ターゲットブロックIo内の全ての座標(x,y)の画素については、未だ、その演算は終了していないと判別したときには、ステップS102に戻り、ターゲットブロックIo内の次の座標(x,y)の画素位置を指定し、このステップS102以降の処理を繰り返す。
以上のステップS101〜ステップS105までの処理は、図5に示したフローチャートのステップS1〜ステップS5と全く同様である。
この実施形態では、ステップS105で、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったと判別したときには、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS106)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS107)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS104で求めたSAD値から、線形加重分散値として求める(ステップS108)。そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS109)。
このステップS109が終了すると、注目中の参照ブロックについてのSAD値の算出が終了したと判別して、サーチ範囲内の全ての参照ブロック、すなわち、全ての参照ベクトル(vx,vy)についての上記のステップS101からステップS109までの演算処理を完了したか否か判別する(図32のステップS111)。
ステップS111で、未だ、上記の演算処理を完了していない参照ベクトル(vx,vy)があると判別すると、ステップS101に戻り、上記の演算処理を完了していない次の参照ベクトル(vx,vy)を設定して、このステップS101以降の処理を繰り返す。
そして、ステップS111で、上記の演算処理を完了していない参照ベクトル(vx,vy)はサーチ範囲内になくなったと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS112)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS113)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS114)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求めるべく動きベクトル(px×n,py×n)を算出する(ステップS115)。
以上で、1つのターゲットブロックに対する、この実施形態におけるブロックマッチングによる動きベクトルの検出処理は、終了となる。図20に示したような、1フレームについて分割した領域において、複数個の動きベクトルを検出する場合には、サーチ範囲および縮小倍率1/nを再設定して、上述の図31および図32に示した処理を、各分割領域のターゲットブロックについて繰り返すものである。
なお、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
<第2の例>
上述の第1の例においては、1つの参照ブロック(参照ベクトル)について、そのSAD値を求めた後、そのSAD値から、参照縮小ベクトルの近傍の複数参照ベクトルについての分散加算値を求め、分散加算処理を行なうようにした。
これに対して、この第2の例においては、参照ブロック内の各画素の、ターゲットブロックの画素との差分を検出したときに、その差分値から、参照縮小ベクトルの近傍の複数参照ベクトルについての分散加算値(SAD値ではなく差分値)を求め、求めた差分値を分散加算処理するようにする。この第2の例によれば、1つの参照ブロック内のすべての画素についての差分演算を終了したときには、縮小SADテーブルが生成されることになる。
図33および図34は、この第2の例による動きベクトル検出処理のフローチャートを示すものである。
図33のステップS121〜ステップS123までの処理は、図31のステップS101〜ステップS103までの処理と全く同様であるので、ここでは、その詳細な説明は省略する。
この第2の例においては、ステップS123で、座標(x,y)の画素についての参照ブロックとターゲットブロック間での差分値αが算出すると、次には、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS124)。
次に、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS125)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき差分値を、前述したように、ステップS123で求めた差分値αから、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、線形加重分散値(差分値)として求める(ステップS126)。
そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するテーブル要素値に加算する(ステップS127)。
このステップS127が終了したら、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記のステップS122〜ステップS127の演算を行なったか否かを判別し(ステップS128)、ターゲットブロックIo内の全ての座標(x,y)の画素については、未だ、その演算は終了していないと判別したときには、ステップS122に戻り、ターゲットブロックIo内の次の座標(x,y)の画素位置を指定し、このステップS122以降の処理を繰り返す。
ステップS128で、ターゲットブロックIo内の全ての座標(x,y)の画素について、上記の演算を行なったと判別したときには、注目中の参照ブロックについてのSAD値の算出が終了したと判別して、サーチ範囲内の全ての参照ブロック、すなわち、全ての参照ベクトル(vx,vy)についての上記のステップS121からステップS128までの演算処理を完了したか否か判別する(図34のステップS131)。
ステップS131で、未だ、上記の演算処理を完了していない参照ベクトル(vx,vy)があると判別すると、ステップS121に戻り、上記の演算処理を完了していない次の参照ベクトル(vx,vy)を設定して、このステップS121以降の処理を繰り返す。
そして、ステップS121で、上記の演算処理を完了していない参照ベクトル(vx,vy)はサーチ範囲内になくなったと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS132)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS133)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS134)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求めるべく動きベクトル(px×n,py×n)を算出する(ステップS135)。
以上で、1つのターゲットブロックに対する、この第2の例におけるブロックマッチングによる動きベクトルの検出処理は、終了となる。図28に示したような、1フレームについて分割した領域において、複数個の動きベクトルを検出する場合には、サーチ範囲および縮小倍率1/nを再設定して、上述の図33および図34に示した処理を、各分割領域について繰り返すものである。
なお、この第2の例においても、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは言うまでもない。
<第3の例>
図24に示したように、この実施形態による動きベクトルの検出手法を用いた場合には、参照ベクトルの縮小倍率が1/64の場合でも、全く異なる動きベクトルを出力するような破綻は見られないことから、実質的に1/4096に、SADテーブルを削減可能である。
つまり、1/4096に削減した縮小SADテーブルを用意しておき、例えば1回目の縮小倍率1/na=1/64で1回目の動きベクトルを検出する。次に、1回目で検出したその動きベクトルを中心にしてサーチ範囲を狭め、2回目の検出を、1回目の縮小倍率1/naよりも小さい2回目の縮小倍率1/nb、例えば1/nb=1/8で行なうようにすればよい。すなわち、1回目と2回目とで縮小倍率を変えて、1回目のベクトル誤差範囲内に収まるように、2回目の縮小倍率を設定すれば、かなりの高精度で、動きベクトル検出が可能である。
この第3の例の場合における動きベクトル検出処理を、図35〜図38のフローチャートを参照しながら説明する。
この図35〜図38に示す第3の例は、基本的な動き検出処理として上述した第1の例を用いている。したがって、図35のステップS141〜ステップS149の処理ステップおよび図36のステップS151〜ステップS155までの処理ステップは、図31のステップS101〜ステップS109の処理ステップおよび図32のステップS111〜ステップS115までの処理ステップと全く同様である。
この第3の例においては、図36のステップS155で動きベクトルを算出したら、そこで処理を終了するのではなく、当該ステップS155で算出した動きベクトルは、1回目の動きベクトルとして、次のステップS156において、この1回目で算出した動きベクトルに基づき、同じ参照フレーム内で、サーチ範囲を絞り、また、参照ベクトルの縮小倍率を、1回目の縮小倍率1/naよりも小さい縮小倍率1/nbに変更する。
すなわち、1回目の処理で、動きベクトルが算出されると、その算出された動きベクトルから、参照フレームと元フレームとの間で、相関のあるブロック範囲がおおよそ検出できる。そこで、その相関のあるブロック範囲を中心とした、絞ったサーチ範囲を設定することができる。そして、1回目よりも縮小倍率を小さくすることで、より誤差の少ない状態で、2回目の動きベクトルの算出が可能になると期待できる。
こうして、ステップS156で、絞ったサーチ範囲を設定し、新たな縮小倍率を設定したら、1回目と全く同様にして、2回目の動きベクトルの検出処理を、ステップS157〜ステップS158、図37のステップS161〜ステップS168、さらに、図38のステップS171〜ステップS174により実行する。これらのステップの処理は、図31のステップS101〜ステップS109の処理ステップおよび図32のステップS111〜ステップS115までの処理ステップと全く同様である。
こうして、最終的に、ステップS174において、2回目の動きベクトルとして、目的とする動きベクトルが得られる。
以上の例は、動きベクトルの検出方法として、前述した第1の例を用い、それを2段階、繰り返した場合であるが、サーチ範囲をさらに絞り、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、繰り返すようにしても、勿論良い。
また、動きベクトルの検出方法としては、前述した第1の例の代わりに、前述した第2の例を用いることができることは言うまでもない。また、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは前述の例と同様である。
[歪み補正解像度変換部16の構成例および処理動作]
図39は、この実施の形態における歪み補正解像度変換部16の構成例を示すブロック図である。
この実施の形態における歪み補正解像度変換部16は、信号処理部50と、この信号処理部50に接続される、画像メモリ60と、初期座標算出部70と、速度ベクトル処理部80とからなる。
信号処理部50は、画像メモリ部4のフレームメモリ42からの撮像画像データDinについて、この信号処理部50に接続されている画像メモリ60への書き込み/読み出しを制御しながら、手ぶれ補正などの補正処理や、撮像画像の電子ズーム処理(電子的拡大・縮小処理)を行なうとともに、指定された解像度の出力画像データDoutを生成して出力する。
信号処理部50には、例えばタイミング信号発生部12から、出力画像データの水平周期に同期する信号、すなわち、水平同期信号H−SYNCと、出力画像データの垂直周期に同期する信号、すなわち、垂直同期信号V−SYNCと、1画素周期のクロック信号CLKと、それらに同期するクロックが、処理タイミング信号Stとして供給される(図30においては、これらの信号の図示は省略)。
速度ベクトル処理部80には、上述した手ぶれ動きベクトル検出部15からの、この例では64個の動きベクトル205V1〜205V64が供給される。この速度ベクトル処理部80は、ハードウエアにより構成することもできるし、CPU1によるソフトウエア処理により構成することも可能である。
速度ベクトル処理部80は、図39に示すように、手ぶれ動きベクトル検出部15からの動きベクトル205V1〜205V64から、8個の分割画像区間Pdiv_0〜Pdiv_7のそれぞれについての手ぶれ速度ベクトルVec_0〜Vec_7を生成する速度ベクトル生成部81と、この速度ベクトル生成部81で生成された手ぶれ速度ベクトルVec_0〜Vec_7が供給される水平補正速度成分検出部82および垂直補正速度成分検出部83とからなる。
図40に、速度ベクトル生成部81のハードウエア構成例を示す。図40に示すように、速度ベクトル生成部81は、8個の分割画像区間Pdiv_0〜Pdiv_7のそれぞれに対応して設けられている平均化演算部810,811,812,813,814,815,816,817と、差分演算を行う減算部821,822,823,824,825,826,827と、手ぶれベクトル出力部830と、速度ベクトル出力部840とからなる。
平均化演算部810〜817のそれぞれは、手ぶれベクトル検出部15からの、それぞれが対応する分割画像区間の8個の動きベクトル205Vi〜205V(i+7)を取り込み、前述した例外除去処理を含む平均化処理を行って、各分割画像区間Pdiv_0〜Pdiv_7についての手ぶれ動きベクトルVCdiv_0〜VCdiv_7を算出して出力する。
そして、減算部821〜827は、平均化演算部810〜817からの手ぶれ動きベクトルVCdiv_0〜VCdiv_7を受けて、前述した(式3)に示した差分演算を行い、分割画像区間Pdiv_0〜Pdiv_6についての手ぶれ速度ベクトルVec_0〜Vec_6を算出し、速度ベクトル出力部840に供給する。
速度ベクトル出力部840は、前述したようにして、垂直方向の最下部の分割画像区間Pdiv_7についての手ぶれ速度ベクトルVec_7を、この例では、算出された他の手ぶれ速度ベクトルから予測して求め、減算部821〜827からの手ぶれ速度ベクトルVec_0〜Vec_6と共に、水平補正速度成分検出部82および垂直補正速度成分検出部83に出力する。
図41は、この速度ベクトル生成部80をソフトウエアで構成した場合の処理のフローチャートを示すものである。なお、以下の図41のフローチャートの説明においては、動きベクトル205Vi〜205(i+7)は、ベクトルV(x、y)(x=1,2,・・・,8;y=1,2,・・・,8)と表す。
まず、手ぶれベクトル検出部15からの動きベクトルV(x、y)を取り込む(ステップS181)。次に、取り込んだ動きベクトル(x、y)を、当該取り込んだ動きベクトル(x、y)と同じ分割画像区間に含まれる他のベクトルV(0〜7、y)と比較する(ステップS182)。次に、取り込んだ動きベクトル(x、y)を、取り込んだ動きベクトル(x、y)に対し垂直方向に隣接する分割画像区間の他のベクトルV(0〜7、y±1)と比較する(ステップS183)。
次に、ステップS182およびステップS183の比較結果のベクトル差が、すべて予め定められたしきい値以下であって、取り込んだ動きベクトルが例外的な動きベクトルでないと確認されたか否かを判別する(ステップS184)。
ステップS184で、取り込んだ動きベクトルが例外的な動きベクトルであると判別したときには、取り込んだ動きベクトルは、平均化処理から除外する(ステップS185)。そして、ステップS181に戻る。
また、ステップS184で、取り込んだ動きベクトルが例外的な動きベクトルではないと判別したときには、取り込んだ動きベクトルを、平均化処理に反映させることを決定する(ステップS186)。そして、1画面内のすべての動きベクトルについて、上記のステップS181〜186までの処理が終了したか否かを判別する(ステップS187)。
ステップS187で、1画面内のすべての動きベクトルについて、上記のステップS181〜186までの処理が終了してはいないと判別したときには、ステップS181に戻る。
また、ステップS187で、1画面内のすべての動きベクトルについて、上記のステップS181〜186までの処理が終了したと判別したときには、平均化処理を実行する(ステップS188)。
次に、平均化処理して得られた各分割画像区間ごとの動きベクトルの差分演算を行って、手ぶれ速度ベクトルを算出する。次に、すべての分割画像区間についての平均化処理を終了したか否かを判別する(ステップS190)。
ステップS190で、すべての分割画像区間についての平均化処理を終了していないと判別したときには、ステップS188に戻り、このステップS188以降の処理を実行する。また、ステップS190で、すべての分割画像区間についての平均化処理を終了下と判別したときには、垂直方向の最後の分割画像区間Pdiv_7についての動き速度ベクトルを前述したようにして予測して算出し(ステップS191)、この処理ルーチンを終了する。
速度ベクトル出力部840は、以上のようにして生成した各分割画像区間Pdiv_0〜Pdiv_7についての動き速度ベクトルVCdiv_0〜VCdiv_7を、前述したように、水平補正速度成分検出部82および垂直補正速度成分検出部83に出力する。
水平補正速度成分検出部82では、分割画像区間Pdiv_0〜Pdiv_7のそれぞれにおける手ぶれ速度ベクトルVec_0〜Vec_7の水平方向成分を抽出し、その逆符号成分として、水平補正速度成分X_STB_0〜X_STB_7を求める。そして、その算出した水平補正速度成分X_STB_0〜X_STB_7を信号処理部50に供給する。
また、垂直補正速度成分検出部83では、分割画像区間Pdiv_0〜Pdiv_7のそれぞれにおける手ぶれ速度ベクトルVec_0〜Vec_7の垂直方向成分を抽出し、その逆符号成分として、垂直補正速度成分Y_STB_0〜Y_STB_7を求める。そして、その算出した垂直補正速度成分Y_STB_0〜Y_STB_7を信号処理部50に供給する。
また、分割画像区間Pdiv_0についての平均化演算部810で算出された手ぶれ動きベクトルVCdiv_0は、手ぶれベクトル出力部830を通じてそのまま出力されて、初期座標算出部70に供給される。
初期座標算出部70は、処理対象のフレームの画像データの画像メモリからの読み出し位置の初期座標(SX、SY)を、手ぶれ動きベクトルVCdiv_0から算出して、信号処理部50に供給する。
次に、信号処理部50では、画像メモリ60への画像データの書き込み/読み出しを制御しながら、後で詳述するようにして、速度ベクトル処理部80からの水平補正速度成分と垂直補正速度成分とから、各水平ラインの水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDを算出し、これら算出した水平補正変位量SX_ADDおよび垂直補正変位量SY_ADDを用いて、画像メモリ部4からの撮像画像データDinについての手ぶれによる画像歪みを補正処理し、出力画像データDoutを得る。
なお、前述したように、信号処理部5では、電子ズーム(画像拡大・縮小)処理を行なうと共に、標準精細度、高精細度などに応じた解像度変換処理なども行なう。
すなわち、手ぶれ補正処理や電子ズーム処理、出力データ生成処理のために、信号処理部50は、水平処理ブロック51と、垂直処理ブロック52と、レジスタブロック53とを含んでいる。そして、水平処理ブロック51は、水平手ぶれ補正量積分部511と水平画像処理部512とを備え、また、垂直処理ブロック52は、垂直手ぶれ補正量積分部521と垂直画像処理部522とを備える。
水平処理ブロック51は、入力される撮像画像データDinに対して水平方向の処理を施す。この水平方向の処理には、水平方向の手ぶれ補正処理を含む。垂直処理ブロック52は、入力される撮像画像データDinに対して垂直方向の処理を施す。この垂直方向の処理には、垂直方向の手ぶれ補正処理を含む。また、レジスタブロック53は、速度ベクトル処理部80で検出された手ぶれ速度ベクトルの水平方向および垂直方向の情報を、水平処理ブロック51および垂直処理ブロック52に受け渡す処理を行なう。
この場合に、この実施形態では、水平補正速度成分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は、例えばタイミング信号発生部12からのタイミング信号Stに応じたタイミングで、信号処理部50のレジスタブロック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では、それぞれ画像メモリ60に対して画像データの読み書きをしながら補正処理を実行するようにする。
この実施形態では、画像メモリ60は、水平処理用FIFOラインメモリ61と、垂直処理用小規模ラインメモリ62とからなる。水平処理用FIFOラインメモリ61は、この例では、1ライン分の容量を備える。また、垂直処理用小規模ラインメモリ62は、後述する垂直方向の補間処理用のFIR(Finite Impulse Response)フィルタのタップ数以上のライン数分の容量を有する。
水平処理ブロック51の水平画像処理部512には、水平処理用FIFOラインメモリ61への画像データの書き込み、読み出しを制御するFIFOメモリコントローラ(図39では図示を省略)が設けられていると共に、算出した水平手ぶれ補正量SX_ADDが小数点以下(補正後の画素位置が、水平方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう水平方向補間処理部(図39では図示を省略)が設けられている。この水平方向補間処理部は、後述するように、この実施形態では、水平方向のデジタルFIRフィルタ(以下、水平FIRフィルタという)が用いられる。
また、垂直処理ブロック52の垂直画像処理部522には、垂直処理用小規模ラインメモリ62への画像データの書き込み、読み出しを制御するメモリコントローラ(図39では図示を省略)が設けられていると共に、算出した垂直手ぶれ補正量SY_ADDが小数点以下(補正後の画素位置が、垂直方向の画素位置よりオフセットされた位置となる)の場合を想定し、補間処理を行なう垂直方向補間処理部(図39では図示を省略)が設けられている。この垂直方向補間処理部は、後述するように、この実施形態では、垂直方向のデジタルFIRフィルタ(以下、垂直FIRフィルタという)が用いられる。
ここで、算出した水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDが小数点以下の値を持つ場合の補間処理について説明する。
例えば、手ぶれの水平方向の速度成分により、水平方向に図42に示すような画像歪みが生じた場合を想定する。すなわち、図42の例は、手ぶれが無ければ破線で示す直線上にあるべき画素G11,G21,G31・・・、G12,G22,G32・・・、G13,G23,G33・・・、が、手ぶれの水平方向の速度成分のために実線で示すような斜め位置となっている場合である。
この手ぶれを補正するためには、ずれている画素位置を本来の位置にあるようにずらせばよく、そのずれ量が、図42に示すように、前述した水平手ぶれ補正量SX_ADDに相当する。この水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍であれば、画素データを当該水平手ぶれ補正量SX_ADDに応じた画素ピッチ分だけずらして読み出すようにすることで補正することができる。
しかしながら、水平手ぶれ補正量SX_ADDが、画素ピッチdxの整数倍ではなく、小数点以下のずれ量を含む場合には、そのずれ量に対応する位置は、画素データが存在する位置ではないので、その位置の近傍の複数個の画素データを用いた補間処理により、対応する画素位置の画素データを生成する必要がある。
図43は、その補間方法の一例を示すもので、求める画素データが、画素G1と画素G2との間の補間画素Gsである場合に、この補間画素Gsの位置と画素G1,G2の位置との距離k1,k2に応じた割合で、画素G1のデータと画素G2のデータとを加算することにより、補間画素Gsの画素データを生成するものである。この場合、k1:k2=W:(1−W)としたとき、
補間画素Gs=G1×W+G2×(W−1)
なる補間演算により、補間画素Gsの画素データを得る。
また、図43の例のような2個の画素データを用いるのではなく、図44の例のように2個以上(図44の例では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の画素データを得るようにする。
この図44の例の場合、乗算係数W0,W1,W2,W3の値の組は、画素G1または画素G2と補間画素Gsとの距離dsに対応するものとして関連付けられたテーブルを用意しておき、距離dsを検索子として、上記乗算係数W0,W1,W2,W3の組をテーブルから読み出すようにすることで得ることができる。なお、距離dsは、水平手ぶれ補正量SX_ADDの小数部に相当するものである。
この補間処理は、この実施形態では、水平FIRフィルタを用いて行なうようにする。すなわち、水平手ぶれ補正量SX_ADDの小数部に対応する前記乗算係数の組をテーブルから読み出し、その乗算係数を水平FIRフィルタに対して供給することで上記補間処理を行なうことができる。
以上は、水平方向の補間処理であるが、垂直方向についても、補間方向が垂直方向になるだけで、全く同様である。
[水平処理ブロック51における処理動作]
[水平手ぶれ補正量SX_ADDの積分処理]
図45に、水平手ぶれ補正量積分部511における積分値としての水平手ぶれ補正量SX_ADDを得るための積分処理動作のフローチャートを示す。
まず、初期y座標(水平ライン位置に対応)SYに、水平同期信号H−SYNC(ここでは、水平同期信号H−SYNCは、一般的な水平走査信号のうち、有効画像領域以外をマスクしたタイミング信号を意味するものとする)毎に「step」という値を加算して行く(ステップS1)。
初期y座標SYは、出力画像の最初の1水平ライン目が、CMOSイメージャ上の総画素の座標系(以後絶対座標系と呼ぶ)のどこに位置するかを表しており、一般的には「0」ではない。
この初期座標(SX,SY)は、上述したような当該フレームの手ぶれに応じた初期的変位量を含むのみならず、次のような要因に基づいて定められるものである。すなわち、動画時には、通常、CMOSイメージャ上の全画素が、信号処理部50に入力されるのではなく、CMOSイメージャ内で垂直方向に平均加算されてから、後段の信号処理部50に入力されるからである。また、信号処理部50に入力されてからでも、幾つかの処理を経るため、1水平ライン目の絶対座標は、「0」でないことの方が多いからである。更に、入力画像データに対して、垂直方向の部分拡大処理を行なう場合には、初期y座標SYは、画面の中ほどの水平ライン位置となるので、非常に大きい値をとることもあり得るからである。
ステップS201で、1水平同期信号H−SYNC毎に加算する「step」という値は、ライン間隔の絶対座標系における垂直座標の増量を表わすが、上述したCMOSイメージャ内もしくは水平処理ブロックの前段における、垂直方向の複数ラインの画像データの平均加算により、1以外に2や4といった値をとる可能性がある。
さて、ステップS201で、初期y座標値をSYとして、1水平同期信号H−SYNC毎に、値stepを加算することにより、現在処理している水平ラインの絶対座標が求まり、当該絶対座標の整数成分vp_i(ステップS202)が、水平補正速度成分X_STB_*(*は0〜7のいずれかである。すなわち、水平補正速度成分X_STB_*は、X_STB_0〜X_STB_7のいずれかを意味する。以下、同じ。)を、現時点までに積分すべき積分回数に対応する。ここで、この積分回数は、1画面内における積算値である。
次に、現在処理している水平ライン(以下、現処理ラインという)の絶対座標の整数成分vp_iと、現処理ラインの1水平ライン前までに積分した回数(積分回数hstb_cnt)とを比較する。これにより、現処理ラインにおいて、あと何回積分すれば良いかが分かり、その回数分だけ、処理単位サイクル(1水平周期よりも十分に短い)毎にトリガTG1が発生する(ステップS203)。
このトリガTG1が発生する毎に、積分回数hstb_cntは1づつインクリメントする(ステップS204、ステップS205)。
そして、このトリガTG1ごとに、水平補正速度成分X_STB_0〜X_STB_7のうちの、現処理ラインが所在する分割画像区間についての水平補正速度成分を加算することにより、積分処理を行ない、水平手ぶれ補正量SX_ADDを得る(ステップS206)。ここで、図45のステップS206における「stb_x」は、水平補正速度成分X_STB_0〜X_STB_7のいずれかの値である。すなわち、「stb_x」は、現処理ラインが所在する分割画像区間についての水平補正速度成分の値である。
ステップS201で、1水平同期信号H−SYNC毎に加算される値「step」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG1は、1水平同期信号H−SYNC毎に発生するため、ステップS206では、1水平ライン毎に「stb_x」を加算(積分)するものである。
こうして得られる水平手ぶれ補正量SX_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの水平方向の読み出し開始位置の補正量、すなわち、水平処理ブロック51における水平方向画像歪み補正処理における各ラインの水平初期位置(水平オフセット)そのものとなる。
上述したように、ステップS206では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、水平補正速度成分X_STB_0〜X_STB_7のうちの、いずれか1つを選択しなければならない。そのための仕組みが、図45の残りの部分の処理である。
この例では、分割画像区間分のライン数の加算値stb_gridが定義される(ステップS207)。この加算値stb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値stb_gridと、積分回数hstb_cntとを比較し、積分回数hstb_cntが加算値stb_gridを超える毎に、トリガTG2を発生する(ステップS208)。そして、トリガTG2が発生するごとに、加算値hstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS209)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG2が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値HDIV_CNTを定義し(ステップS210)、この分割区間値HDIV_CNTを、トリガTG2が発生する毎に、1づつインクリメントする(ステップS211)。すると、分割区間値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の処理動作]
図46は、水平画像処理部512の構成例を示すものである。この図46の例では、前述の図45のフローチャートにおける水平同期信号H−SYNC毎に値「step」を初期y座標SYに加算する加算部5101が、この水平画像処理部512に含まれるものとしており、このため、この水平画像処理部512に初期y座標SYが入力される。さらに、この水平画像処理部512には初期x座標SXが入力される。これら初期y座標SYおよび初期x座標SXは、1フレームの先頭で、例えば制御部を構成するCPU1で設定されて入力される。
そして、加算部5101からの、水平同期信号H−SYNC毎に値「step」が加算されたy座標値SY´は、水平手ぶれ補正量積分部511に供給される。すると、この水平手ぶれ補正量積分部511からは、現処理ラインの先頭のx座標のオフセット値として、水平手ぶれ補正量SX_ADDが返ってくる。
水平画像処理部512では、加算部5102において、各水平ラインの先頭で一回だけ、水平手ぶれ補正量積分部511からの水平手ぶれ補正量SX_ADDを、初期x座標SXに加算する。
そして、この加算部5102の出力値に対して、画素処理クロックCLKごとに、水平拡大・縮小のパラメータである値「hmag」を、加算部5103により加算する。この加算部5103の出力値X_ADDは、比較部5104および5105、また、小数部抽出部5106および整数部抽出部5107に供給される。
比較部5104は、加算部5103からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1以上であるとき、すなわち、画素位置が1画素分以上ジャンプしたときに、そのジャンプを示す信号SKIPを出力する。この例では、このジャンプを示す信号SKIPを参照することで、次に画素処理クロックCLKのタイミングで処理すべきジャンプした画素位置を知ることができる。この信号SKIPは、FIFOメモリコントローラ5108に供給される。
また、比較部5105は、加算部5103からの出力値X_ADDを、1画素処理クロックCLKだけ前の出力値X_ADDの整数成分と比較し、差が1より小さいときに、その旨を示す信号HOLDを出力する。したがって、この信号HOLDを参照することで、読み出し画素を、1画素処理クロックCLKだけ前と同じであることを知ることができる。この信号HOLDは、FIFOメモリコントローラ5108に供給される。
小数部抽出部5106は、加算部5103からの出力値X_ADDの小数部を、画素処理クロックCLK毎に抽出し、抽出した小数部の値X_PHASEを出力する。この少数部の値X_PHASEは、水平FIRフィルタ5110を備える水平補間処理部5109に供給される。水平補間処理部5109では、この小数部の値X_PHASEに基づいて乗算係数テーブルを検索し、水平FIRフィルタ5110に供給する乗算係数を得るようにする。
整数部抽出部5107は、加算部5103からの出力値X_ADDの整数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した整数部の値ST_POSを出力する。この整数部の値ST_POSは、現処理ラインの初期x座標としてFIFOメモリコントローラ5108に供給される。
FIFOメモリコントローラ5108は、入力画像データDinについて、水平処理用FIFOラインメモリ61を用いて、水平手ぶれ補正量SX_ADDに基づいた水平手ぶれ補正処理を行なうと共に、水平拡大・縮小処理を行なう。ここで、水平処理用FIFOラインメモリ61が、実際に1水平ライン分相当のサイズを必要とするのは、後述するように、画像の部分拡大処理をサポートすることを考慮する場合のみである。
すなわち、FIFOメモリコントローラ5108は、入力画像データDinについて、前記整数部の値ST_POSを用いて、出力画像データとして読み出す各水平ラインの画素データの初期x座標を決める。また、FIFOメモリコントローラ5108は、信号SKIPおよび信号HOLDを画素処理クロックCLKごとに参照し、水平処理用FIFOラインメモリ61から読み出す画素データを決定するようにする。
そして、FIFOメモリコントローラ5108は、以上のようにして読み出した水平ラインの画素データを出力画像データとして、データイネーブル信号ENと共に、水平補間処理部5109に供給する。
水平補間処理部5109は、データイネーブル信号ENがイネーブル状態となっているときに入力される画像データを有効データとして、水平FIRフィルタ5110を用いて水平方向の補間処理を実行する。前述したように、このときに水平補間処理部5109に入力される小数部の値X_PHASEを用いて、水平FIRフィルタ5110に供給する乗算係数が決定されている。
こうして、水平補間処理部5109からは、水平手ぶれ補正量SX_ADDに応じて水平手ぶれ補正処理がなされると共に、水平方向の拡大・縮小処理がなされた画像データDHoutが得られる。このDHoutは、垂直処理ブロック52に供給される。
ところで、上述の説明では、水平手ぶれ補正量積分部511の水平手ぶれ補正量SX_ADDの積分処理と、水平画像処理部511の水平拡大・縮小画像処理の、互いの処理タイミングについて特に触れなかったが、水平手ぶれ補正量SX_ADDの積分処理を、遅延無しで、水平拡大・縮小画像処理との単純なシーケンス処理で行なうことが好都合なのは、図47の上側の図47(A)に示すように、垂直方向の部分切り出し及び部分拡大をサポートしない場合にほぼ限られる。図47で、V−SYNCは垂直同期信号を示し、また、ST_TGは、有効走査ラインの開始時点を示している。また、図47で、網掛けを付して示した四角で囲まれた区間は、それぞれの処理区間を示している。
一方、垂直方向の部分切り出し、もしくは部分拡大をサポートする場合、初期y座標SYが非常に大きな値を取り得るため、フレーム先頭の積分処理に、相当長いサイクル数(画素処理サイクル数)を要してしまう可能性がある。図47下側の(B)のシーケンスにおける期間tmがそのための積分期間である。
このようになると、図47上側の(A)のシーケンスでは、最初の拡大・縮小処理が水平同期信号H−SYNCの1周期期間をオーバーしてしまうため、次の水平同期信号H−SYNCで入力されて来る2ライン目の画像データを保持しておくためのラインメモリが必要となる。
そこで、この実施形態では、図47下側の(B)のシーケンスに示すように、水平拡大・縮小画像処理が開始される1水平周期前から積分処理の起動を行ない、常に画像処理に対して、1水平周期だけ先行して積分処理を行なうタイミングおよびシーケンスを採用する。このため、水平処理用FIFOラインメモリ61は、1水平周期分のサイズのものがこの実施形態では用いられている。
上述した問題は、画像の部分拡大等に関わらず、水平処理は常に全入力ラインに対して処理を施す、というアーキテクチャにすれば避けられる。しかし、いずれにしても、図47上側のシーケンスを実現しようとすると、積分処理の終了信号を新たに設け、それを受けて画像処理の起動をかけなければならず、やや煩雑である。つまり、換言すれば、上述したこの実施形態で採用した手法は、既存の画像処理の回路に新たな手を加えないで済む、というメリットがあるのである。
なお、上述した実施形態で採用した手法は、水平同期信号H−SYNCの1周期期間内の画素処理サイクル数よりも、絶対座標系の垂直サイズが大きい場合には採用できない。その場合には、水平処理は常に全入力ラインに対して処理を施すという、上述したアーキテクチャにすれば良い。
[垂直処理ブロック52における処理動作]
[垂直手ぶれ補正量SY_ADDの積分処理]
次に、垂直手ぶれ補正量積分部521における積分値としての垂直手ぶれ補正量SY_ADDを得るための積分処理動作について説明する。図48は、この垂直手ぶれ補正量SY_ADDを得るための積分処理動作のフローチャートを示すものである。
この垂直手ぶれ補正量SY_ADDを得るための積分処理動作は、図45を用いて上述した水平手ぶれ補正量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_*が、まだ確定前であることを、水平処理の進捗度合いから判断する必要があるのである。
そのための仕組みとして、図48のように、垂直処理の進捗度合いを表わす分割区間値VDIV_CNTが、水平処理の進捗度合いを表わす分割区間値HDIV_CNTを超えてしまっていれば、ウエイトを発行し、図48の左下で、垂直処理における現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である「stb_y」が未確定のままの垂直補正速度成分Y_STB_*が選択された状態で、垂直手ぶれ補正量SY_ADDに加算されるのを防ぐ。
垂直方向の積分処理(図48)が水平方向の積分(図45)と異なる、3つ目の点は、各ラインでの垂直積分が完了したことを表す積分完了信号STB_RDYの生成である。各ライン内で積分を繰り返して行なった結果、そのラインの絶対座標の整数成分vp_iと、そのフレーム内での累積積分回数vstb_cntとが一致したときに、後段の垂直画像処理モジュールに渡すべき垂直オフセットSY_ADDが求められ、それと同時に、後段の垂直画像処理の起動をかけるのが目的である。
既に説明した水平方向の積分処理においては、有効画像が入力されるタイミングよりも1水平同期信号H−SYNC(1水平周期)前から積分処理を開始しておけば、有効画像に対する水平画像処理が始まるまでに積分処理を完了できることが、殆どの場合、システム的に保証可能であるが、垂直方向の積分処理では、前述のウエイトが発生する可能性があるために、直前1水平周期の時間で積分が完了することを、全ての場合において保証するのは不可能だからである。すなわち、ウエイトが発生したときには、垂直積分が完了したことを表す積分完了信号STB_RDYが発生したときに、垂直手ぶれ補正および垂直拡大・縮小処理を含む垂直画像処理を実行するようにする。
以上の機能を有する、この垂直方向の積分回路を適用した垂直方向の積分処理を図48のフローチャートを参照しながら説明する。
まず、初期y座標(水平ライン位置に対応)SYに、水平同期信号H−SYNC毎に前述した値「vmag」を加算して行く(ステップS301)。
ステップS21で、初期y座標値をSYとして、1水平同期信号H−SYNC毎に、値vmagを加算することにより、現在処理している水平ラインの絶対座標が求まり、当該絶対座標の整数成分vp_i(ステップS302)が、垂直補正速度成分Y_STB_*(Y_STB_0〜Y_STB_7のいずれか)を、現時点までに積分すべき積分回数に対応する。ここで、この積分回数は、1画面内における積算値である。
次に、現在処理している水平ライン、すなわち、現処理ラインの絶対座標の整数成分vp_iと、現処理ラインの1水平ライン前までに積分した回数(積分回数vstb_cnt)とを比較する。これにより、現処理ラインにおいて、あと何回積分すれば良いかが分かり、その回数分だけ、処理単位サイクル(1水平周期よりも十分に短い)毎にトリガTG3が発生する(ステップS303)。
このトリガTG3が発生する毎に、積分回数vstb_cntは1づつインクリメントする(ステップS304、ステップS305)。
そして、このトリガTG3ごとに、垂直補正速度成分Y_STB_0〜Y_STB_7のうちの、現処理ラインが所在する分割画像区間についての垂直補正速度成分を加算することにより、積分処理を行ない、垂直手ぶれ補正量SY_ADDを得る(ステップS306)。ここで、図48のステップS306における「stb_y」は、垂直補正速度成分Y_STB_0〜Y_STB_7のいずれかの値である。すなわち、「stb_y」は、現処理ラインが所在する分割画像区間についての垂直補正速度成分の値である。
ステップS301で、1水平同期信号H−SYNC毎に加算される値「vmag」=1であって、画像の拡大などではない通常の画像出力の場合には、トリガTG3は、1水平同期信号H−SYNC毎に発生するため、ステップS26では、1水平ライン毎に「stb_y」を加算(積分)するものである。
こうして得られる垂直手ぶれ補正量SY_ADDは、前述もしたように、CMOSイメージャ上での各水平ラインの垂直方向の読み出し開始位置の補正量、すなわち、垂直処理ブロック52における垂直方向画像歪み補正処理における各ラインの垂直位置(垂直オフセット)そのものとなる。
上述したように、ステップS306では、現処理ラインが、1画面分(1フレーム=1垂直同期周期)を垂直方向に8分割した分割画像区間のどこに属するかによって、垂直補正速度成分Y_STB_0〜Y_STB_7のうちの、いずれか1つを選択しなければならない。
この例では、分割画像区間分のライン数の加算値vstb_gridが定義される(ステップS307)。この加算値vstb_gridの初期値は、1分割画像区間のライン数DIVである。
そして、この加算値vstb_gridと、積分回数vstb_cntとを比較し、積分回数vstb_cntが加算値vstb_gridを超える毎に、トリガTG4を発生する(ステップS308)。そして、トリガTG4が発生するごとに、加算値vstb_cntに、1分割画像区間のライン数DIVを加算する(ステップS309)。
以上の処理により、現処理ラインが次の分割画像区間に移る毎に、トリガTG4が発生する。したがって、現処理ラインが各分割画像区間Pdiv_0〜Pdiv_7の何れに存在するかの分割区間値VDIV_CNTを定義し(ステップS310)、この分割区間値VDIV_CNTを、トリガTG4が発生する毎に、1づつインクリメントする(ステップS311)。すると、分割区間値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は、ウエイトが解除された後に発生するように遅延させる(ステップS312)。
そして、この実施形態では、ステップS302で得られるy座標の整数成分vp_iと、積分回数vstb_cntとが等しいかどうかをチェックし、等しければ現処理ラインについての垂直方向の積分が完了したことを示す積分完了信号STB_RDYを生成して出力する(ステップS313)。この積分完了信号STB_RDYは、垂直画像処理部522に供給される。垂直画像処理部522では、この積分完了信号STB_RDYにより、現処理ラインについての垂直方向の手ぶれ補正処理を開始してよいことを認識し、次の水平同期信号H−SYNCのタイミングで垂直画像処理を再開する。
[垂直画像処理部522の処理動作]
図49は、垂直画像処理部522の構成例を示すものである。この図49の例では、前述の図48のフローチャートにおける水平同期信号H−SYNC毎に値「vmag」を加算する加算部5201が、この垂直画像処理部522に含まれるものとしており、この垂直画像処理部522に初期y座標SYが入力される。
そして、加算部5201からの、垂直同期信号H−SYNC毎に値「vmag」が加算されたy座標値SY´は、垂直手ぶれ補正量積分部521に供給される。すると、この垂直手ぶれ補正量積分部521からは、現処理ラインの先頭のy座標のオフセット値として、垂直手ぶれ補正量SY_ADDが返ってくる。
垂直画像処理部522では、加算部5202において、各水平ラインの先頭で一回だけ、垂直手ぶれ補正量積分部521からの垂直手ぶれ補正量SY_ADDを、初期y座標SYに加算する。この加算部5202の出力値X_ADDは、小数部抽出部5203および整数部抽出部5204に供給される。
小数部抽出部5203は、加算部5202からの出力値Y_ADDの小数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した小数部の値Y_PHASEを出力する。この少数部の値Y_PHASEは、垂直FIRフィルタ5207を備える垂直補間処理部5206に供給される。
垂直FIRフィルタ5207は、垂直方向に並ぶ複数ラインの画素データを用いて補間処理を行なうもので、垂直補間処理部5206では、この小数部の値Y_PHASEに基づいて乗算係数テーブルを検索し、垂直FIRフィルタ5207に供給する乗算係数を得るようにする。これは、補間方向が垂直方向になるだけで、図42〜図44を用いて説明した水平FIRフィルタを用いる水平方向の補間処理とほぼ同様である。
整数部抽出部5204は、加算部5202からの出力値Y_ADDの整数部を、水平同期信号H−SYNCにより各水平ラインの先頭で抽出し、抽出した整数部の値Y_POSを出力する。この整数部の値Y_POSは、現処理ラインのy座標としてメモリコントローラ5205に供給される。
メモリコントローラ5205は、水平処理ブロック51からの画像データDHoutについて、垂直処理用小規模ラインメモリ62を用いて、垂直手ぶれ補正量SY_ADDに基づいた垂直手ぶれ補正処理を行なうと共に、垂直拡大・縮小処理を行なう。ここで、垂直処理用小規模ラインメモリ62は、少なくとも、垂直FIRフィルタ5207における補間処理に用いるライン数分、すなわち、垂直FIRフィルタのタップ数分の容量を有する。
メモリコントローラ5205は、その入力画像データDHoutを垂直処理用小規模ラインメモリ62に一時保存すると共に、前記整数部の値Y_POSを用いて、出力画像データDYout_0、DYout_1、・・・、DY_nとして出力する複数の水平ラインのデータを決める。そして、メモリコントローラ5205は、以上のようにして決定した複数水平ラインの画素データDYout_0、DYout_1、・・・、DY_nを、小規模ラインメモリ62から読み出して垂直補間処理部5206に供給する。
垂直補間処理部5206は、入力される画像データDYout_0、DYout_1、・・・、DY_nを、垂直FIRフィルタ5207を用いて垂直方向の補間処理を実行する。前述したように、このときに垂直補間処理部5206に入力される小数部の値Y_PHASEを用いて、垂直FIRフィルタ5207に供給する乗算係数が決定されている。
こうして、垂直補間処理部5206からは、垂直手ぶれ補正量SY_ADDに応じて垂直手ぶれ補正処理がなされると共に、垂直方向の拡大・縮小処理がなされた画像データDoutが得られる。
次に、図50に、上説明した垂直方向の積分処理と、その後段の垂直画像処理のタイミング関係を示す。図50の上の図50(A)のように、垂直方向の部分切り出し、垂直方向の部分拡大・縮小のいずれもサポートしない場合には、前述したウエイトは発生せず、現処理ラインについての垂直方向の積分回数の上限は高々数回である。このため、同一のラインに対する積分処理と画像処理の両方を、同じ1水平同期信号H−SYNC期間内でシーケンス化可能である。したがって、この場合には、わざわざ積分完了信号STB_RDYを導入する必要はない。
一方、図50の下の図50(B)のように、垂直方向の部分切り出し、もしくは垂直方向の部分拡大をサポートする場合には、1ライン目の積分処理の途中でウエイトが発生する可能性があり、縮小をサポートする場合には、どこか途中の水平ラインでウエイトが発生する可能性がある。
いずれの場合でも、同一ラインの積分処理が、ウエイトによって数水平同期信号H−SYNC区間もしくはそれ以上に渡って中断されるため、積分処理が終了したことを後段に知らせるための積分完了信号STB_RDYが必要となる。そして、図50(B)の下2段に示すように、垂直拡大・縮小処理は、ウエイトが終了し、積分完了信号STB_RDYが発生した後の水平同期信号H−SYNCのタイミングから開始される。
また、同時に、あるラインの垂直画像処理が完了していない場合には、次の水平同期信号H−SYNCを、図50(B)において点線で示すように、マスクするようにする。すなわち、ウエイトが発生している間の水平同期信号H−SYNCは、マスクするようにする。
以上説明した水平処理ブロック51と垂直処理ブロック52を含む信号処理部5における処理の流れは、図51に示すように表わすことができる。すなわち、データ変換部3からの画像データDinは、水平処理用FIFOラインメモリ61に一旦書き込んで読み出し、水平画像処理部512および水平手ぶれ補正量積分部511を用いて水平手ぶれ補正および水平拡大・縮小処理を行なう。そして、水平画像処理部512の処理結果は、垂直処理用小規模ラインメモリ62に書き込む。
垂直処理用小規模ラインメモリ62に書き込まれた画像データは、垂直画像処理部522および垂直手ぶれ補正量積分部521を用いて垂直手ぶれ補正および垂直拡大・縮小処理を行なう。そして、垂直画像処理部522の処理結果は、垂直処理用小規模ラインメモリ62に書き戻す。そして、さらに、この垂直処理用小規模ラインメモリ62から、出力画像データDoutを読み出して出力する。
以上の処理の結果、図52の右下図のように、CMOS手ぶれに起因する歪み補正がなされた出力画像が得られる。
ここでの垂直処理用小規模ラインメモリ62としては、最低限、垂直FIRフィルタ5207のタップ数分のラインメモリが必要であることを述べたが、現実的には、垂直方向の部分拡大処理を行なう場合には、垂直処理のスピードよりも水平処理のスピードの方が早くなるため、拡大対象となる水平処理結果を溜めておくだけのラインメモリが必要となる。
また、部分拡大をしない場合でも、垂直補正速度成分Y_STB_*が鉛直上向きである場合には、部分拡大の場合と動作上同じになるため、小規模ラインメモリ62としては、手ぶれが上下方向に変動する分を考慮したラインメモリが必要である。
なお、上述の実施形態の場合、1垂直周期が1/60秒であるとすると、分割画像区間Pdivの時間長DIVは、1/60÷8=1/480秒であるが、実験によれば、この程度の時間長DIVで、手ぶれ速度ベクトルを求めて手ぶれ補正をすることにより、必要十分な手ぶれ補正効果が得られ、補正後の出力画像としては、良好なものとなることが確認されている。
次に、以上の水平処理および垂直処理におけるレジスタブロック53におけるレジスタへのラッチタイミングを、図53に示す。
すなわち、この実施形態では、垂直同期信号V−SYNCの1周期について、各分割画像区間Pdiv_0〜Pdiv_7の先頭ラインの時点で割り込み(マイコン割り込み)が発生する。
この割り込みにより起動されて、速度ベクトル処理部80で、前述したようにして、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*が生成され、その生成結果である水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*がレジスタブロック53のIFレジスタに取り込まれる。
水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*の値を、CPU1のソフトウエアで計算する場合、図52に示すような定期的な割り込みを発生させる方法が有効である。
また、レジスタブロック53内では、分割区間値HDIV_CNTの値の変化を見てラッチパルスを生成し、前述のようにCPU1が設定した、対応する水平補正速度成分X_STB_*と垂直補正速度成分Y_STB_*とを、IFレジスタから、水平処理用レジスタおよび垂直処理用レジスタに、この生成したラッチパルスのタイミングでラッチする。つまり、水平処理ブロック51で用いる水平補正速度成分X_STB_*を、その使用直前でラッチするのである。このとき、垂直処理ブロック52で用いる垂直補正速度成分Y_STB_*も一緒にラッチしておく。
垂直処理ブロック52で使用する、垂直補正速度成分Y_STB_*は、基本的には、上記の水平処理ブロック51用の水平補正速度成分X_STB_*と一緒にラッチした、Y_STB_*の値を常にラッチし続ける。
ただし、それは、垂直処理ブロック52のフレーム処理起動パルスVL1がアクティブ(ハイ状態がアクティブ)になってから、水平処理ブロック51のフレーム処理起動パルスVL0がアクティブ(ハイ状態がアクティブ)になるまでの期間(図52のRVラッチイネーブルのアクティブ(ハイ状態がアクティブ)期間)に限られる。
これは、垂直処理の時間は長引くことがあり、入力画像の垂直同期信号V−SYNCだけでなく、次のフレームの水平処理ブロックのフレーム起動パルスVL0さえも跨ぐことがあるからである。
[この発明による画像信号の歪み補正装置の第2の実施形態]
上述した画像信号の歪み補正装置の第1の実施形態としての撮像装置における手ぶれ動きベクトル検出部15においては、図30に示したように、画像メモリ部4は、2枚の画像、つまり元フレームの画像と、参照フレームの画像とが、両方共、フレームメモリ42,42に格納されていることを前提にしていた。このため、動きベクトルの検出タイミングは、1フレーム分遅延されることとなる。
これに対して、この第2の実施形態では、撮像素子11からの垂れ流し画像データを参照フレームとする構成として、ラスタスキャンのストリームデータに対して、リアルタイムでSAD値を演算することができるようにしている。
図53に、この第2の実施形態の場合における撮像装置の構成例のブロック図を示す。この図53から分かるように、撮像信号処理系10の構成ブロックおよびその他の構成ブロックは、図30に示した第1の実施形態と全く同様であるが、この第2の実施形態においては、図53に示すように、画像メモリ部4は1個のフレームメモリ43からなる。
この第2の実施形態では、元フレームがフレームメモリ43に格納されており、参照フレームは、データ変換部14からストリームで入力されて来るものとされる。手ぶれ動きベクトル検出部15は、第1の実施形態では、2個のフレームメモリ41,42に格納された2枚の画像データを用いて、参照ブロックについてのSAD値を求める処理をするようにした。これに対して、この第2の実施形態では、図53に示すように、データ変換部14からのストリーム画像データを参照フレームの画像データとすると共に、フレームメモリ43に格納されている画像データを元フレームの画像データとして、参照ブロックについてのSAD値を求めるようにする。
そして、歪み補正解像度変換部16は、フレームメモリ43からの画像データの切り出しを、手ぶれ動きベクトル検出部15で検出された動きベクトルに基づいて行なうことで、手ぶれの無い画像データを出力するようにしている。その他の構成および動作は、第1の実施形態と同様である。
上述したように、この第2の実施形態では、データ変換部14からのストリーム画像データを参照フレームの画像データとする。このため、ある入力画素に対して、この画素を要素とする参照ブロックが、参照フレーム上に同時に複数存在することになる。図54は、そのことを説明するための図である。
すなわち、参照フレーム102上のサーチ範囲105における入力画素Dinは、例えば、参照ベクトル1071が対応する参照ブロック1061の左側に位置する画素であると共に、参照ベクトル1072が対応する参照ブロック1062の右上に位置する画素となっていることが、この図54から分かる。
したがって、入力画素Dinが参照ブロック1061に属するとした場合には、ターゲットブロック103の画素D1を読み出して、その差分を算出する必要がある。また、入力画素Dinが参照ブロック1062に属するとした場合には、ターゲットブロック103の画素D2を読み出して、その差分を算出する必要がある。
図54および後述の図55では簡単のため、2つの参照ブロックのみを図示しているが、実際上は、入力画素Dinを、その参照ブロック内の画素とする参照ブロックは多数となる。
この第2の実施形態の場合のSAD演算は、入力画素Dinの輝度値Yと、各々の参照ブロック内の入力画素Dinの位置に対応した、ターゲットブロック内の画素の輝度値Yとの差分絶対値を算出し、その算出した差分絶対値を、それぞれの参照ブロックに対応した参照ベクトルに従って、SADテーブルに加算してゆくようにして行なう。
例えば、入力画素Dinが参照ブロック1061に属するとした場合における、ターゲットブロック103の画素D1と入力画素Dinとの差分絶対値は、図55に示すように、SADテーブル108の参照ベクトル1071が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。また、入力画素Dinが参照ブロック1062に属するとした場合における、ターゲットブロック103の画素D2と入力画素Dinとの差分絶対値は、図55に示すように、SADテーブル108の参照ベクトル1072が対応するSADテーブル要素1092のSAD値に加算して書き込むようにする。
したがって、サーチ範囲内の全ての領域の入力画素が入力されて処理が終了したときには、SADテーブルが完成することになる。
図55の説明は、従来手法に、リアルタイムSAD算出処理を適用した場合である。この第2の実施形態においては、図55において、SADテーブル108の参照ベクトル1071または1072が対応するSADテーブル要素1091または1092のSAD値として、算出した差分絶対値のそれぞれを、加算して書き込むのではなく、前述した第1の実施形態のように、参照ベクトル1071,1072を縮小倍率1/nで縮小した参照縮小ベクトルを算出し、その参照縮小ベクトルの近傍の複数の参照ベクトルに、前記算出した差分絶対値から、それぞれを分散加算するための分散加算値を求め、求めた分散加算値を、前記近傍の複数の参照ベクトルに対応するSAD値に加算するようにするものである。
SADテーブル(縮小SADテーブル)が完成した後の正確な動きベクトルを検出するための処理は、この第2の実施形態においても、前述した第1の実施形態で述べた手法と全く同様にして、2次曲面や、水平方向および垂直方向の3次曲線を用いた手法を用いることができる。
この第2の実施形態における手ぶれ動きベクトル検出部15における動きベクトルの検出処理動作のフローチャートを図56および図57に示す。
先ず、手ぶれ動きベクトル検出部15では、入力画像のフレーム(参照フレーム)の任意の位置(x,y)の画素データDin(x,y)を受け取る(ステップS401)。次に、当該画素の位置(x,y)を含む複数の参照ブロックの一つに対応する参照ベクトル(vx,vy)を設定する(ステップS402)。
次に、設定された参照ベクトル(vx,vy)の参照ブロックIiの当該画素値Ii(x,y)と、これに対応するターゲットブロックIo内の画素値Io(x−vx,y−vy)との差分の絶対値αを算出する(ステップS403)。すなわち、差分絶対値αは、
α=|Io(x−vx,y−vy)−Ii(x,y)| ・・・(式3)
として算出される。
次に、縮小倍率を1/nとして、参照ベクトル(vx,vy)を1/nに縮小した参照縮小ベクトル(vx/n,vy/n)を算出する(ステップS404)。
次いで、参照縮小ベクトル(vx/n,vy/n)の近傍の複数の参照ベクトル、この例では、上述したように4個の近傍参照ベクトルを検知する(ステップS405)。そして、検知した4個の近傍参照ベクトルのそれぞれに対応するテーブル要素として分散加算すべき値(差分絶対値)を、前述したように、参照縮小ベクトルと近傍参照ベクトルとがそれぞれ示す位置の関係に基いて、ステップS403で求めた差分絶対値αから、線形加重分散値として求める(ステップS406)。そして、求めた4個の線形加重分散値を、近傍参照ベクトルのそれぞれに対応するSADテーブル要素値に加算する(ステップS407)。
次に、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS402〜ステップS407の演算を行なったか否か判別し(ステップS408)、当該入力画素Din(x,y)を含む他の参照ブロックがあると判別したときには、ステップS402に戻り、当該入力画素Dinを含む他の参照ブロック(vx,vy)を設定し、このステップS402〜ステップS407の処理を繰り返す。
また、ステップS408で、入力画素Din(x,y)を含む参照ブロックの全てについての上記ステップS402〜ステップS407の演算を行なったと判別したときには、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したか否か判別し(図57のステップS411)、終了していないと判別したときには、ステップS401に戻り、サーチ範囲内の次の入力画素Dinを取り込み、このステップS401以降の処理を繰り返す。
そして、ステップS411で、サーチ範囲内の全ての入力画素Dinについて、上記の演算ステップの処理を終了したと判別すると、縮小SADテーブルが完成したとして、当該完成した縮小SADテーブルにおいて、最小値となっているSAD値を検出する(ステップS412)。
次に、当該最小値となっているテーブル要素アドレス(mx,my)のSAD値(最小値)と、その近傍の複数個、この例では、上述したように15個の近傍テーブル要素のSAD値を用いて2次曲面を生成し(ステップS413)、その2次曲面の最小値のSAD値が対応する小数精度の位置を示す最小値ベクトル(px,py)を算出する(ステップS414)。この最小値ベクトル(px,py)は、小数精度の最小テーブル要素アドレスに対応している。
そして、算出した小数精度の位置を示す最小値ベクトル(px,py)をn倍することにより、求めるべく動きベクトル(px×n,py×n)を算出する(ステップS415)。
なお、この例においても、小数精度の位置を示す最小値ベクトル(px,py)を算出する方法としては、前述した水平方向および垂直方向の3次曲線を用いる方法を用いても良いことは前述の例と同様である。
また、前述の第1の実施形態の第3の例と同様にして、この第2の実施形態においても、サーチ範囲を絞りながら、かつ、必要に応じて縮小倍率を変更しながら、2段階以上、縮小SADテーブルを用いた動きベクトル検出処理を繰り返すようにしても、勿論良い。
この第2の実施形態のメリットは、フレームメモリを、第1の実施形態に比べて1枚分削減できることと、フレームメモリに入力画像を格納する時間を短縮できることである。メモリ削減の効果は言うまでもないが、処理時間の短縮も、近年、重要視されて来ている。特に動画を扱う場合、そのままシステム遅延の短縮に繋がるため、システム遅延が原因で生じる、実際の被写体とパネル表示画像の間に生じる違和感をなるべく無くすことは、ユーザへの訴求効果が高い。
[その他の実施形態および変形例]
上述の実施の形態では、分割画像区間のそれぞれでは、水平方向に領域を複数個に分割してそれぞれの分割領域にターゲットブロックを設定し、それぞれのターゲットブロックについて検出した動きベクトルの平均化処理により、それぞれの分割画像区間の手ぶれ動きベクトルを求めるようにしたが、分割画像区間のそれぞれについて一つのターゲットブロックを設定して、一つの動きベクトルを算出するようにしても勿論良い。
また、上述の実施形態では、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*は、1水平ライン区間の時間長当たりの手ぶれ補正量として、水平手ぶれ補正量SX_ADDおよび垂直手ぶれ補正量SY_ADDの時間積分演算を、水平補正速度成分X_STB_*および垂直補正速度成分Y_STB_*の単純加算とするようにしたが、それぞれの検出した速度成分と、各ラインの時間とを乗算するようにしても良いことは言うまでもない。
また、上述の実施形態の説明は、撮像装置を操作するユーザにより生起される手ぶれによる画像歪みを補正する場合であったが、ユーザにより生起される手ぶれのみではなく、撮影時に、撮像素子に対して、その撮像画像の水平方向および/または垂直方向の位置的変化を生じるように加わった振動などの偏倚力に起因して生じる画像歪みをも補正することができることは言うまでもない。
また、上述の実施形態は、X−Yアドレス型の固体撮像素子としてCMOSイメージャを用いた場合であるが、撮像素子としてはCMOSイメージャに限定されるものでないことは勿論である。
また、この発明は、撮像装置(カメラ)にのみ適用されるものではなく、例えば携帯電話端末、情報携帯端末などに撮像素子が取付けられて、画像を撮影する場合にも適用できるものである。さらに、ユーザが手で持って撮影を行なう装置にのみに適用されるものではなく、パーソナルコンピュータやテレビ電話装置などの固定的に設置される装置に対して外力が加わって振動等が生じる場合、また、自動車などに撮像素子が取付けられて、画像を撮影する場合にも適用可能である。
101…元フレーム、102…参照フレーム、103…ターゲットブロック、105…サーチ範囲、106…参照ブロック、107…参照ベクトル、15…手ぶれ動きベクトル検出部、16…歪み補正解像度変調幹部、41〜43…フレームメモリ、TBLs…縮小SADテーブル、TBLo…従来のSADテーブル、RV…参照ベクトル、CV…参照縮小ベクトル、NV1〜NV4…近傍参照ベクトル