以下、添付図面を参照して実施形態について説明する。なお、各図において同一又は相当部分には同一の符号を付し、重複する説明を省略する。
本実施形態に係る画像処理装置は、画像の手振れやローリングシャッタ歪み等の不具合を排除して画像を出力する装置である。本実施形態に係る画像処理装置は、例えば複数の画像の連続撮影や動画撮影の場合に採用される。本実施形態に係る画像処理装置は、例えば、携帯電話、デジタルカメラ、PDA(Personal Digital Assistant)等、リソースに制限のあるモバイル端末に好適に搭載されるものであるが、これらに限られるものではなく、例えば通常のコンピュータシステムに搭載されてもよい。なお、以下では、説明理解の容易性を考慮し、一例として、カメラ機能を備えた携帯端末に搭載される画像処理装置を説明する。
図1は、本実施形態に係る画像処理装置1を備える携帯端末2の機能ブロック図である。図1に示す携帯端末2は、例えばユーザにより携帯される移動端末であり、図2に示すハードウェア構成を有する。図2は、携帯端末2のハードウェア構成図である。図2に示すように、携帯端末2は、物理的には、CPU(Central Processing Unit)100、ROM(Read Only Memory)101及びRAM(Random Access Memory)102等の主記憶装置、カメラ又はキーボード等の入力デバイス103、ディスプレイ等の出力デバイス104、ハードディスク等の補助記憶装置105などを含む通常のコンピュータシステムとして構成される。後述する携帯端末2及び画像処理装置1の各機能は、CPU100、ROM101、RAM102等のハードウェア上に所定のコンピュータソフトウェアを読み込ませることにより、CPU100の制御の元で入力デバイス103及び出力デバイス104を動作させるとともに、主記憶装置や補助記憶装置105におけるデータの読み出し及び書き込みを行うことで実現される。なお、上記の説明は携帯端末2のハードウェア構成として説明したが、画像処理装置1がCPU100、ROM101及びRAM102等の主記憶装置、入力デバイス103、出力デバイス104、補助記憶装置105などを含む通常のコンピュータシステムとして構成されてもよい。また、携帯端末2は、通信モジュール等を備えてもよい。
図1に示すように、携帯端末2は、カメラ(撮像装置)20、画像処理装置1、画像記録部22、前回データ記録部23及び表示部21を備えている。カメラ20は、画像を撮像する機能を有している。カメラ20として、例えばCMOSの画素センサ等が用いられ、フォーカルプレーンシャッタ方式で撮像される。すなわち、カメラ20は、画像の縦方向又は横方向へ走査して画素値を入力する。カメラ20は、例えばユーザ操作等により指定されたタイミングから所定の間隔で繰り返し撮像する連続撮像機能を有している。すなわち、カメラ20は、静止画像(静止フレーム画像)だけでなく動画(連続する動フレーム画像)を取得する機能を有している。ユーザは、例えばカメラ20をスライドしたり、所定位置を原点として回転させたり、左右上下方向に傾けたり、上述した動作を組み合わせたりして、自由に撮影することができる。カメラ20は、例えば撮像されたフレーム画像を撮像の度に画像処理装置1へ出力する機能を有している。表示部21は、画像又は映像を表示可能なディスプレイ装置である。
画像処理装置1は、手振れやローリングシャッタ歪み等の不具合を排除してフレーム画像を出力する機能を有する。例えば、図3の(A),(B)に示すように、カメラ20により連続撮像されたフレーム画像をframei−1、frameiとし、その中心位置をCfi−1、Cfiとする。画像処理装置1は、フレーム画像framei−1よりも小さい大きさの切り出し領域Ki−1を設定する。例えば、切り出し領域Ki−1の大きさは、フレーム画像framei−1の大きさの70〜90%となる。切り出し領域Ki−1の中心位置は、Cri−1である。この切り出し領域Ki−1が出力フレーム画像となる。次に、カメラ20が(A)で示す撮像位置から(B)で示す撮像位置へ変化したとする(図3の(B)の実線の矢印で示す右上方向へのシフト)。この場合、フレーム画像framei−1よりも右上にシフトしたフレーム画像frameiが得られる。ここで、画像処理装置1は、フレーム画像framei−1とフレーム画像frameiとの間の動きを相殺する位置に、切り出し領域Kiを設定する(図3の(B)の点線の矢印で示す左下方向へのシフト)。これにより、前回の切り出し領域Ki−1の中心位置Cri−1と今回の切り出し領域Kiの中心位置Criとが同程度の位置となるため、あたかも静止しているかのような出力フレーム画像が生成され、表示部21へ出力される。
以下では、画像処理装置1の詳細を説明する。図1に示すように、画像処理装置1は、入力部10、動き取得部11、算出部(行列演算部)30及び描画部17を備えている。
入力部10は、カメラ20により撮像されたフレーム画像を入力する機能を有している。入力部10は、例えばカメラ20により撮像されたフレーム画像を撮像の度に入力する機能を有している。また、入力部10は、フレーム画像を、携帯端末2に備わる画像記録部22に保存する機能を有している。また、入力部10は、入力フレーム画像を動き取得部11へ出力する機能を有している。
動き取得部11は、入力フレーム画像(第2フレーム画像)と当該入力フレーム画像の直前又は以前に撮像されたフレーム画像(第1フレーム画像)を用いて、フレーム画像間の動きを取得する機能を有している。第1フレーム画像は、例えば画像記録部22に格納されている。動き取得部11は、画像記録部22を参照し、過去に入力されたフレーム画像を基準フレーム画像とし、基準フレーム画像と入力フレーム画像との相対的な動きデータを取得する。なお、基準フレーム画像は、処理対象の入力フレーム画像と一定領域以上の重なりがあればよい。このため、動き取得部11は、基準フレーム画像を入力フレーム画像の入力の度に変更する必要はなく、処理対象の入力フレーム画像と一定領域以上の重なりが無くなった場合に、次回以降の基準フレーム画像を更新してもよい。また、2枚のフレーム画像ではなく、3枚以上のフレーム画像を参照して動きを取得する場合には、直前に入力されたフレーム画像を一時基準フレーム画像とし、設定済みの基準フレーム画像及び一時基準フレーム画像と処理対象の入力フレーム画像とを比較して動きを取得してもよい。動き取得部11は、フレーム画像同士を比較して、例えば8自由度の動きデータP(観測値)を取得する。動き取得部11は、動きデータPを算出部30へ出力する。なお、動き取得部11は、携帯端末2に備わるジャイロセンサの出力値を入力することで、動きデータPを取得してもよい。ジャイロセンサは、基準フレーム画像と入力フレーム画像との間の動きデータPを検出して出力する機能を有する。
ここで、8自由度の動きについて概説する。図4は、8自由度の動きを説明する概要図である。図4に示すように、例えば変形前の画像が正方形である場合、カメラ20の動きによって、画像が(A)〜(H)へ変形する。ここで、(A)は拡大/縮小、(B)は平行四辺形(横方向)、(C)は平行四辺形(縦方向)、(D)は回転、(E)は平行移動(横方向)、(F)は平行移動(縦方向)、(G)は台形(横方向)、(H)は台形(縦方向)である。このため、画像処理装置1は、上記変形に合わせて切り出し領域Kiを設定する。
次に、動きデータP、切り出し領域Ki−1、切り出し領域Ki及び射影行列の関係を説明する。図5は、基準フレーム画像framei−1、処理対象のフレーム画像framei、それぞれの切り出し領域Ki−1,Ki、出力フレーム画像out-frameiの関係を示す概要図である。図5では、基準フレーム画像framei−1と処理対象のフレーム画像frameiとの動きデータ(動きベクトル)をPで示している。動きデータPは、動き取得部11によって既知である。また、基準フレーム画像framei−1の切り出し領域Ki−1と出力フレーム画像out-framei−1とを関連付けする変換式(射影行列)をPdst i−1で示している。射影行列Pdst i−1は、以下では前回の射影行列、又は、第1射影行列ともいう。射影行列Pdst i−1は、前回の演算にて算出された値であるため、既知の値である。射影行列Pdst i−1は、例えば前回データ記録部23に格納されている。この場合、図5に示すように、フレーム画像frameiの切り出し領域Kiと出力フレーム画像out-frameiとを関連付けする変換式(射影行列)Pdst iは、動きデータPと第1射影行列Pdst i−1を用いて、以下の数式(1)で算出することができる。
なお、射影行列Pdst iは、以下では、第2射影行列ともいう。
ここで、数式(1)の状態では、完全に切り出し領域を固定するモードとなる。しかしながら、ユーザの意図する動き(例えばカメラの平行移動やパン・チルト)に対しては追従させ、手振れ等の不具合は除去する必要がある。例えば、ハイパスフィルタを用いて、ユーザの意図する動き及び不具合となる動きをフィルタリングする。この場合、第2射影行列Pdst iは、以下の数式(2)となる。
ここでHPFは、ハイパスフィルタである。すなわち、手振れ等の高周波成分はパスさせて画面を固定させ、ユーザの意図する動きである低周波成分についてはカットして画面をユーザの動きに追従させる。
しかしながら、動きデータPには、ローリングシャッタ歪み成分が含まれている。図6は、ローリングシャッタ歪みを説明する概要図である。ローリングシャッタ歪みとは、図6の(A)のように、カメラ20が被写体に対して相対的に水平方向に移動した場合に、被写体が水平方向に平行四辺形状に歪むことである。カメラ20が垂直方向に移動する場合には、ローリングシャッタ歪みは、図6の(B)のように、被写体が垂直方向に拡大・縮小するように発生する。このローリングシャッタ歪み成分については、常に補正する必要があるため、ハイパスフィルタを常にパスさせるべき成分である。すなわち、ローリングシャッタ歪み成分については、ハイパスフィルタを適用させる必要性がない。よって、ローリングシャッタ歪み成分を分離させた状態で、ユーザの意図する動きに対しては追従させ、手振れ等の不具合は除去する枠組みを構築する。
図7は、上記枠組みを説明するための概要図である。図7に示すように、基準フレーム画像framei−1から動きデータPだけ移動した処理対象のフレーム画像frameiが存在するとする。図7では、既知の値は実線の矢印で示し、未知の値は点線の矢印で示している。矢印Pは動きデータ(動きベクトル)であり、既知である。矢印Di−1は、基準フレーム画像framei−1のローリングシャッタ歪み成分を示す演算子(第1行列Di−1)である。第1行列Di−1は、前回の演算の際に求まる値であるので、既知である。第1行列Di−1は、例えば前回データ記録部23に格納されている。第1行列Di−1を用いることで、入力画像系のフレーム画像をローリングシャッタ歪みのない系のフレーム画像へ変換することができる。
なお、図7では、「ローリングシャッタ歪みのない系」を図示しているが、完全にローリングシャッタ歪みが除去された系にする必要な無く、ローリングシャッタ歪みがある程度低減された系であってもよい。例えば、第1行列Di−1が正確な値である場合には、入力画像系のフレーム画像をローリングシャッタ歪みが完全に存在しない系のフレーム画像へ変換することになる。しかし、第1行列Di−1が正確な値でない場合には、入力画像系のフレーム画像をローリングシャッタ歪みが低減された系のフレーム画像へ変換することになる。このように、第1行列Di−1の正確性は、ローリングシャッタ歪み成分をどこまで考慮しないのかという度合いに影響を与える。このため、一応確からしい第1行列Di−1を用いた場合には、ローリングシャッタ歪みが低減された系へ変換させることができ、この場合、ローリングシャッタ歪み成分をある程度分離させた状態へすることが可能となる。すなわち、本実施形態の枠組みでは、ローリングシャッタ歪みの除去について、ある程度の誤差が含まれることを許容している。
図7では、基準フレーム画像framei−1のローリングシャッタ歪みが低減された画像をRS_framei−1で示している。矢印で示す行列Si−1は、RS_framei−1の切り出し領域と出力フレーム画像out-frameiとを関連付けするベクトル(射影行列)である。射影行列Si−1は、前回の演算の際に求まる値であるので、既知である。射影行列Si−1は、例えば、前回の演算の際に求まる第1射影行列Pdst i−1と第1行列Di−1とを用いて算出することができる。射影行列Si−1は、例えば前回データ記録部23に格納されている。以下では、射影行列Si−1を、ローリングシャッタ歪み成分が低減された系の第1射影行列ともいう。
図7に示すように、処理対象のフレーム画像frameiについても、ローリングシャッタ歪みのない系の画像RS_frameiへ変換することができれば、ローリングシャッタ歪みのない系における動きデータNを算出することができる。以下では、動きデータNを仮の動きデータともいう。ローリングシャッタ歪みが低減された系における動きデータNが求まれば、数式(2)と同様に、RS_frameiの切り出し領域と出力フレーム画像out-frameiとを関連付けする、ローリングシャッタ歪みが低減された系の射影行列Si(ローリングシャッタ歪みが低減された系の第2射影行列)は、以下の数式(3)で表される。
ローリングシャッタ歪みが低減された系における射影行列Siを用いて、第2射影行列Pdst iは、以下の数式(4)で表される。
このように、ローリングシャッタ歪みが低減された系へ変換することで、ローリングシャッタ歪みを考慮しないN・Si−1に関してのみハイパスフィルタを適用することができる。
算出部30は、上記枠組みを実現するための演算部である。すなわち、算出部30が、既に算出されて前回データ記録部23に記録されている前回データと測定値である今回データとを用いて、出力フレーム画像を第2フレーム画像へ射影させる第2射影行列Pdst iを算出する。
以下では、前回データ記録部23には、ローリングシャッタ歪み成分を示す第1行列Di−1、第2フレーム画像を入力する前に入力されたフレーム画像間のローリングシャッタ歪みが低減された系における前回の動きデータNPRE、第2フレーム画像を入力する前に入力されたフレーム画像間の前回の第2行列及び前回の補正行列、並びに、ローリングシャッタ歪みが低減された系における射影行列Si−1が格納されている場合を説明する。なお、第2行列及び補正行列の詳細は後述する。
算出部30は、出力フレーム画像を第2フレーム画像へ射影させる第2射影行列Pdst iを、ローリングシャッタ歪み成分を含む第1行列Di、撮像方向に直交する方向への平行移動成分及び撮像方向を基準とした回転成分の少なくとも一方を含む第2行列、並びに、第1行列Di及び第2行列に含まれる動き成分を含まない補助行列から算出する。すなわち、算出部30は、第2射影行列Pdst iを、第1行列Di、第2行列及び補助行列に分離させた状態で独立に算出する。算出部30は、第1算出部12、第2算出部13及び補助行列算出部14を備えている。
第1算出部12は、ローリングシャッタ歪み成分を含む第1行列Diを算出する。第1算出部12は、平行移動成分に基づいてローリングシャッタ歪み成分を算出する機能を有している。歪み量は、カメラ20の移動の速さが速くなるほど大きくなる。このことから、ローリングシャッタ歪みは、カメラ20の移動の速さを用いて推定することが可能であるといえる。カメラ20の移動の速さはフレーム間の平行移動量を用いて推定することができる。よって、第1算出部12は、例えば動きデータPに含まれる平行移動量に基づいて、ローリングシャッタ歪み成分を含む第1行列Diを算出する。ここで、前回の動きデータをPi−1とし、今回の動きデータをPiとすると、動きデータPi−1及び動きデータをPiに含まれる平行移動量を平均した値を、平行移動量としてもよい。ローリングシャッタ歪み成分は、歪みのある座標系を(xi,yi,1)t、歪みのない座標系を(Xi,Yi,1)tとすると、以下の数式(5)で表される。
上記数式(5)に示すように、Yの値が歪み成分に影響を与える。ここでローリングシャッタ歪み成分に含まれるdx i、dy iは画像の平行移動成分であり、αは歪み係数である。歪み係数αは、フレーム画像の1ラインを読み込む時間を、フレーム画像全体を読み込む時間と次のフレーム画像を読み込むまでの時間とを加算した値で除算して算出される値である。言い換えれば、歪み係数αは、フレーム画像の1ラインを読み込む時間を、当該フレーム画像の最初のラインを読み込んだ時刻から次のフレーム画像の最初のラインを読み込む時刻までの時間で除算して算出される値である。歪み係数αは、カメラ20に備わる画素センサの仕様や画素センサの駆動の設定により変化する。例えば、画素センサそれぞれにおいて、スキャンスピード、フレームレート、露光時間、画像サイズ、走査線の向き、ズーム倍率、f値、機械式手ブレ補正機構のON/OFF、フレームの撮像から出力までの時間、読み出し速度、読み出し方向等といった設定情報が異なる。このため、歪みの推定の前に、あらかじめ撮像素子(画像センサ)の様々な設定、撮像モード又は環境条件を含む撮像条件に対して算出しておく必要がある。なお、画像センサにおいて、隣接ライン間の時間差をtL、隣接フレーム間の時間差をtFとすると、歪み係数αは以下の式で算出することができる。なお、隣接フレーム間の時間差tFについては、動フレーム画像列のフレームレートに基づいて導出することができる。
ここで、フレーム画像のライン数(画像の高さ)をNLとすると、以下の不等式が成り立つ。
上記不等式は以下のように変形することができる。
このように、フレーム画像のライン数NLが既知の場合には、歪み係数αの上限値を決定することができる。
ここで、歪み係数αの算出方法について説明する。図8は、歪み係数αの算出方法を説明する概要図である。図8に示すように、歪み係数αは、静止フレーム画像frameb、動フレーム画像列frameiを用いて算出される。静止フレーム画像と動フレーム画像とを比較して、どの程度の歪みが発生するのかを求め、さらに、動フレーム画像間でどの程度の平行移動量であったのかを求めることにより、歪みと平行移動量の相関を求める。この相関関係から歪み係数αを算出する。
具体的には、まず、被写体及びカメラ20を静止させて、静止フレーム画像framebを撮影する。次に被写体あるいはカメラ20を動かし、動フレーム画像列:frame0、frame1、frame2、…、framei−1、frameiを撮影する。動フレーム画像frameiでの歪み量は、静止フレーム画像framebから動フレーム画像frameiへの動き行列Mb→iを計算することで算出することができる。歪み量は、静止フレーム画像framebの座標系を(xb,yb,1)とし、動フレーム画像frameiの座標系を(xi,yi,1)とすると、以下の数式(6)で表される。
ここで、動き行列Mb→iが平行移動成分及び歪み成分のみであると仮定すると、歪み量は、以下の数式(7)のように近似することができる。
数式(5)と数式(7)とを比較する。数式(7)では、歪み成分はm01 b→i及びm11 b→iである。一方、数式(5)においては、歪み成分の元となるのは連続するフレーム間の動き成分とした平行移動量(dx i,dy i)tである。平行移動量を求めるために、動フレーム画像frameiと、その一つ前の動フレーム画像framei−1から、動き行列Mi−1→iを求める。動フレーム画像frameiと、その一つ前の動フレーム画像framei−1との関係を以下の数式(8)で表すことができる。
上記数式(8)を用いてフレーム間の動き成分(m02 i−1→i,m12 i−1→i)tを平行移動成分(dx i,dy i)tとしてもよい。また、動フレーム画像frameiの中心座標の平行移動量を(dx i,dy i)tとしてもよい。また、連続するフレーム画像のうちフレーム画像frameiと直前のフレーム画像framei−1とを用いて第1の平行移動量を算出するとともに、フレーム画像frameiと直後のフレーム画像framei+1とを用いて第2の平行移動量を算出し、第1の平行移動量及び第2の平行移動量の平均(重み付け平均、多項式近似等)を用いて平行移動量を求めてもよい。平均の平行移動量を用いることで精度を向上させることができる。(dx i,dy i)tを算出することで、歪み係数αは、以下の数式(9),(10)で表すことができる。
ここで、一つのフレーム画像frameiにおいてm01 b→i,m11 b→i,dx i,dy iを測定し、数式(9)、数式(10)を用いることで、歪み係数αを求めることができる。しかし、歪み係数αを求めるための測定値であるm01 b→i,m11 b→i,dx i,dy iには誤差が含まれることが想定される。このため、一つのフレーム画像frameiについて求めた歪み係数を仮の歪み係数とし、複数のフレーム画像についてフレーム画像ごとに仮の歪み係数を求めて、これらの仮の歪み係数を用いて誤差を収束させた精度のよい歪み係数αを算出してもよい。図9は、横軸がframei、縦軸が歪み係数αiである。図9に示すように、様々なframeiについて仮の歪み係数αiを求め、それらの平均値(重み付け平均値)を歪み係数αとして採用してもよい。あるいは、様々なframeiについて仮の歪み係数αiを求め、それらの中央値を歪み係数αとして採用してもよい。図10は、横軸が移動量dx iであり、縦軸が動き行列成分m01 b→iである。図10に示すように、平行移動量及びローリングシャッタ歪み成分を座標軸とする2次元平面上にプロットし、数式(10)に示す回帰直線の傾きから歪み係数αを求めてもよい。測定値であるm01 b→i,m11 b→i,dx i,dy iの値が小さく、誤差が与える影響が大きい場合であっても、上述した手法により精度良く歪み係数αを求めることができる。なお、仮の歪み係数αi及び歪み係数αは上述した上限値(フレーム画像のライン数NLの逆数)以下である必要がある。このため、所定のフレーム画像framekの仮の歪み係数αkがフレーム画像のライン数NLの逆数よりも大きい場合には、当該フレーム画像framekについての仮の歪み係数αkをフレーム画像のライン数NLの逆数とする補正をした上で、上述した平均値、中央値、又は回帰直線による手法により歪み係数αを算出してもよい。あるいは、所定のフレーム画像framekの仮の歪み係数αkがフレーム画像のライン数NLの逆数よりも大きい場合には、当該フレーム画像framekの仮の歪み係数αkを除いて上述した平均値、中央値、又は回帰直線による手法により歪み係数αを算出してもよい。また、導出された歪み係数αがフレーム画像のライン数NLの逆数よりも大きい場合には、歪み係数αをフレーム画像のライン数NLの逆数とする補正をしてもよい。ローリングシャッタ歪みは画素センサの仕様や画素センサの駆動の設定により発生の様子が異なる。上述した手法で、カメラ20すなわち画素センサの設定に対してそれぞれ歪み係数αを算出することにより、カメラ20固有の条件を反映させて正確にローリングシャッタ歪みを推定することができる。なお、実際の測定値を用いて歪み係数αを算出する場合には、どのような撮像環境条件で歪み係数αを算出したのかについても記録しておいてもよい。撮像環境条件としては、例えば、「明るさ」又は「気温」等が含まれる。
第1算出部12は、上記の方法で算出された歪み係数αを記録したカメラ情報記録部を参照可能に構成されている。例えば、素子設定値と歪み係数αとを関連付けしたテーブルを備えている。素子設定値及び撮像環境と歪み係数αとを関連付けしたテーブルを備えていてもよい。第1算出部12は、カメラ情報記録部を参照し、画素センサの設定に応じて歪み係数αの値を取得し、カメラモーション成分を用いてローリングシャッタ歪み成分を推定する。画素センサの現状の設定情報や撮像環境に関する情報は、例えば、カメラ20から取得してもよい。また、カメラ情報記録部に、フレーム画像の1ラインを読み込む時間、及び、フレーム画像全体を読み込む時間と次のフレーム画像を読み込むまでの時間が、設定情報や撮像環境に関する情報に関連付けされて記録されている場合には、カメラ情報記録部から歪み係数αを直接取得するのではなく、カメラ情報記録部に記録されている情報に基づいて歪み係数αを演算してもよい。
第1算出部12は、上記のとおり平行移動のみを考慮して第1行列Diを導出しているため、算出された第1行列Diは真の値ではないものの、おおよそ正しい値を得ることができる。第1算出部12は、算出された第1行列Diを第2算出部13、補助行列算出部14及び描画部17へ出力する。
第1行列Diが算出されれば、処理対象のフレーム画像frameiをローリングシャッタ歪みのない系の画像RS_frameiへ変換することができる。これにより、図7に示す関係を用いて、動きデータP及び第1行列Diを用いてローリングシャッタ歪みが低減された系における動きデータNも導出することができる。
動きデータNを算出することで、ローリングシャッタ歪みが考慮されていないN・Si−1に関してのみハイパスフィルタを適用することができる。しかし、N・Si−1は行列であるため、N・Si−1をこのままの状態でハイパスフィルタを適用すると処理が複雑になるおそれがある。このため、算出部30は、上述したとおり、N・Si−1の動き成分を、ユーザの意図が反映されたカメラ20の動きと、それ以外の動き成分とに分割して取り扱う。第2算出部13は、ユーザの意図が反映されたカメラ20の動きを含む第2行列を算出する。補助行列算出部14は、補助行列を算出する。第2算出部13及び補助行列算出部14は、算出された第1行列Diを用いて、ローリングシャッタ歪みのない系における演算を実行可能に構成されている。
第2算出部13は、ユーザの意図が反映されたカメラ20の動きは平行移動成分及び回転成分の少なくとも一方であると推定する。なお、第2算出部13は、平行移動成分及び回転成分と明確に成分として分けて動きを算出してもよいし、平行移動成分及び回転成分を複合させた動き成分(コンビネーションとした成分)を算出してもよい。第2算出部13は、撮像方向に延びる軸をz軸、撮像方向に直交する方向に伸びる軸をx軸及びy軸とした場合、平行移動成分並びにx軸及びy軸の回転成分を組み合わせた成分を算出してもよい。また、撮像シーンに応じて、第2算出部13は、拡大縮小成分も考慮して推定してもよい。すなわち、第2行列は、平行移動成分のみを含んでもよいし、回転成分のみを含んでもよいし、平行移動成分及び回転成分のみを含んでもよいし、平行移動成分及び回転成分に加えて拡大縮小成分を含んでもよい。
図11は、平行移動成分及び回転成分を説明する概要図である。カメラ20の動きは撮像シーンに依存するものの、カメラワークのほとんどは平行移動成分及びz軸回転成分である。図11は、出力フレーム画像out-frameの座標系(x,y)と、処理対象のフレーム画像frameの座標系(X,Y)との関係を示す。図11において、撮像方向に延びる軸がz軸、撮像方向に直交する方向に伸びる軸がx軸及びy軸となる。撮像方向に延びる軸をz軸、撮像方向に直交する方向に伸びる軸をx軸及びy軸とした場合、平行移動成分は、x軸、y軸に平行な方向に移動する成分である。回転成分は、x軸、y軸及びz軸の少なくとも1つの回転成分である。
第2算出部13は、第2行列を算出するためにユーザ動き行列Acを算出する。ユーザ動き行列Acは、第2行列を算出するために用いられる行列であって、撮像方向に直交する方向への平行移動成分及び撮像方向を基準とした回転成分の少なくとも一方を含む。例えば、図11に示すように、第2算出部13は、出力フレーム画像out-frameの中心座標(0,0)と第2フレーム画像であるフレーム画像frameの中心(0,0)とを対応させるユーザ動き行列Acを算出する。第2算出部13は、動きデータPからユーザ動き行列Acを算出することができる。具体的には、第2算出部13は、例えば、出力フレーム画像out-frameを第1フレーム画像へ射影させる既知の第1射影行列Pdst i−1と動きデータPとを用いて、フレーム画像frameの中心座標を特定する。そして、第2算出部13は、出力フレーム画像out-frameの座標(x,y)を平行移動及び回転させて、フレーム画像frameの中心(X,Y)へ射影するユーザ動き行列Acを算出する。ヨー成分、ロール成分及びピッチ成分については、例えば、中心付近の移動量と焦点距離からある程度正確に推測することができる。ここでは、動きを平行移動及び回転に限定しているため、得られたユーザ動き行列Acは真の値ではないものの、おおよそ正しい値を得ることができる。第2算出部13は、算出されたユーザ動き行列Acを補助行列算出部14へ出力する。
第2算出部13は、ユーザ動き行列Acを補正して第2行列を算出する機能を有している。第2算出部13は、ユーザが意図したであろうカメラ20の動きに関して、手振れによる高周波成分を取り除く機能を有している。第2算出部13は、第1フィルタを用いてカメラワークに起因する周波数成分を除去する。第1フィルタは例えばハイパスフィルタである。また、第2算出部13は、例えば図12に示すように、切り出し領域Kiがフレーム画像frameiの外縁の枠に近づくほど、中心位置へ戻すようなばねモデルを適用して、カメラワークへの追従を実現させてもよい。例えば、第2算出部13は、外縁との距離の二乗に比例して中心位置へ戻すように作用させる第1フィルタをユーザ動き行列Acへ適用して、第2行列としてもよい。なお、第2算出部13は、x軸,y軸及びz軸のそれぞれでのばね係数(比例係数)を調整してもよい。また、第2算出部13は、フレーム画像frameiの中心付近では摩擦が高くなるように設定してもよい。このように設定することで、追随の安定性を向上させることができる。
補助行列算出部14は、ユーザ動き行列Acを用いて動きデータNの「残りの動き行列Bc」を算出する。行列Bcに含まれる成分は、例えば図4に示した8成分のうち、第1行列Di及びユーザ動き行列Acにて表現されていない残りの成分や、第1行列Di及びユーザ動き行列Acにて正確に表現されていない誤差成分(例えば、ローリングシャッタ成分の誤差成分や回転成分の誤差成分等)を含み得る。すなわち、残りの動き行列Bcは、設定された自由度及びユーザ動き行列Acに応じて変動することになる。例えば8自由度でかつユーザ動き行列Acが拡大縮小成分を含む場合には、残りの動き行列Bcは、四角形を台形へ変換する成分(図4に示す(G)、(H))及び誤差成分を含む。例えば8自由度でかつユーザ動き行列Acが拡大縮小成分を含まない場合には、残りの動き行列Bcは、拡大縮小成分、四角形を台形へ変換する成分(図4に示す(G)、(H))及び誤差成分を含む。例えば6自由度でかつユーザ動き行列Acが拡大縮小成分を含まない場合には、残りの動き行列Bcは、拡大縮小成分及び誤差成分を含む。例えば6自由度でかつユーザ動き行列Acが拡大縮小成分を含む場合には、残りの動き行列Bcは、誤差成分のみを含む。
補助行列算出部14は、ローリングシャッタ歪み成分が低減された系における第1射影行列Si−1及び動きデータNを用いて算出されたN・Si−1と、ユーザ動き行列Acとを用いて、残りの動き成分を含む動き行列Bcを算出する。以下では、ユーザ動き行列Ac がヨー成分yi、ピッチ成分pi及びロール成分r i を主に含む場合を説明する。この場合、補助行列算出部14は、以下の数式(11)又は(12)を用いて、残りの動き成分を含む動き行列Bcを算出する。
すなわち、補助行列算出部14は、N・Si−1の動き成分を、ヨー成分yi、ピッチ成分pi及びロール成分riを含むユーザ動き行列Acと、それ以外の動き成分liを含む残りの動き行列Bcとに分割して取り扱い、ユーザ動き行列Acを別個に算出して上記数式(11)又は(12)に代入することで、成分liを得る。なお、以下では補助行列算出部14が数式(11)を用いた場合を説明する。
補助行列算出部14は、算出された「残りの動き行列Bc」を補正して補助行列を算出する機能を有している。残りの動き行列Bcは、動きに対して補助的な成分を含む行列であり、誤差又は無視された成分を含み得る。このため、理想的には、残りの動き行列Bcは恒等写像する単位行列となる。よって、残りの動き行列Bcをどのタイミングで単位行列とするかが問題となる。第2補正部16は、誤差が段々と無くなるように、すなわち、急に単位行列へ補正するのではなく、残りの動き行列Bcが段々と単位行列となるように補正する。例えば、単位行列と残りの動き行列Bcとの差分を算出し、その差分が80%となるように補正してもよい。例えば補助行列算出部14は、ハイパスフィルタを用いて上記処理を実現してもよい。このように、急に単位行列へ補正することを回避することで、出力フレーム画像が最終的に不自然な動きとなることを回避することが可能となる。
上述した第2算出部13及び補助行列算出部14の処理を纏めると、以下のとおりとなる。
すなわち、第2行列は、ヨー成分yi、ピッチ成分pi及びロール成分riを含むユーザ動き行列Acにハイパスフィルタを適用した行列であり、補助行列は、残りの動き行列Bcにハイパスフィルタを適用した行列である。なお、ヨー成分yi、ピッチ成分pi及びロール成分riに適用するハイパスフィルタのみ、複雑な1変数フィルタが設計されてもよい。すなわち、ユーザの意図が反映されたカメラ20の動きのみ、正確にフィルタを設計する。ここで、ハイパスフィルタは、例えば前回データ記録部23に記憶されたデータを用いて設計されてもよい。第2算出部13は、例えば、第2行列を算出する度に、算出された第2行列を前回データ記録部23へ出力して記録させる。これにより、第2行列を導出するハイパスフィルタは、例えば前回データ記録部23に記憶された過去の第2行列を用いて設計される。また、補助行列算出部14は、残りの動き成分liにハイパスフィルタを適用する。ここで、ハイパスフィルタは、例えば前回データ記録部23に記憶されたデータを用いて設計されてもよい。補助行列算出部14は、例えば、補助行列を算出する度に、算出された補助行列を前回データ記録部23へ出力して記録させる。これにより、補助行列を導出するハイパスフィルタは、例えば前回データ記録部23に記憶された過去の補助行列を用いて設計される。なお、上記のとおり、残りの動き成分liに適用させるハイパスフィルタは、恒等行列に近づける単純な設計としてもよい。このように、正確に設計するフィルタとある程度の正確なフィルタとを区別することができるので、全体のフィルタ設計が容易となる。
算出部30は、第2行列及び補助行列を用いて、以下のように、ローリングシャッタ歪みのない系における射影行列Siを導出する。
そして、算出部30は、第1行列Di、第2行列及び補助行列を用いて、出力フレーム画像out-frameiと入力フレーム画像frameiとを対応付けする第2射影行列Pdst iを導出する。
描画部17は、第2射影行列Pdst iを用いて、入力フレーム画像frameiの切り出し領域Kiを算出し、出力フレーム画像out-frameiとして表示部21へ出力する。
次に、本実施形態に係る画像処理装置1の動作について説明する。図13は、本実施形態に係る画像処理装置1の動作を示すフローチャートである。図13に示す制御処理は、例えば携帯端末2の撮像機能をONしたタイミングで実行され、所定の周期で繰り返し実行される。なお、説明理解の容易性を考慮して、処理対象の入力フレーム画像は、2番目以降の入力フレーム画像であるとする。
図13に示すように、最初に画像処理装置1が画像入力処理を実行する(S10:入力ステップ)。S10の処理では、入力部10が、カメラ20から入力フレーム画像frameiを入力する。S10の処理が終了すると、動きデータ取得処理へ移行する(S12:動き取得ステップ)。
S12の処理では、動き取得部11が、入力フレーム画像frameiとフレーム画像framei−1との間の動きデータPを取得する。S12の処理が終了すると、ローリングシャッタ歪み成分を含む第1行列Diの算出処理へ移行する(S14:第1算出ステップ)。
S14の処理では、第1算出部12が、S12の処理で取得された動きデータに基づいてローリングシャッタ歪み成分を含む第1行列Diを算出する。S14の処理が終了すると、動きデータNの算出処理へ移行する(S16)。
S16の処理では、算出部30が、S12の処理で得られた動きデータP、S14の処理で得られた第1行列Diを用いて、仮の動きデータNを算出する。S16の処理が終了すると、回転成分算出処理へ移行する(S18)。
S18の処理では、第2算出部13が、回転成分(ユーザ動き行列Ac)を算出する。例えば、入力フレーム画像frameiの中心位置の移動量と焦点距離からある程度正確に推測することができる。一例としてヨー方向の算出を説明する。x軸方向の移動量をdmxとし、焦点距離をdnとした場合、ヨー方向の成分は、以下の数式で簡易に算出することができる。
S18の処理が終了すると、ユーザ動き行列Acへのフィルタ処理へ移行する(S20:第2算出ステップ)。
S20の処理では、第2算出部13が、S18の処理で得られたユーザ動き行列Acをハイパスフィルタで補正して第2行列を得る。すなわち、第2算出部13は、前回データ記録部23を参照して、過去の第2行列を取得し、過去の第2行列と動き行列Acとを用いて、第2行列を得る。S20の処理が終了すると、残りの動き行列Bcへのフィルタ処理へ移行する(S22:補助行列算出ステップ)。
S22の処理では、補助行列算出部14が、残りの動き行列Bcを算出し、残りの動き行列Bcに対してフィルタ処理を行い、補助行列を得る。まず、補助行列算出部14が、N・Si−1の動き成分を、ヨー成分yi、ピッチ成分pi及びロール成分riを含むユーザ動き行列Acと、それ以外の動き成分liを含む残りの動き行列Bcとに分割して取り扱い、ユーザ動き行列Acを別個に算出して上記数式(11)に代入することで、成分liを残りの動き行列Bcとして得る。また、補助行列算出部14は、前回データ記録部23を参照して、過去の補助行列を取得し、過去の補助行列と動き行列Acとを用いて、補助行列を得てもよい。
S24の処理では、算出部30が、S20の処理で得られた第2行列、及び、S22の処理で得られた補助行列を用いて、ローリングシャッタ歪みのない系における射影行列Siを算出する。S24の処理が終了すると、描画行列(射影行列)の算出処理へ移行する(S26)
S26の処理では、算出部30が、例えば上記数式(4)で示すように、S24の処理で得られた射影行列Siを用いて、入力画像系における第2射影行列Pdst iを算出する。S26の処理が終了すると、描画処理へ移行する(S28:描画ステップ)。
S28の処理では、描画部17が、S26の処理で得られた第2射影行列Pdst iを用いて入力フレーム画像frameiの切り出し領域Kiを算出し、出力フレーム画像out-frameiとして表示部21へ出力する。S28の処理が終了すると、判定処理へ移行する(S30)。
S30の処理では、画像処理装置1が、画像の入力が終了したか否かを判定する。画像処理装置1は、例えば、所定の入力回数に達したか否か、あるいは、前回入力から所定の時間経過したか否かに基づいて、画像の入力が終了したか否かを判定する。S30の処理において、画像の入力が終了していないと判定した場合には、S10の処理へ再度移行する。一方、S30の処理において、画像の入力が終了したと判定した場合には、図13に示す制御処理を終了する。図13に示す制御処理を実行することで、人間の意図が強く反映される平行移動成分及び回転成分と、その他の成分及び誤差成分とを互いに関連させることなく独立して補正することが可能となる。なお、第1算出ステップ、第2算出ステップ及び補助行列算出ステップが行列演算ステップに相当する。
次に、携帯端末(コンピュータ)2を上記画像処理装置1として機能させるための画像処理プログラムを説明する。
画像処理プログラムは、メインモジュール、入力モジュール及び演算処理モジュールを備えている。メインモジュールは、画像処理を統括的に制御する部分である。入力モジュールは、入力画像を取得するように携帯端末2を動作させる。演算処理モジュールは、動き取得モジュール、算出モジュール(第1算出モジュール、第2算出モジュール及び補助行列算出モジュール)及び描画モジュールを備えている。メインモジュール、入力モジュール及び演算処理モジュールを実行させることにより実現される機能は、上述した画像処理装置1の入力部10、動き取得部11、算出部30(第1算出部12、第2算出部13及び補助行列算出部14)及び描画部17の機能とそれぞれ同様である。
画像処理プログラムは、例えば、ROM等の記録媒体または半導体メモリによって提供される。また、画像処理プログラムは、データ信号としてネットワークを介して提供されてもよい。
以上、本実施形態に係る画像処理装置1、画像処理方法及び画像処理プログラムによれば、画像の変形の動きを、平行移動成分又は回転成分の少なくとも一方と、ローリングシャッタ歪み成分と、その他の成分とに分けて取り扱い、それぞれ別個に算出する。第1算出部12により、動きデータを用いて、ローリングシャッタ歪み成分を含む第1行列Diがある程度正確に算出される。第2算出部13により、出力フレーム画像out-framei−1を基準フレーム画像framei−1へ射影させる既知の第1射影行列Pdst i−1と動きデータPとを用いて、撮像方向に直交する方向への平行移動成分及び撮像方向を基準とした回転成分の少なくとも一方を含むユーザ動き行列Acがある程度正確に算出される。補助行列算出部14により、第1行列Di、ユーザ動き行列Ac及び第1射影行列Pdst i−1を用いて、第1行列Di及びユーザ動き行列Acに含まれる動き成分を含まない残りの動き行列Bcが算出される。そして、ユーザ動き行列Ac及び残りの動き行列Bcが補正されて、第2行列及び補助行列が算出される。このように、当該画像処理装置1は、動きデータを3つに分解し、計算過程において別個に算出することができるため、動き成分に応じた処理が可能となる。例えば、除去すべきローリングシャッタ成分を手ぶれ除去等を行う補正対象から外すことが可能となる。これにより、補正の計算コストや補正フィルタの設計を容易とすることができる。さらに、平行移動成分又は回転成分と、補助行列が含む成分とをそれぞれ異なる式で算出していることから、人間の意図が強く反映される平行移動成分又は回転成分と、その他の残りの成分とを互いに関連させることなく独立して補正することが可能となる。すなわち、人間の意図が強く反映される動き成分とそれ以外の動き成分とを異なるフィルタで補正することができるため、カメラワークに適切に追従しながらユーザの意図しない動きによる不具合を解消することを両立させることが可能となる。また、各成分に対する補正は独立しているため、補正フィルタを容易に設計することができる。また、動きデータの形式が変更されたり、不正確なデータが存在したりする場合であっても、動きデータの形式の変更部分やエラー部分を補助行列に含ませることが可能であるため、全ての動きデータの形式に対応可能である。また、第2算出部の動きの算出方法は限定されないため、例えば、正確ではないがロバストな算出方法を第2算出部の動きの算出方法に適用することができる。この場合、画像処理装置1全体としてロバストな処理を行うことができる。さらに、完全な電子手振れ補正を実現することができる。
また、本実施形態に係る画像処理装置1、画像処理方法及び画像処理プログラムによれば、残りの動き行列Bcの値を生かしつつ、理想的な値(すなわち恒等写像)となるように補正することができる。このため、ユーザの意図しない動きによる不具合をより自然に解消することが可能となる。
また、本実施形態に係る画像処理装置1、画像処理方法及び画像処理プログラムによれば、ローリングシャッタ歪み成分が平行移動成分のみに起因すると仮定することにより、ほとんど正確なローリングシャッタ歪み成分を簡易かつ迅速に推定することができる。
なお、上述した実施形態は本発明に係る画像処理装置の一例を示すものである。本発明に係る画像処理装置は、実施形態に係る画像処理装置1に限られるものではなく、各請求項に記載した要旨を変更しない範囲で、実施形態に係る画像処理装置を変形し、又は他のものに適用したものであってもよい。
例えば、上述した実施形態では、カメラ20が動画を撮像する例を説明したが、カメラ20は、静止画像を連続撮像するものであってもよい。入力部10が入力する画像は、別の機器からネットワークを介して送信された画像であってもよい。
また、上述した実施形態では、カメラ20により撮像された画像の大きさは同一であるとして説明したが、撮像された画像の大きさは撮像の度に異なる大きさであってもよい。
また、上述した実施形態では、画像を図4に示す8自由度で変形する場合を説明したが、8自由度に限られるものではなく、例えば図4中の(A)〜(F)に示す6自由度であってもよい。
また、上述した実施形態では、第1算出部12がローリングシャッタ歪み成分を推定する一例、第2算出部13が平行移動成分及び回転成分を推定する一例を説明したが、上記手法に限られるものではなく、公知の種々の方法を採用することができる。また、第1算出部12が、第2算出部13により得られた平行移動成分を用いてローリングシャッタ歪み成分を推定してもよい。
また、上述した実施形態にて説明したフローチャートの順番は適宜変更可能である。例えば、S18の処理又はS18及びS20の一連の処理は、S14又はS16の処理と並列に実行してもよい。
また、上述した実施形態では、第1フレーム画像と第2フレーム画像とを用いて第2フレーム画像と出力フレーム画像とを関連付けする射影行列を算出する場合を説明したが、これに限定されるものではない。すなわち、入力フレーム画像で出力フレーム画像を逐次生成する必要はなく、入力フレーム画像と出力フレーム画像の参照先となる画像とが時間的にずれていてもよい。例えば、第1フレーム画像と第2フレーム画像との間に存在する第3フレーム画像を、出力フレーム画像を生成するための処理対象とし、第3フレーム画像と出力フレーム画像とを関連付けする射影行列を算出してもよい。第3フレーム画像は、上記実施形態で説明した第2フレーム画像と同様に処理されてもよいし、第1フレーム画像だけでなく、第2フレーム画像を用いて、第3フレーム画像への射影行列を算出してもよい。すなわち、第3フレーム画像からみて過去のデータである第1フレーム画像と、第3フレーム画像からみて未来のデータである第2フレーム画像とを用いて、第3フレーム画像の射影行列を算出してもよい。
さらに、上述した実施形態では、例えば数式(2)に示すように、動きデータPと第1射影行列Pdst i−1とにハイパスフィルタを作用させる例を説明したが、ハイパスフィルタの作用先を適宜変更してもよい。例えば、数式(2)を以下のように変更してもよい。
この場合、ハイパスフィルタは動きデータNに作用することになる。この場合、数式(13)は、以下のように変更される。
このように、動きデータNが分割される態様であってもよい。また、ハイパスフィルタは切り出し位置に応じて、ハイパスフィルタの係数を変更してもよい。