(57)【要約】      （修正有）【課題】動被写体の境界領域など、異なる動きが混在する領域において、平滑化項を精度よく生成することにより、当該平滑化項を含むエネルギー関数を利用して導出されるオプティカルフローの精度を向上させる。【解決手段】画像処理装置１００は、縮小画像から導出された初期値動きベクトルに基づいて、エネルギー関数を使用して画像間の着目画素の動きベクトルを導出する画像処理装置であって、着目画素に関する画素値レンジを取得する画素値レンジ取得手段と、画素値レンジに応じて、初期値動きベクトルから、エネルギー関数の平滑化項を生成するための第一の動きベクトルを導出する第一の導出手段と、第一の動きベクトルによって生成された平滑化項を含むエネルギー関数に基づいて、着目画素の動きベクトルを導出する第二の導出手段とを有する。【選択図】図３
2019128950.tif 000002
【特許請求の範囲】
【請求項１】
縮小画像から導出された初期値動きベクトルに基づいて、エネルギー関数を使用して画像間の着目画素の動きベクトルを導出する画像処理装置であって、
前記着目画素に関する画素値レンジを取得する画素値レンジ取得手段と
前記画素値レンジに応じて、前記初期値動きベクトルから、前記エネルギー関数の平滑化項を生成するための第一の動きベクトルを導出する第一の導出手段と、
前記第一の動きベクトルによって生成された平滑化項を含む前記エネルギー関数に基づいて、前記着目画素の動きベクトルを導出する第二の導出手段と
を有することを特徴とする画像処理装置。
【請求項２】
前記第一の導出手段は、前記着目画素と周辺画素のうち、画素値が前記画素値レンジに含まれる画素に対応する複数の動きベクトルを前記初期値動きベクトルから抽出し、前記抽出した複数の動きベクトルから前記第一の動きベクトルを導出することを特徴とする請求項１に記載の画像処理装置。
【請求項３】
前記第一の導出手段は、前記着目画素を中心とした画素群に対応する動きベクトル群から１または複数の基準動きベクトルをサンプリングし、前記抽出した複数の動きベクトルの中から、前記１または複数の基準動きベクトルのそれぞれに類似する動きベクトルの集合を求め、前記集合のうち最も多くの動きベクトルが含まれる集合の動きベクトルの水平成分及び垂直成分のそれぞれの平均値を組み合わせて、前記第一の動きベクトルとして導出することを特徴とする請求項２に記載の画像処理装置。
【請求項４】
前記第一の導出手段は、前記抽出した複数の動きベクトルの水平成分及び垂直成分のそれぞれの中央値を組み合わせて、前記第一の動きベクトルを導出することを特徴とする請求項２に記載の画像処理装置。
【請求項５】
前記第一の導出手段は、前記抽出した複数の動きベクトルの水平成分及び垂直成分のそれぞれの平均値を組み合わせて、前記第一の動きベクトルとして導出することを特徴とする請求項２に記載の画像処理装置。
【請求項６】
前記第一の導出手段は、前記着目画素の画素値と前記周辺画素の画素値の差を重みとして使用した、前記抽出した複数の動きベクトルの水平成分及び垂直成分のそれぞれの重み付け平均値を組み合わせて、前記第一の動きベクトルとして導出することを特徴とする請求項２記載の画像処理装置。
【請求項７】
前記第二の導出手段は、前記エネルギー関数を最小化する動きベクトルを前記着目画素の動きベクトルとして導出することを特徴とする請求項１乃至６のいずれか１項に記載の画像処理装置。
【請求項８】
前記第二の導出手段は、勾配法を用いて、前記エネルギー関数を最小化する動きベクトルを導出することを特徴とする請求項７に記載の画像処理装置。
【請求項９】
前記第二の導出手段は、テンプレートマッチングを用いて、前記エネルギー関数を最小化する動きベクトルを導出することを特徴とする請求項７に記載の画像処理装置。
【請求項１０】
前記画素値レンジ取得手段は、前記着目画素を含む複数の領域から画素値の分散にしたがって選択された領域の画素値レンジを取得することを特徴とする請求項１乃至９のいずれか１項に記載の画像処理装置。
【請求項１１】
前記画素値レンジ取得手段は、前記画素値の分散にしたがって選択された領域の画素値の平均値と分散から、前記画素値レンジを算出することを特徴とする請求項１０に記載の画像処理装置。
【請求項１２】
前記画素値レンジ取得手段は、前記画素値の分散にしたがって選択された領域の画素値の上限値と下限値を前記画素値レンジとして算出することを特徴とする請求項１０に記載の画像処理装置。
【請求項１３】
コンピュータを、請求項１乃至１２の何れか１項に記載の画像処理装置として機能させるためのプログラム。
【請求項１４】
縮小画像から導出された初期値動きベクトルに基づいて、エネルギー関数を使用して画像間の着目画素の動きベクトルを導出する画像処理装置による画像処理方法であって、
前記着目画素に関する画素値レンジを取得する画素値レンジ取得工程と
前記画素値レンジに応じて、前記初期値動きベクトルから、前記エネルギー関数の平滑化項を生成するための第一の動きベクトルを導出する第一の導出工程と、
前記第一の動きベクトルによって生成された平滑化項を含む前記エネルギー関数に基づいて、前記着目画素の動きベクトルを導出する第二の導出工程と
を含むことを特徴とする画像処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、画像間のオプティカルフローを算出する技術に関する。
【背景技術】
【０００２】
近年、画像間で各画素の対応付けを行う技術の重要性が高まっている。対応とは、着目画像の画素と、当該画素と同一であるとみなされる参照画像の画素との関係であり、二点の座標で表現される。かかる技術をステレオ画像や複数視点画像に適用すると、画素の対応関係から被写体の奥行きを算出できるため、３次元画像処理に応用することも可能である。また、かかる技術を、連続して撮像された画像（動画）に適用し、対応関係を相対座標として表現すれば、対応関係は動きベクトルとなる。画素ごとの動きベクトルの集合（以下、オプティカルフローと称する）を利用することによって、動体追跡、動画の防振、及びフレーム補間などが可能となる。
【０００３】
オプティカルフローを取得するための代表的な手法としては、勾配法やテンプレートマッチング法がある。例えば、勾配法は、画素の時空間の輝度変化の方向と大きさから、オプティカルフローを導出する。勾配法では、着目画素の周辺の画素は同じ動きをすると仮定し、着目画素を中心とするパッチ内の画素の平均的な時空間の輝度変化を求める。代表的な方法には、Ｌｕｃａｓ  Ｋａｎａｄｅ法（以下、ＬＫ法と称する。非特許文献１参照。）がある。ＬＫ法は、移動前後のパッチの画像相関をＳＳＤ（Ｓｕｍ  ｏｆ  Ｓｑｕａｒｅｄ  Ｄｉｆｆｅｒｅｎｃｅ：差の二乗和）で表現し、ＳＳＤをテイラー展開してＳＳＤが最小となる、つまり相関が最も高い移動量を導出する方程式を解く。この移動量が、着目画素の動きである。このとき、画像相関を表す計算式をデータ項と呼ぶ。データ項だけで動きを導出する場合、画像に歪が存在して正しい相関が得られない、または、相関が高い移動量が複数あり、解が一意に定まらないなどのケースがある。そのため、エネルギー関数において、データ項にオプティカルフローの滑らかさを表す平滑化項を重み付き加算し、この和をエネルギーとして、エネルギーが最も小さくなる移動量を算出する手法が使われる。特許文献１には、平滑化項を利用した方式が開示されている。
【０００４】
また、勾配法では、検出可能な動きが小さいため、複数の縮小画像から構成される画像ピラミッド（すなわち、解像度が異なる同一画像の集合）を用いることが一般的である。この方法では、解像度が低い縮小画像から導出したオプティカルフローを初期値として利用して、一段解像度が高い画像からオプティカルフローを導出する。そうすることによって、解像度が低い縮小画像では大きな動きを検出し、より解像度が高い画像では、解像度が低い縮小画像で検出した動きの差分、つまり、より高精度な動きを検出する。画像ピラミッドを用いる代表的な手法が、非特許文献２に開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−１７８７６４号公報
【非特許文献】
【０００６】
【非特許文献１】Ｂ．Ｄ．Ｌｕｃａｓ  ａｎｄ  Ｔ．Ｋａｎａｄｅ（１９８１），  Ａｎ  ｉｔｅｒａｔｉｖｅ  ｉｍａｇｅ  ｒｅｇｉｓｔｒａｔｉｏｎ  ｔｅｃｈｎｉｑｕｅ  ｗｉｔｈ  ａｎ  ａｐｐｌｉｃａｔｉｏｎ  ｔｏ  ｓｔｅｒｅｏ  ｖｉｓｉｏｎ．  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  Ｉｍａｇｉｎｇ  Ｕｎｄｅｒｓｔａｎｄｉｎｇ  Ｗｏｒｋｓｈｏｐ，  ｐａｇｅｓ  １２１−１３０
【非特許文献２】Ｐｙｒａｍｉｄａｌ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｏｆ  ｔｈｅ  Ｌｕｃａｓ  Ｋａｎａｄｅ  Ｆｅａｔｕｒｅ  Ｔｒａｃｋｅｒ  Ｄｅｓｃｒｉｐｔｉｏｎ  ｏｆ  ｔｈｅ  ａｌｇｏｒｉｔｈｍ  Ｊｅａｎ−Ｙｖｅｓ  Ｂｏｕｇｕｅｔ  Ｈｔｔｐ：／／ｒｏｂｏｔｓ．ｓｔａｎｆｏｒｄ．ｅｄｕ／ｃｓ２２３ｂ０４／ａｌｇｏ＿ｔｒａｃｋｉｎｇ．ｐｄｆ
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、特許文献１に開示された方式では、動被写体の境界領域など、異なる動きが混在する領域において、平滑化項を精度よく生成することができなかった。そのため、かかる領域では、当該平滑化項を含むエネルギー関数を利用して導出されるオプティカルフローも精度よく導出することができなかった。
【課題を解決するための手段】
【０００８】
本発明の一実施例に係る画像処理装置は、縮小画像から導出された初期値動きベクトルに基づいて、エネルギー関数を使用して画像間の着目画素の動きベクトルを導出する画像処理装置であって、前記着目画素と周辺画素の画素値を取得する画素値取得手段と、前記着目画素に関する画素値レンジを取得する画素値レンジ取得手段と、前記画素値レンジと前記周辺画素の画素値に応じて、前記初期値動きベクトルから、前記エネルギー関数の平滑化項を生成するための第一の動きベクトルを導出する第一の導出手段と、前記第一の動きベクトルによって生成された平滑化項を含む前記エネルギー関数に基づいて、前記着目画素の動きベクトルを導出する第二の導出手段とを有することを特徴とする。 
【発明の効果】
【０００９】
本発明によると、動被写体の境界領域など、異なる動きが混在する領域において、平滑化項を精度よく生成することにより、当該平滑化項を含むエネルギー関数を利用して導出されるオプティカルフローの精度を向上させることができる。
【図面の簡単な説明】
【００１０】
【図１】実施例１における画像処理装置の構成を示すブロック図である。
【図２】オプティカルフローの概念図である。
【図３】実施例１における画像処理装置の機能ブロック図である。
【図４】実施例１のオプティカルフロー算出処理のフローチャートである。
【図５】着目画素とその周辺画素の拡大例を示す図である。
【図６】実施例１における平滑化ベクトル算出処理のフローチャートである。
【図７】実施例１における勾配法を用いた動きベクトル算出処理のフローチャートである。
【図８】実施例２における平滑化ベクトル算出処理のフローチャートである。
【図９】実施例３における動き探索を用いた動きベクトル算出処理のフローチャートである。
【図１０】実施例４における画像処理装置の構成を示すブロック図である。
【図１１】実施例４におけるＯＦ計算部の内部構成を示すブロック図である。
【図１２】実施例５におけるＯＦ計算部の内部構成を示すブロック図である。
【図１３】着目画素とその周辺画素の拡大例を示す図である。
【図１４】画素値レンジを取得するために設定される複数の領域の例を示す図である。
【図１５】実施例１の変形例における平滑化ベクトル算出処理のフローチャートである。
【発明を実施するための形態】
【００１１】
以下、本発明の実施例について、図面を参照しながら詳細に説明する。
【実施例１】
【００１２】
図１は、本実施例に係る画像処理装置１００のハードウェア構成を示す図である。
【００１３】
画像処理装置１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＲＯＭ１０３、記憶部１０４、入力インターフェース１０５、出力インターフェース１０６、及びシステムバス１０７を備える。また、画像処理装置１００は、入力インターフェース１０５と出力インターフェース１０６を介して、外部メモリ１０８に接続されている。また、画像処理装置１００は、出力インターフェース１０６を介して、表示装置１０９に接続されている。
【００１４】
ＣＰＵ１０１は、画像処理装置１００の上述した各構成要素を統括的に制御するプロセッサである。ＲＡＭ１０２は、ＣＰＵ１０１の主メモリであり、ワークエリアとして機能する。ＲＯＭ１０３は、画像処理装置１００内の処理に用いられるプログラム等を格納するメモリである。ＣＰＵ１０１は、ＲＡＭ１０２をワークエリアとしてＲＯＭ１０３に格納されたプログラムを実行することで、後述する様々な処理を実行する。記憶部１０４は、画像処理装置１００での処理に用いる画像データや、処理のためのパラメータなどを記憶する記憶デバイスである。記憶部１０４としては、ＨＤＤや光ディスクドライブ、フラッシュメモリなどを用いることができる。また、記憶部１０４は、画像処理装置１００内の処理に用いられるプログラム等を格納することもできる。すなわち、ＣＰＵ１０１は、記憶部１０４に記憶されたプログラムを実行することで、後述する様々な処理を実行することもできる。
【００１５】
入力インターフェース１０５は、ＵＳＢやＩＥＥＥ１３９４、ＳＡＴＡなどのシリアルバスインターフェースである。画像処理装置１００は、入力インターフェース１０５を介して、外部メモリ１０８（例えば、ハードディスク、メモリカード、ＣＦカード、ＳＤカード、ＵＳＢメモリなど）から処理対象の画像データ等を取得することができる。出力インターフェース１０６は、ＤＶＩやＨＤＭＩなどの映像出力端子である。画像処理装置１００は、出力インターフェース１０６を介して、表示装置１０９（液晶ディスプレイなどの画像表示デバイス）に、画像処理装置１００で処理した画像データを出力することができる。なお、画像処理装置１００は、上記以外の構成要素を備えてもよいが、本発明の主眼ではないため、説明は省略する。
【００１６】
次に、本実施例における用語と表記法について説明する。本実施例では、画像の各画素に対応する動きベクトルの集合をオプティカルフローと表現する。つまり、オプティカルフローは、入力画像と同じ解像度を持ち、各画素に対応する要素が浮動小数点の二次元ベクトルとして表現されるデータである。画像データをＩとし、画素位置を表す座標を（ｘ，ｙ）とすると、Ｉ（ｘ，ｙ）として画像の画素値を表現する。画素は、黒を０、白を１とする浮動小数点のモノクロデータであるものとして説明するが、これに限定されず、例えば８ビットの整数データであってもよい。オプティカルフローに対しても同様に、画素位置を表す座標を（ｘ，ｙ）とすると、動きベクトルは（ｕ（ｘ，ｙ），ｖ（ｘ，ｙ））として表現する。このような表記法において座標値が実数で渡された場合には、補間によって算出された画素値、あるいは、ベクトルを得るものとする。補間には、例えば、バイリニアやバイキュービック補間を用いることができるが、これに限定されない。
【００１７】
図２は、オプティカルフローの概念図を示す。画像２０１、２０２は、人物２０３が歩いているシーンを、ユーザがカメラを動かして撮影して取得した画像である。画像２０１、２０２には、被写体として人物２０３、及び家２０４が写っている。人物２０３は、ベクトル２０５の方向に動いているものとする。なお、実際には、人物２０３の身体の各部の動きベクトルは異なるが、ここでは単純化する。また、家２０４は、ベクトル２０６の方向に動いているものとする。ここでは、人物２０３の動きベクトル２０５は（１０，５）、家２０４の動きベクトル２０６は（−５，０）とする。また、背景の動きベクトルは（０，０）とする。この場合、画像２０１を基準としたオプティカルフローは、画素の座標（ｘ，ｙ）が人物２０３に含まれる場合、（ｕ（ｘ，ｙ），ｖ（ｘ，ｙ））＝（１０，５）となる。また、画素の座標（ｘ，ｙ）が家２０４に含まれる場合、（ｕ（ｘ，ｙ），ｖ（ｘ，ｙ））＝（−５，０）となる。また、画素の座標（ｘ，ｙ）が背景に含まれる場合、（ｕ（ｘ，ｙ），ｖ（ｘ，ｙ））＝（０，０）となる。
【００１８】
本実施例では、異なる時刻に単一のカメラで撮像された複数の画像を用いて、オプティカルフローを算出するものとする。なお、同一もしくは異なる時刻に異なるカメラで撮像された複数の画像を用いてもよい。特に、同一時刻に異なるカメラで撮影された複数の画像を用いる場合は、オプティカルフローから被写体の奥行きを算出することも可能である。
【００１９】
また、本実施例では、解像度が異なる同一画像の集合である画像ピラミッドを用いて階層処理を行う。すなわち、解像度が小さい画像から解像度が高い画像へ、段階的に解像度を増加させた画像を用いて階層処理を行う。例えば、Ｉ［１］は、第一の階層の画像を示す。このように、各階層の画像は、変数Ｉに［］を付加して階層を表すものとする。フローチャートの説明において、処理ステップは、特別な記述がない限り、図中の矢印で示された順序で実行されるものとする。なお、処理ステップに依存関係がない場合には、処理ステップを入れ替えてもよい。各処理ステップは、フレーム単位で行われ、各処理ステップ内で着目画素を走査することによって、全ての画素に処理が実施される画像単位の処理として説明するが、これに限定されない。例えば、各処理ステップは、画素単位、あるいは、複数画素単位で実施することも可能である。
【００２０】
図３は、本実施例に係る画像処理装置１００の機能ブロック図である。画像処理装置１００は、ＣＰＵ１０１がＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することにより、オプティカルフローを算出するための機能部を実装する。本実施例に係る画像処理装置１００は、図３に示すように、画像データ取得部３０１、画像縮小部３０２、ＯＦ（オプティカルフロー）初期化部３０３、ＯＦ平滑化部３０４、画像変形部３０５、ＯＦ算出部３０６、及びＯＦ拡大部３０７を有する。各機能部による処理の詳細は、図４を参照して後述する。
【００２１】
図４は、本実施例の画像処理装置１００におけるオプティカルフロー算出処理のフローチャートを示す。本実施例では、ＣＰＵ１０１が、ＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することで、フローチャートの各処理ステップが実行される。また、特別な記述がない限り、入力データはＲＡＭ１０２から入力され、出力データはＲＡＭ１０２へ出力される。
【００２２】
ステップＳ４０１０では、ＣＰＵ１０１が、着目画像データと参照画像データを取得する。すなわち、ＣＰＵ１０１は、画像データ取得部３０１として機能する。本実施例では、着目画像データと参照画像データの２つの画像データを取得する場合について説明するが、３つ以上の画像データや動画データを取得してもよい。３つ以上の画像データや動画データを使用する場合は、取得した画像データのうち、対象となる２つの画像データ、もしくは動画データのうち２つのフレームを選択して、連続的に後述する処理が行われる。
【００２３】
ステップＳ４０２０では、ＣＰＵ１０１が、取得した着目画像データと参照画像データのそれぞれについて、解像度が異なる複数の縮小画像を生成し、階層的に構成された階層画像群（すなわち、画像ピラミッド）を生成する。すなわち、ＣＰＵ１０１は、画像縮小部３０２として機能する。着目画像データに対して生成された階層画像群を着目階層画像群と称し、参照画像データに対して生成された階層画像群を参照階層画像群と称する。具体的には、ＣＰＵ１０１は、予め設定された階層画像群の最大階層数（ｍａｘ＿ｌｖ）を取得し、着目画像データと参照画像データのそれぞれについて、階層ｌｖごとに最大階層数（ｍａｘ＿ｌｖ）までの縮小画像を生成する。ｌｖは、階層を表すインデックスである。最大階層数（ｍａｘ＿ｌｖ）は、画像データの解像度から本プログラムを使用する前に予め設定しておく。本実施例では、最大階層数（ｍａｘ＿ｌｖ）は５とする。等倍画像階層のｌｖが０となり、最小画像階層のｌｖが５となる。この場合、等倍画像階層を含めると、階層数は全部で６となる。なお、本実施例では、最大階層数（ｍａｘ＿ｌｖ）は、最小画像の幅を等倍画像の５％以下にするものとして設定した。最大階層数（ｍａｘ＿ｌｖ）の計算方法を、以下の式（１）を用いて説明する。
【００２４】
【数１】
2019128950.tif 000003
【００２５】
上記式（１）の計算結果（すなわち、４．３）を切り上げた値である５が、最大階層数（ｍａｘ＿ｌｖ）となる。また、最小画像の幅を等倍画像の１０％以下とする場合、最大階層数（ｍａｘ＿ｌｖ）は４となる。最小画像の幅は、画像間の動き検出対象の動きが大きいほど小さく設定すべきであるが、処理時間などの様々な要素に応じて最適な設定をすることが望ましい。なお、本実施例では、画像の各階層間の縮小倍率を表すｓｃａｌｅ＿ｆａｃｔｏｒ（以下、ｓｆとする）を０．５とする。階層ｌｖの縮小率ｓは、以下の式（２）によって算出される。
【００２６】
【数２】
2019128950.tif 000004
【００２７】
Ｉ1［ｌｖ］、Ｉ2［ｌｖ］は、着目画像と参照画像をそれぞれ、式（２）によって算出された縮小率ｓ倍に縮小した画像を表す。尚、縮小倍率ｓｆは、０．５に限定されず、０．７や０．９でもよい。本実施例では、画像の縮小にバイキュービック法を用いるものとする。尚、縮小法はこれに限定されず、例えばＬａｎｃｚｏｓ  ３−ｌｏｂｅｄ法などを用いてもよい。なお、階層ｌｖが０（すなわち、等倍画像）の場合、縮小率ｓは１となるため、縮小は不要であり、ステップＳ４０１０で取得した着目画像データと参照画像データをそれぞれ、Ｉ1［０］、Ｉ2［０］として表現する。
【００２８】
ステップＳ４０３０では、ＣＰＵ１０１は、処理対象の階層ｌｖに、最大階層数（ｍａｘ＿ｌｖ）を設定する。すなわち、以下のステップでは、ＣＰＵ１０１は、縮小率が最も大きな最大階層から順に、階層画像群の各階層ｌｖにおいて、オプティカルフローを導出する。
【００２９】
ステップＳ４０４０では、ＣＰＵ１０１は、着目階層画像群のｌｖ階層の画像データのコントラスト値を算出する。本実施例では、画像ヒストグラムから標準偏差ＳＤを算出し、コントラスト値とする。なお、コントラスト値は標準偏差に限定されず、画像ヒストグラムの四分位偏差などを用いてもよい。
【００３０】
ステップ４０５０では、ＣＰＵ１０１は、処理対象の階層ｌｖが、最大階層数ｍａｘ＿ｌｖに等しいか否かを判定する。判定結果が真の場合はステップＳ４０６０へ遷移し、判定結果が偽の場合はステップＳ４０７０へ遷移する。上記ステップＳ４０３０では、処理対象の階層ｌｖに、初期値として最大階層数ｍａｘ＿ｌｖを設定しているため、最初の判定ではステップＳ４０６０へ遷移する。
【００３１】
ステップＳ４０６０では、ＣＰＵ１０１は、全画素の動きベクトルを０にしたオプティカルフローを生成し（すなわち、オプティカルフローを初期化し）、ステップＳ４１００へ遷移する。すなわち、ＣＰＵ１０１は、ＯＦ初期化部３０３として機能する。
【００３２】
ステップＳ４０７０では、ＣＰＵ１０１は、ｌｖ＋１階層のオプティカルフローを拡大し、拡大オプティカルフローを生成する。すなわち、ＣＰＵ１０１は、ＯＦ拡大部３０７として機能する。具体的には、ＣＰＵ１０１は、ｌｖ＋１階層で算出したオプティカルフローを１／ｓｆ倍に拡大し、動きベクトルの要素も１／ｓｆ倍して（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））を生成する。動きベクトルの拡大処理は、ＲＧＢ画像の拡大処理において、Ｒ、Ｇ、Ｂそれぞれの成分を独立して処理するのと同様に、動きベクトルのＸ成分、及びＹ成分を独立して処理する。本実施例では、バイリニア補間によってオプティカルフローを拡大するものとするが、バイキュービック法などの別の補間方法を用いてもよい。本実施例では、ｓｆが０．５であるため、１／０．５、つまり２倍にオプティカルフローを拡大する。以下の式（３）を用いて、拡大した動きベクトルを算出することができる。
【００３３】
【数３】
2019128950.tif 000005
【００３４】
ＣＰＵ１０１は、拡大した動きベクトルを全画素分算出することで、一画像分の拡大オプティカルフローを得ることができる。以後、Ｉ1＝Ｉ1［ｌｖ］、Ｉ2＝Ｉ2［ｌｖ］として説明する。
【００３５】
ステップＳ４０８０では、ＣＰＵ１０１は、参照階層画像群のｌｖ階層の画像データＩ2の各画素を、拡大オプティカルフローに従って移動させ、ワーピング画像Ｉ2wを生成する。すなわち、ＣＰＵ１０１は、画像変形部３０５として機能する。ワーピングした画像の画素値は、以下の式（４）を用いて算出することができる。
【００３６】
【数４】
2019128950.tif 000006
【００３７】
ＣＰＵ１０１は、ワーピングした画像の画素値を全画素分算出することで、ワーピング画像Ｉ2wを得ることができる。
【００３８】
ステップＳ４０９０では、ＣＰＵ１０１は、標準偏差、着目階層画像群のｌｖ階層の画像データ、及び拡大オプティカルフローを使用して、平滑化オプティカルフローを生成する。すなわち、ＣＰＵ１０１は、ＯＦ平滑化部３０４として機能する。なお、ｌｖ＝０（すなわち、等倍画像）の場合には、ワーピング画像は生成しないため、参照画像をワーピング画像とみなして処理する。また、平滑化オプティカルフローも生成していないため、Ｓ４０９０で生成したオプティカルフローを平滑化オプティカルフローとみなして処理をする。処理の詳細は後述する。
【００３９】
ステップＳ４１００では、着目階層画像群と参照階層画像群のｌｖ階層の画像データ、ワーピング画像、平滑化オプティカルフローを使用して、ｌｖ階層のオプティカルフローを算出する。すなわち、ＣＰＵ１０１は、ＯＦ算出部３０６として機能する。処理の詳細は後述する。
【００４０】
ステップＳ４１１０では、ＣＰＵ１０１は、処理対象の階層ｌｖが０であるか否かを判定する。判定結果が真の場合は本フローにおける処理を終了する。すなわち、階層ｌｖが０の場合は、最終的なオプティカルフローの出力となる。一方、判定結果が偽の場合はステップＳ４１２０へ遷移する。
【００４１】
ステップＳ４１２０では、ＣＰＵ１０１は、階層ｌｖ＝ｌｖ−１とし、ステップＳ４０４０に戻る。すなわち、処理対象の階層を１つ下げて、１段階解像度の高い次の階層の画像データを処理対象とする。
【００４２】
このように、ステップＳ４０４０からステップＳ４１１０の処理で、ＣＰＵ１０１は、一階層分のオプティカルフローを生成する。
【００４３】
次に、上述したステップＳ４０９０に関わる平滑化ベクトルの算出方法について説明する。なお、平滑化ベクトルの集合が、平滑化オプティカルフローである。
【００４４】
平滑化ベクトルは、以下の式（５）、（６）を使用して算出することができる。
【００４５】
【数５】
2019128950.tif 000007
【００４６】
ｌｕｍａ＿ｔｈは、被写体の輝度差を区別する閾値である。ＳＤは、ステップＳ４０４０で算出したコントラスト値に相当する値である。ｋsdは、ＳＤを閾値とするための係数であり、本実施例では０．５とする。本実施例では、コントラスト値に基づいて、ｌｕｍａ＿ｔｈを設定するものとして説明するが、固定値であってもよい。その場合は、０．０５から０．３の値を設定することが適当である。Ωは、着目画素（ｘ，ｙ）を中心とする７×７画素の周辺画素の集合を示す。つまり、（ｘi，ｙi）は、７×７画素の領域に含まれる各画素の相対座標であり、水平・垂直、それぞれ−３から３の値をとる。なお、本実施例では、７×７画素として説明しているがこれに限定さない。Ｘex＝｛Ａex｜Ｂex｝は、集合Ａexについて、集合Ｂexという条件を満足する要素を抽出して、集合Ｘexを生成することを示す。Ｘは動きベクトル、つまり、二次元ベクトルの集合である。すなわち、式（６）によると、着目画素の画素値に近い周辺画素を抽出し、抽出した周辺画素に対応する動きベクトルを算出することができる。図５は、着目画素とその周辺画素の拡大例を示す。中央の画素５０１が、着目画素である。網掛けは、画素値を表す。網掛け部分の画素は、矢印５０２のように動き、網掛けのない画素は、矢印５０３のように動くものとする。また、網掛け部分の画素が、着目画素に近い画素値を有する画素である。網掛け部分の画素に対応する動きベクトルを抽出した場合、網掛け部分の画素は２２個であるため、集合Ｘとして２２本の動きベクトルの集合が得られる。次いで、以下の式（７）を使用して、抽出した動きベクトルの水平成分及び垂直成分の中央値を、平滑化ベクトルの水平成分及び垂直成分として取得する。
【００４７】
【数６】
2019128950.tif 000008
【００４８】
Ｘu，Ｘvは、二次元ベクトルの集合であるＸに対し、動きベクトルの垂直成分及び水平成分のそれぞれの集合を表す。ｍｅｄｉａｎ（Ｚ）は、数値の集合Ｚの中央値を返す関数である。式（７）は、集合Ｘに対し、水平成分及び垂直成分のそれぞれの中央値を平滑化ベクトルとして算出することを示している。中央値を算出する意味について、図５を使って補足する。動きベクトルの集合を取得しても、全てが小数画素精度で全て同一とは限らない。また、動きベクトルの集合の中には外れ値が存在する可能性もある。そのため、中央値を算出することによって外れ値を除外して、集合Ｘの代表値を算出している。なお、７×７画素の全ての周辺画素に対応する動きベクトルを用いて中央値を算出する場合、領域の支配的な成分である矢印５０３の動きが誤って選択されてしまう。そのため、式（６）を使って、着目画素に近い画素値を有する周辺画素を抽出し、抽出した画素の動きベクトルを算出することで、動きベクトルの集合Ｘを生成することは重要である。
【００４９】
図６は、本実施例において、上述したステップＳ４０９０に関わる平滑化ベクトル算出処理のフローチャートを示す。本実施例では、ＣＰＵ１０１が、ＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することで、フローチャートの各処理ステップが実行される。以下では、上記式（６）、（７）によって表現した平滑化ベクトルの算出方法についてより詳細に説明する。
【００５０】
ステップＳ６０１０では、ＣＰＵ１０１は、着目画素と周辺画素の画素値を取得する。本実施例では、着目画素を中心とする７×７画素の領域の画素値を取得する。すなわち、ＣＰＵ１０１は、画素値取得手段として機能する。
【００５１】
ステップＳ６０２０では、ＣＰＵ１０１は、縮小画像（すなわち、ｌｖ＋１階層の画像）から導出された初期値動きベクトルから、着目画素と周辺画素に対応する複数の動きベクトル（すなわち、動きベクトル群）を取得する。
【００５２】
ステップＳ６０３０では、ＣＰＵ１０１は、着目画素に対する画素値の絶対値差が所定の閾値（ｌｕｍａ＿ｔｈとする）未満の画素を抽出し、抽出した画素に対応する動きベクトルの集合Ｘを取得する。
【００５３】
ステップＳ６０４０では、ＣＰＵ１０１は、集合Ｘに含まれる動きベクトルの水平成分の中央値を算出し、平滑化ベクトルの水平成分ｕsmoothとする。中央値は、集合に含まれる数値、つまり、集合Ｘに含まれる各動きベクトルの水平成分を抽出して、ソートすることで求められる。ソート方法はクイックソートとするが、これに限定されるものではなく、バブルソートなど他の方法を使用してもよい。
【００５４】
ステップＳ６０５０では、ＣＰＵ１０１は、集合Ｘに含まれる動きベクトルの垂直成分の中央値を算出し、平滑化ベクトルの垂直成分ｖsmoothとする。中央値は、ステップＳ６０４０と同様に求められる。
【００５５】
ＣＰＵ１０１は、かかる処理を全画素分実行することで、平滑化動きベクトルの全画面分の集合である平滑化オプティカルフローを得ることができる。
【００５６】
以上説明したように、本実施例では、画素値が着目画素に近い周辺画素を抽出し、抽出した画素に対応する動きを、平滑化項を作るための母集団とした。これは、輝度（すなわち、画素値）が類似した周辺画素は、同一被写体に含まれる可能性が高いためである。したがって、本実施例によると、同一被写体に含まれる画素の動きを平滑化することになり、結果として境界部分で動きが混じることなく、被写体の動きを高精度で検出することができる。
【００５７】
なお、本実施例では、集合Ｘに含まれる複数の動きベクトルの中央値を、平滑化動きベクトル（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））としたが、これに限定されない。別の実施例では、中央値ではく、集合Ｘに含まれる複数の動きベクトルの平均値を、平滑化動きベクトルとしてもよい。すなわち、上記式（７）の代わりに、以下の式（８）を用いて、平滑化動きベクトルの水平成分及び垂直成分を取得してもよい。
【００５８】
【数７】
2019128950.tif 000009
【００５９】
ａｖｅｒａｇｅ（Ｘ）は、集合Ｘの要素の平均値を表す。オプティカルフローの平滑化では、検出精度の点で、平均値より中央値などのランクオーダー型のフィルタが好ましい。しかし、ランクオーダー型のフィルタは、ソート処理を必要とし、処理負荷が重い。したがって、検出精度より低負荷を優先するのであれば、平均値フィルタも適用してもよい。
【００６０】
また、さらに別の実施例では、単なる平均値ではなく、集合Ｘに含まれる複数の動きベクトルの重み付き平均値を、平滑化動きベクトルとしてもよい。すなわち、上記式（６）、式（７）の代わりに、以下の式（９）、式（１０）を用いて、平滑化動きベクトルの水平成分及び垂直成分を取得してもよい。
【００６１】
【数８】
2019128950.tif 000010
【００６２】
【数９】
2019128950.tif 000011
【００６３】
式（９）と式（１０）は、着目画素の画素値と周辺画素の画素値との差から係数（すなわち、重み）を算出して、動きベクトルの集合Ｘの要素の重み付き平均値を算出している。式（１０）によると、画素値の差｜ｄ｜が０．１より小さい場合には重みを１とし、画素値の差｜ｄ｜が、０．１以上０．３未満である場合は、線形的に重みを決定し、画素値の差｜ｄ｜が０．３以上である場合には重みを０とする。このような式を用いることで、境界部分で動きが混じることなく、画素値の差が小さい周辺画素をより重視して、平滑化動きベクトルを算出することが可能である。
【００６４】
次に、上述したステップＳ４１００の処理に関わるｌｖ階層の動きベクトルの算出処理について説明する。ステップＳ４１００では、着目画素（ｘ，ｙ）に対して、エネルギー関数を最小化する動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））を、勾配法を用いて推定する。
【００６５】
ここで、エネルギー関数について説明する。エネルギー関数の基本は、データタームと呼ばれる項（すなわち、データ項）であり、以下の式で定義される。
【００６６】
【数１０】
2019128950.tif 000012
【００６７】
Ｉ2wは、式（４）に従って、参照階層画像群のｌｖ階層の画像データＩ2をワーピングした画像である。関数ｆは、着目階層画像群のｌｖ階層の画像データＩ1とワーピング画像Ｉ2wの違いをエネルギーとして表す関数であり、絶対値や差分２乗を用いることができる。Ｂは、着目画素（ｘ，ｙ）を中心としたパッチ領域に含まれる相対座標値の集合を表す。例えば、７×７画素のパッチ領域を考えた場合、式（１２）のω、ηは、それぞれ−３から３までの整数値をとってρ（ｘ＋ω、ｙ＋η）の積算処理を行う。このとき、画像に歪みがある、テクスチャが存在しない場合など、式（１２）が最適なエネルギー関数を表さない場合がある。そこで、拘束条件として、オプティカルフローを滑らかにするための平滑化項を追加する。以下の式（１３）が、平滑化項が追加されたエネルギー関数の式である。
【００６８】
【数１１】
2019128950.tif 000013
【００６９】
φは、（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））と（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））の違いを表す関数であり、絶対値や差分２乗を用いることができる。（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））は、ステップＳ４０７０で拡大したオプティカルフローである。ｕsmooth（ｘ，ｙ）、ｖsmooth（ｘ，ｙ）は、平滑化動きベクトルであり、ステップＳ４０９０で算出したオプティカルフローの一要素である。（ｄｕ，ｄｖ）は、本来求めるべき動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））に対し、（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））の差である。本実施例では、ρとφはそれぞれ、以下の式（１４）、式（１５）によって定義される。
【００７０】
【数１２】
2019128950.tif 000014
【００７１】
動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））を算出するために、（ｄｕ，ｄｖ）の算出が必要であるため、（ｄｕ，ｄｖ）を導出する式を定義する。このとき、ｄｕ，ｄｖが十分に小さいとして、ρをテイラー展開すると、以下の式（１６）のようになる。
【００７２】
【数１３】
2019128950.tif 000015
【００７３】
Ｉ2xw、Ｉ2ywは、Ｉ2wの１次偏微分であり、以下の式（１７）によって求めることができる。
【００７４】
【数１４】
2019128950.tif 000016
【００７５】
ただし、１次偏微分は、水平、垂直のＳｏｂｅｌフィルタなどを作用させて求めてもよい。Ｓｏｂｅｌフィルタを適用した場合には、ノイズ耐性が増す。また、以下の式（１８）を使って、Ｉ2の１次偏微分を算出することができる。
【００７６】
【数１５】
2019128950.tif 000017
【００７７】
Ｉ2x、Ｉ2yを、式（４）によって算出したようにワーピングさせて、Ｉ2xw、Ｉ2ywを算出してもよい。上記式（１６）は、ｄｕ、ｄｖの２次関数なので、式（１３）のエネルギー関数を最小にする解析解を求めることが可能である。解析解ｄｕ、ｄｖは、以下の連立方程式（１９）を満たす。
【００７８】
【数１６】
2019128950.tif 000018
【００７９】
ここで、Ａは、以下の式（２０）によって定義される。
【００８０】
【数１７】
2019128950.tif 000019
【００８１】
また、（ｕt,ｖt）は、以下の式（２１）によって定義される。 
【００８２】
【数１８】
2019128950.tif 000020
【００８３】
また、Ｉt（ｘ,ｙ）は、以下の式（２２）によって定義される。
【００８４】
【数１９】
2019128950.tif 000021
【００８５】
式（１９）の両辺にＡの逆行列を掛けることで、ｄｕ、ｄｖを求めることができる。つまり、最終的な動きベクトルは、下記の式（２３）、式（２４）によって算出することができる。
【００８６】
【数２０】
2019128950.tif 000022
【００８７】
上記処理を全画素分実行することにより、ｌｖ階層のオプティカルフローを得ることができる。
【００８８】
図７は、本実施例において、上述したステップＳ４１００に関わる動きベクトル算出処理のフローチャートを示す。本実施例では、勾配法を用いて動きベクトルを算出する。パッチは、着目画素を中心とする７×７画素の領域とする。なお、説明中で使われる変数ａ、ｃ、ｄ、（ｕ’，ｖ’）、θ、（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））、（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））、及び（ｄｕ，ｄｖ）は、上記式（１９）から式（２４）で使われた変数に対応する。ただし、（ｘ，ｙ）などの座標を示す記号は省略する。また、本実施例では、ＣＰＵ１０１が、ＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することで、フローチャートの各処理ステップが実行される。
【００８９】
ステップＳ７０１０では、ＣＰＵ１０１は、ワーピング画像のパッチ内の水平一次微分値の二乗和（ａ）を算出する。一次偏微分値は、上述したように、式（１７）によって算出することができる。本実施例では、パッチは７×７画素の領域であるため、４９個の微分値の総和が算出される。
【００９０】
ステップＳ７０２０では、ＣＰＵ１０１は、ワーピング画像のパッチ内の垂直一次偏微分値の二乗和（ｄ）を算出する。
【００９１】
ステップＳ７０３０では、ＣＰＵ１０１は、ワーピング画像のパッチ内の水平一次偏微分値、及び垂直一次偏微分値の積の総和（ｃ）を算出する。
【００９２】
ステップＳ７０４０では、ＣＰＵ１０１は、ワーピング画像のパッチ内の水平一次偏微分と輝度差の積の総和（ｕt）を算出する。これは、式（２１）の第一行で表現された計算になる。
【００９３】
ステップＳ７０５０では、ＣＰＵ１０１は、ワーピング画像のパッチ内の垂直一次偏微分と輝度差の積の総和（ｖt）を算出する。これは、式（２１）の第二行で表現される計算になる。
【００９４】
ステップＳ７０６０では、ＣＰＵ１０１は、θを取得する。
【００９５】
ステップＳ７０７０では、ＣＰＵ１０１は、初期ベクトル（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））（すなわち、（ｕin，ｖin））を取得する。これは、縮小階層（すなわち、ｌｖ＋１階層）のオプティカルフローを拡大して得られた拡大オプティカルフローの座標（ｘ，ｙ）に対応する動きベクトルである。
【００９６】
ステップＳ７０８０では、ＣＰＵ１０１は、平滑化ベクトル（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））を取得する。平滑化ベクトルは、前述の通り、図６を参照して説明した処理フローにより算出される。
【００９７】
ステップＳ７０９０では、ＣＰＵ１０１は、変数ａ、ｃ、ｄ、（ｕ’，ｖ’）、θ、（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））、及び（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））から、（ｄｕ，ｄｖ）を算出する。この処理は、式（１９）から式（２４）の計算式に対応する。
【００９８】
ステップＳ７１００では、ＣＰＵ１０１は、（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））と（ｄｕ，ｄｖ）から、エネルギー関数を最小化する動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））を算出する。この処理は、式（２４）の計算式に対応する。
【００９９】
以上説明したように、本実施例では、エネルギー関数に関して、輝度情報をガイド情報として平滑化したオプティカルフローを利用して平滑化項を生成する。そして、エネルギー関数から、データ項と平滑化項の和が最小となる動きを算出することにより、動被写体の境界領域の動き精度が高い、オプティカルフローを生成することができる。なお、本実施例では、方程式を解いてエネルギー関数を最小化する動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））を解析的に算出する方法を説明したが、それに限定されない。ＳＯＲ法（Ｓｕｃｃｅｓｓｉｖｅ  Ｏｖｅｒ−Ｒｅｌａｘａｔｉｏｎ、逐次加速緩和法）を用いても、図６を使って説明した平滑化ベクトルを使った平滑化項を用いてエネルギー計算を行い、（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））を導出することができる。 
【０１００】
また、導出した動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））に対し、以下の式（２５）、式（２６）を使い、平滑化した動きベクトル（ｕnew_out（ｘ，ｙ），ｖnew_out（ｘ，ｙ））を算出してもよい。平滑化した動きベクトル（ｕnew_out（ｘ，ｙ），ｖnew_out（ｘ，ｙ））は、ステップＳ７１００で算出する動きベクトルとしてもよい。 
【０１０１】
【数２１】
2019128950.tif 000023
【０１０２】
Ｘ’は、動きベクトルの集合である。ただし、Ω、ｌｕｍａ＿ｔｈは、式（６）の定義と同等とする。また、Ｘ’u，Ｘ’vは、二次元ベクトルの集合であるＸ’に対し、動きベクトルの水平・垂直成分それぞれの集合とする。このように、輝度情報をガイド情報として平滑化する処理は、動きベクトルの導出後に適用しても効果を得ることができる。なお、一度導出した動きベクトルに式（２５）、式（２６）を適用する場合、演算量削減のために、平滑化項である（ｕsmooth，ｖsmooth）はより簡易的なもの、例えば着目画素周辺の動きベクトルのメディアンなどを使用してもよい。
【０１０３】
なお、本実施例では、式（６）に示されるように、着目画素と周辺画素の画素値の絶対値差がｌｕｍａ＿ｔｈ未満という条件にしたがって、動きベクトルの集合Ｘを求め、平滑化動きベクトルを算出した。つまり、画素値が着目画素の画素値±ｌｕｍａ＿ｔｈ内という画素値レンジに含まれる周辺画素を抽出して、動きベクトルの集合Ｘを求めた。しかしながら、動きベクトルの集合Ｘを求めるための方法は、これに限定されない。例えば、着目画素を含む任意の複数の領域を設定し、設定した複数の領域の中から画素値の分散が最も小さい領域を選択し、選択された領域から算出された画素値レンジに応じて、動きベクトルの集合Ｘを求めてもよい。こうすることで、動きベクトルの集合Ｘの精度を向上させて、平滑化動きベクトルを算出することができる。その具体的な手法について、図１３、１４、及び１５を参照して詳細に説明する。
【０１０４】
図１５は、実施例１の変形例における平滑化ベクトル算出処理のフローチャートを示す。図１５のフローチャートは、基本的な流れは図６のフローチャートと同じであるが、ステップＳ６０３０の代わりに、ステップＳ１５０３０とステップＳ１５０３５が追加されている。以下、追加されたステップについて説明する。
【０１０５】
ステップＳ１５０３０では、ＣＰＵ１０１は、着目画素を含む複数の領域を設定し、画素値の分散が最も小さい領域の画素値レンジを取得する。すなわち、ＣＰＵ１０１は、画素値レンジ取得手段として機能する。図１３は、本変形例における着目画素とその周辺画素の拡大例を示す。中央の画素１３０１が、着目画素である。網掛けの濃さが画素値を表す。領域１３０２は、着目画素を含む３×３画素の領域であり、詳細については後述する。図１４は、画素値レンジを取得するために設定された複数の領域の例を示す。図１４の例では、各領域は３×３画素で構成され、各領域に含まれる着目画素１４０１の相対的な位置が異なる５つの領域１４０２、１４０３、１４０４、１４０５、１４０６が設定されるものとする。各領域には、インデックス値iが０から４まで設定される。なお、設定される領域の大きさや数は限定されない。例えば、着目画素が領域内の四隅のいずれかに位置する領域を設定してもよい。本変形例では、設定した各領域の画素値の分散値を算出し、以下の式（２７）に示すように、分散値が最も小さい領域を選択して、その領域を示すインデックス値ｊを取得する。次いで、以下の式（２８）及び（２９）に示すように、インデックス値ｊが設定された領域の画素値の平均値ａｖｇiと分散値ｖａｒiを用いて、当該領域の画素値の上限値ｕｐｐｅｒと下限値ｌｏｗｅｒを算出する。本変形例では、このようにして、画素値レンジ（すなわち、上限値ｕｐｐｅｒと下限値ｌｏｗｅｒ）を取得する。
【０１０６】
【数２２】
2019128950.tif 000024
【０１０７】
ここで、ｋは分散の平方根、つまり、標準偏差にかける係数であり、正規分布を仮定すれば、ｋ＝２で、分布の約９５％をカバーできるため、本変形例ではｋ＝２とする。
ステップＳ１５０３５では、ＣＰＵ１０１は、着目画素を含む所定の領域（例えば、着目画素を中心とする７×７画素の領域）の画素群から、画素値が画素値レンジに含まれる画素群を抽出し、抽出した画素群に対応する動きベクトルの集合Ｘを取得する。動きベクトルの集合Ｘは、Ｓ１５０３０で取得した画素値レンジ（上限値ｕｐｐｅｒと下限値ｌｏｗｅｒ）を用いて式（６）を置き換えた以下の式（３０）によって算出することができる。
【０１０８】
【数２３】
2019128950.tif 000025
【０１０９】
ここで、着目画素を含む複数の領域から画素値の分散が最も小さい領域を選択すること、つまり、インデックス値jを算出する意味ついて説明する。図１３のように着目画素が存在する場合、画素値の分散が最も小さい領域として領域１３０２が選択される。図１４を参照すると、これは、インデックス値ｉが１の領域に対応する。したがって、インデックス値ｊ＝１になる。図１３の領域１３０２は、全ての画素が同一の被写体領域に含まれており、画素値の分散が最も小さい。そして、同一被写体内の画素に対応する動きは、同様の動きである可能性が高い。このように、本変形例では、画素値の分散が最も小さく、同一被写体領域の画素で構成された領域１３０２から算出した画素値レンジを使用して、着目画素を含む所定の領域から画素群を抽出し、抽出した画素群に対応する動きベクトルの集合Ｘを取得する。すなわち、本手法は、式（６）のように所定の閾値ｌｕｍａ＿ｔｈによって設定された固定の画素値レンジにしたがって動きベクトルの集合Ｘを取得する場合に比べて、外れ値を除外した動きベクトルの集合Ｘを取得することができる。したがって、より精度の高い動きベクトルの集合Ｘの平滑化が可能となり、被写体の動きベクトルの算出精度を高めることができる。
【０１１０】
なお、画素値レンジを算出するための領域は、領域１３０２のように必ずしも全ての画素が同一被写体領域に含まれていなくてもよい。
【０１１１】
また、選択された領域の画素値レンジは、画素値の平均値ａｖｇjと分散値ｖａｒjの代わりに、画素値の最大値ｍａｘjと最小値ｍｉｎjを使用して算出してもよい。すなわち、画素値レンジの上限値ｕｐｐｅｒと下限値ｌｏｗｅｒは、以下の式（３１）及び式（３２）のように算出してもよい。
【０１１２】
【数２４】
2019128950.tif 000026
【実施例２】
【０１１３】
本実施例では、図６を参照して説明した平滑化ベクトル算出処理の別の変形例について説明する。上述した実施例１では、集合Ｘに含まれる動きベクトルの中央値、平均値、または重み付き平均値を算出して、平滑化ベクトルとした。しかしながら、中央値を算出する場合はソート処理を必要とするため、処理の負荷が大きくなってしまう。また、平均値あるいは重み付き平均値を算出する場合は、集合Ｘに含まれる動きベクトルであっても、本来の動きベクトルとは大きく異なる動きベクトルも含まれている可能性があるため、精度を更に向上させることが望ましい。そこで、本実施例では、着目画素を中心とした画素群に対応する動きベクトル群をサンプリングし、集合Ｘの中から、サンプリングした動きベクトルのそれぞれに類似した動きベクトルの集合Ｙを求める。次いで、集合Ｙのうち最も多くの動きベクトルが含まれる集合の動きベクトルの平均値を、平滑化ベクトルとして導出する。そうすることで、処理の負荷を抑制しながら、精度が向上した平滑化ベクトルを導出することができる。
【０１１４】
以下の式（３３）と式（３５）は、着目画素に対応する動きベクトル、及び、その周辺の動きベクトルである基準動きベクトルｒkに対して動きが近い動きベクトルを抽出して、動きベクトルの集合Ｙkを生成している。本実施例では、ｋの値は０から４とする。つまり、集合Ｙkも、集合Ｙ0から集合Ｙ4の５つの集合が生成される。式（３３）では、基準動きベクトルｒkとして、ｘ座標またはｙ座標を１画素ずつずらした位置にある隣接画素の動きベクトルを示している。
【０１１５】
【数２５】
2019128950.tif 000027
【０１１６】
Ｗは、着目画素の周辺画素の相対座標の集合である。Ω、ｌｕｍａ＿ｔｈは、式（６）の定義と同等とする。
【０１１７】
【数２６】
2019128950.tif 000028
【０１１８】
ｍｖ＿ｔｈは、基準動きベクトルに近いか否かを示す閾値である。ｍｖ＿ｔｈは、１から３程度が適当であり、本実施例ではｍｖ＿ｔｈ＝１とする。集合Ｘは、上述したように、式（６）を使用して抽出した動きベクトルの集合である。ｎｏｒｍは、二次元ベクトルのＬ２ノルムを算出する式である。なお、本実施例では、Ｌ２ノルムを使用するが、これに限定されず、ノルムでもよい。
【０１１９】
次に、以下の式（３６）を使用して、集合Ｙkに基づいて着目画素の基準ベクトルを選択する。
【０１２０】
【数２７】
2019128950.tif 000029
【０１２１】
ｃｏｕｎｔ（Ｙk）は、集合Ｙkの要素数（すなわち、集合Ｙkに含まれる動きベクトルの数）を示す。つまり、式（３６）は、集合Ｙ0から集合Ｙ4の内、要素数（すなわち、動きベクトル数）が最も多い集合のインデックスｋ＿ｂｅｓｔを選択することを示している。
【０１２２】
次に、以下の式（３７）に示すように、式（３６）によって選択されたインデックス、つまり、集合Ｙkに含まれる動きベクトルの水平成分及び垂直成分のそれぞれの平均値を算出し、平滑化ベクトルとする。
【０１２３】
【数２８】
2019128950.tif 000030
【０１２４】
本実施例では、基準の動きベクトルは５本としているが、それに限定されない。基準ベクトルは、演算量を抑えるために着目画素に対応する動きベクトルのみでもよく、また、演算量の増加を許容できる場合は、５本より多くの基準ベクトルを設定してもよい。
【０１２５】
図８は、本実施例における平滑化ベクトル算出処理のフローチャートを示す。図８のフローチャートは、図６のフローチャートによって示された平滑化ベクトル算出処理の代替として実行される。本実施例では、ＣＰＵ１０１が、ＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することで、フローチャートの各処理ステップが実行される。以下では、上記式（３３）から式（３７）によって表現した平滑化ベクトルの算出方法について説明する。
【０１２６】
ステップＳ８０１０では、ＣＰＵ１０１は、着目画素と周辺画素の画素値を取得する。本実施例では、着目画素を中心とする７×７画素の領域の画素値を取得する。すなわち、ＣＰＵ１０１は、画素値取得手段として機能する。
【０１２７】
ステップＳ８０２０では、ＣＰＵ１０１は、縮小画像（すなわち、ｌｖ＋１階層の画像）から導出された初期値動きベクトルから、着目画素と周辺画素に対応する動きベクトル群を取得する。
【０１２８】
ステップＳ８０３０では、ＣＰＵ１０１は、着目画素に対する画素値の絶対値差が所定の閾値（ｌｕｍａ＿ｔｈとする）未満の画素を抽出し、抽出した画素に対応する動きベクトルの集合Ｘを取得する。所定の閾値ｌｕｍａ＿ｔｈは、被写体の輝度差を区別するための閾値であり、実施例１と同様に設定される。
【０１２９】
ステップＳ８０４０では、ＣＰＵ０１は、着目画素周辺の画素群に対応する動きベクトル群から、ｎ本のサンプリング動きベクトル（すなわち、基準動きベクトル）を取得する。本実施例では、式（３３）で提示したとおり、ｎ＝５とする。
【０１３０】
ステップＳ８０５０では、ＣＰＵ１０１は、ｋ＝０、ｍａｘ＿ｃｏｕｎｔ＝０とする。ｋは、後述するループ処理の制御変数である。ｍａｘ＿ｃｏｕｎｔは、後述するループ処理において集合Ｙkの要素数の最大値を保持するための変数である。すなわち、本ステップでは、後述するループ処理の変数が初期化される。
【０１３１】
ステップＳ８０６０では、ＣＰＵ１０１は、サンプリング動きベクトルｒkに対し、差が閾値ｍｖ＿ｔｈ以内の動きベクトルを集合Ｘから抽出し、集合Ｙkとする。この処理は、式（３５）に対応する。
【０１３２】
ステップＳ８０７０では、ＣＰＵ１０１は、ｍａｘ＿ｃｏｕｎｔ＞ｃｏｕｎｔ（Ｙk）を判定する。すなわち、ＣＰＵ１０１は、処理対象の集合Ｙkに含まれる動きベクトルの数（ｃｏｕｎｔ（Ｙk））が、以前に処理された集合に含まれる動きベクトルの数の最大値（ｍａｘ＿ｃｏｕｎｔ）を超えたかどうか判定する。判定結果が真の場合にはステップＳ８０８０へ遷移し、偽の場合にはステップＳ８０９０へ遷移する。
【０１３３】
ステップＳ８０８０では、ＣＰＵ１０１は、ｍａｘ＿ｃｏｕｎｔに処理対象の集合Ｙkに含まれる動きベクトルの数を設定し、インデックスｋ＿ｂｅｓｔに現在のｋの値を設定する（すなわち、ｍａｘ＿ｃｏｕｎｔ＝ｃｏｕｎｔ（Ｙk）、ｋ＿ｂｅｓｔ＝ｋ）。 
【０１３４】
ステップＳ８０９０では、ＣＰＵ１０１は、ｋ＝ｋ＋１とする（すなわち、ｋをインクリメントする）。
【０１３５】
ステップＳ８１００では、ＣＰＵ１０１は、ｋがサンプリング動きベクトルの本数ｎに等しいか否か判定する。判定結果が真の場合にはステップＳ８１１０へ遷移し、判定結果が偽の場合にはステップＳ８０６０へ遷移する。上記ステップＳ８０６０からステップＳ８１００は、ｋを制御変数とするループ処理であり、式（３６）に相当する。つまり、サンプルのうち、ｃｏｕｎｔ（Ｙk）が最も多い、最良の基準動きベクトルのインデックスｋ＿ｂｅｓｔを選択する処理である。
【０１３６】
ステップＳ８１１０では、ＣＰＵ１０１は、集合Ｙk_bestに含まれる動きベクトルの水平成分及び垂直成分の平均値を算出し、平滑化ベクトルとする。この処理は、式（３７）に対応する。
【０１３７】
ＣＰＵ１０１は、かかる処理を全画素分実施することにより、平滑化ベクトルの全画面分の集合である平滑化オプティカルフローを得ることができる。
【０１３８】
以上説明しように、本実施例によると、実施例１と同様に、動被写体の境界領域に偽の動きが発生しにくい平滑化項を生成することができる。また、本実施例では、実施例１のようにソート処理が存在しないため、比較的少ない演算で処理が可能となる。さらに、本実施例では、集合Ｘに含まれる動きベクトルのうち、最も多くの類似した動きベクトルを有する動きベクトルを使用して平均値を算出するため、平滑化ベクトルの精度を向上させることができる。
【０１３９】
本実施例では、入力した動きベクトル（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））を基に基準動きベクトルｒkを算出し、平滑化項で利用する動きベクトルを導出した。しかし、導出した動きベクトル（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））に対し、以下の式を使い、動きベクトルを平滑化した（ｕnew_out（ｘ，ｙ），ｖnew_out（ｘ，ｙ））を算出してもよい。算出した動きベクトルは、ステップＳ７１００で算出する動きベクトルとしてもよい。
【０１４０】
【数２９】
2019128950.tif 000031
【０１４１】
Ｗは、式（３４）で定義したものと同じであり、着目画素の周辺画素の相対座標の集合である。本実施例では、ｍｖ＿ｔｈ＝１とする。次に、基準ベクトルを選ぶ方法について説明する。
【０１４２】
【数３０】
2019128950.tif 000032
【０１４３】
ｃｏｕｎｔ（Ｙ’k）は、集合Ｙ’kの要素数を示す。つまり、式（４０）は、Ｙ’0からＹ’4の内、要素数が最も多い集合のインデックスを選択することを示している。 
【０１４４】
【数３１】
2019128950.tif 000033
【０１４５】
ただし、Ｙ’kbest_x，Ｙ’kbest_yは、二次元ベクトルの集合であるＹ’k（ｋ＝ｋｂｅｓｔ）に対し、動きベクトルの垂直成分、水平成分のそれぞれの集合とする。式（４１）は、式（４０）で選んだインデックス、つまり、動きベクトルの集合の、水平、垂直、それぞれの平均値を算出し、平滑化している。
【０１４６】
ただし、ｃｏｕｕｎｔ（Ｙ’k），ｋ＝ｋｂｅｓｔが０となる場合は、（ｕnew_out（ｘ，ｙ），ｖnew_out（ｘ，ｙ））は、（ｕout（ｘ，ｙ），ｖout（ｘ，ｙ））とする。このように、輝度情報をガイド情報として平滑化する処理は、動きベクトルの導出後にも適用しても効果を得ることができる。
【０１４７】
なお、一度導出した動きベクトルに式（３８）から式（４１）を適用する場合、演算量削減のために、平滑化項である（ｕsmooth，ｖsmooth）はより簡易的なもの、例えば着目画素周辺の動きベクトルのメディアンなどを使用してもよい。
【０１４８】
本実施例では、画素値を参照した動きの抽出、つまり、Ｗの生成に、着目画素と周辺画素の画素値の絶対値差を用いたが、これに限定されない。実施例１の変形例でも説明したとおり、着目画素の周辺に複数の領域を設定し、分散が最も小さい領域の平均値と分散から、画素値レンジ（上限値と下限値）を算出してもよい。これにより、着目画素が含まれる被写体領域に対応する動きを抽出して、Ｗを生成することができる。また、本実施例では、式（４１）のように、動きベクトルの集合の平均値を算出したが、以下の式（４２）のように、動きに対応する画素の画素値と領域の画素値の平均値との絶対値差から算出した重みを使って平均値を算出してもよい。重みは、絶対値差が小さいほど、大きくなる。
【０１４９】
【数３２】
2019128950.tif 000034
【０１５０】
Ｐは、動きに対応する画素値の集合を表す。［ｎ］は、集合のｎ番目の要素を表し、動きと画素値が同じ値で対応付けられる。ａｖｇjは、実施例１で示した通り、画素値の分散が最も小さい領域の画素値の平均値を表す。こうすることにより、演算量が増えるものの、重みのない平均に比べて、より高い精度で動きを検出することができる。
【実施例３】
【０１５１】
上述した実施例１では、ステップＳ４１００に関わる動きベクトル算出処理に勾配法を用いたが、本実施例では、テンプレートマッチングによる動き探索法を用いて動きベクトルを算出する。すなわち、本実施例では、図７を参照して説明した着目画素の動きベクトル算出処理を置き換える、つまり、式（２３）を置き換える処理について説明する。本実施例では、式（２３）の代わりに以下の式（４３）を用いて、（ｄｕ，ｄｖ）を算出する。
【０１５２】
【数３３】
2019128950.tif 000035
【０１５３】
また、式（１０）によって定義されるエネルギー関数のρとφはそれぞれ、以下の式（４４）及び（４５）ように定義する。
【０１５４】
【数３４】
2019128950.tif 000036
【０１５５】
上記式（４３）において、Ｗは、探索範囲を示す領域である。例えば、本実施例における探索範囲は、着目画素を中心とする７×７画素の領域とする。本実施例では、（ｄｕ，ｄｖ）をそれぞれ−３から３まで整数単位で変更しながら、７×７＝４９回、Ｅ（ｘ＋）の計算を行い、結果が最も小さくなる（ｄｕ，ｄｖ）を探す全探索処理を行う。この結果を式（２４）に適用することにより、着目画素の動きベクトルが得られる。
【０１５６】
図９は、テンプレートマッチングによる動き探索法を用いた動きベクトル算出処理のフローチャートを示す。本実施例では、ＣＰＵ１０１が、ＲＯＭ１０３または記憶部１０４に格納されたプログラムを実行することで、プローチャートの各処理ステップが実行される。
【０１５７】
ステップＳ９０１０では、ＣＰＵ１０１は、着目画像データ、及び参照画像データを取得する。
【０１５８】
ステップＳ９０２０では、ＣＰＵ１０１は、平滑化オプティカルフローデータを取得する。
【０１５９】
ステップＳ９０３０では、ＣＰＵ１０１は、ｉｎｄｅｘ＝０、ｂｅｓｔ＿ｅ＝ＭＡＸとする。ｉｎｄｅｘは、後述するループ処理において相対座標を識別するための変数である。ｂｅｓｔ＿ｅは、後述するループ処理において、エネルギーｅの最小値を保持するための変数であり、初期値をＭＡＸとする。
【０１６０】
ステップＳ９０４０では、ＣＰＵ１０１は、初期ベクトル（ｕ’（ｘ，ｙ），ｖ’（ｘ，ｙ））を取得する。この処理は、図７のステップＳ７０７０に相当する。
【０１６１】
ステップＳ９０５０では、ＣＰＵ１０１は、ｉｎｄｅｘに対応する相対座標を取得する。本実施例において、相対座標は、水平、垂直、それぞれ、−３から３まで変化させて、組み合わせに０から始まるインデックス値を与えたものとする。本実施例では、相対座標の数は、４９組である。
【０１６２】
ステップＳ９０６０では、ＣＰＵ１０１は、エネルギー関数を使用して、画像データ、平滑化オプティカルフローデータ、相対座標、及び初期ベクトルから、エネルギーｅを算出する。
【０１６３】
ステップＳ９０７０では、ＣＰＵ１０１は、ｅ＜ｂｅｓｔ＿ｅを判定する。すなわち、ＣＰＵ１０１は、エネルギーｅが、以前に算出されたエネルギーｅの最小値ｂｅｓｔ＿ｅより小さいか否か判定する。判定結果が真の場合にはステップＳ９０８０へ遷移し、判定結果が偽の場合にはステップＳ９０９０へ遷移する。
【０１６４】
ステップＳ９０８０では、ＣＰＵ１０１は、エネルギーｅを変数ｂｅｓｔ＿ｅに設定し、ｂｅｓｔ＿ｉｎｄｅｘに現在のｉｎｄｅｘ値を設定する（すなわち、ｂｅｓｔ＿ｅ＝ｅ、ｂｅｓｔ＿ｉｎｄｅｘ＝ｉｎｄｅｘとする）。つまり、ステップＳ９０７０でエネルギーｅが小さいと判定された場合に、ｂｅｓｔ＿ｅとｂｅｓｔ＿ｉｎｄｅｘを更新する。
【０１６５】
ステップＳ９０９０では、ＣＰＵ１０１は、ｉｎｄｅｘ＝ｉｎｄｅｘ＋１とする（すなわち、ｉｎｄｅｘをインクリメントする）。
【０１６６】
ステップＳ９１００では、ＣＰＵ１０１は、全ての相対座標を処理したか否か判定する。すなわち、本実施例では、４９組の相対座標についてエネルギーを算出したか否かを判定する。判定結果が真の倍にはステップＳ９１１０へ遷移し、判定結果が偽の場合にはステップＳ９０５０へ遷移する。
【０１６７】
ステップＳ９１１０では、ＣＰＵ１０１は、ｂｅｓｔ＿ｉｎｄｅｘに対応する相対座標と初期ベクトルを加算して、動きベクトルを出力する。つまり、ｂｅｓｔ＿ｉｎｄｅｘに対応する相対座標は（ｄｕ，ｄｖ）であり、初期ベクトルは（ｕ’，ｖ’）であるため、本ステップでは、式（２４）に相当する処理を行っている。
【０１６８】
ＣＰＵ１０１は、かかる処理を全画素分実行することにより、着目階層ｌｖのオプティカルフローを得ることができる。
【０１６９】
以上説明したように、実施例１の式（２３）では、勾配法を使ってＡ、（ｕt，ｖt）を算出したが、式（４３）によると、この方法による算出が不要となる。つまり、テンプレートマッチングを用いた動き探索に対しても、着目画素との画素値の近さを考慮して算出した平滑化ベクトルから作った平滑化項を利用して、動きベクトルを算出することができることを示している。なお、本実施例では、探索範囲の全ての整数座標に対し、Ｅ（ｘ＋ｕ’（ｘ，ｙ）＋ｄｕ，ｙ＋ｖ’（ｘ，ｙ）＋ｄｖ）を算出する全探索処理を行ったが、これに限定されず、ステップサーチなどで探索する処理を行ってもよい。
【実施例４】
【０１７０】
上述した実施例１では、オプティカルフローの算出処理をＣＰＵ１０１が行うものとして説明したが、本実施例に係る画像処理装置１０００は、実施例１に対応するオプティカルフローの算出処理を実行するためのハードウェア回路をさらに備える。ＣＰＵ１０１は、当該ハードウェア回路を制御して、実施例１に対応するオプティカルフローの算出処理を実行する。なお、特別な記載がないかぎり、基本的な動作は実施例１で説明した画像処理装置の動作と同様である。
【０１７１】
図１０は、本実施例に係る画像処理装置１０００のハードウェア構成を示す図である。本実施例に係る画像処理装置１０００は、図１に示した実施例１の画像処理装置１００の構成に加えて、ＯＦ（オプティカルフロー）計算部１１０を更に備える。ＣＰＵ１０１は、ＯＦ計算部１１０を制御して、オプティカルフローの算出処理を実行する。その他の構成は実施例１と同様であるため、説明は省略する。
【０１７２】
図１１は、本実施例に係るＯＦ計算部１１０の内部構成を示すブロック図である。
【０１７３】
図１１（ａ）において、ＯＦ計算部１１０は、画像データ取得部１１０１、画像縮小部１１０２、ＯＦ初期化部１１０３、ＯＦ平滑化部１１０４、画像変形部１１０５、ＯＦ算出部１１０６、及びＯＦ拡大部１１０７を有する。なお、データの入出力は、各処理部をつなぐデータ線を経由して行ってもよいし、各処理部が図１０のＲＡＭ１０２にアクセスして行うようにしてもよい。また、ＣＰＵ１０１が各モジュールを制御できるものとする。
【０１７４】
次に、上述した各モジュールの動作について説明する。
【０１７５】
画像データ取得部１１０１は、ＲＡＭ１０２に格納された着目画像データと参照画像データを取得する。画像縮小部１１０２は、最大階層数（ｍａｘ＿ｌｖ）を取得し、着目画像データと参照画像データのそれぞれについて、各階層の縮小画像を生成する。処理内容は、上述した図４のステップＳ４０２０における処理と同様である。ＯＦ初期化部１１０３は、全画素の動きベクトルを全て０にしたオプティカルフローを生成する。ＯＦ算出部１１０６は、ＯＦ初期化部１１０３が生成したオプティカルフローと、着目階層画像群のｌｖ階層の画像データ、ワーピング画像、及び平滑化オプティカルフローから、エネルギー関数を最小にするようなオプティカルフローを算出する。基本的な計算は、式（２４）およびそれを導出するために用いた式を用いて行われる。なお、ＯＦ算出部１１０６は、二回目以降の動作において、画像変形部１１０５が生成したワーピング画像、及び平滑化オプティカルフローから、オプティカルフローを算出する。ＯＦ拡大部１１０７は、ｌｖ＋１階層のオプティカルフローを拡大し、拡大オプティカルフローを生成する。画像変形部１１０５は、参照画像Ｉ2の各画素をオプティカルフローに従って移動させ、ワーピング画像を生成する。ＯＦ平滑化部１１０４は、標準偏差、着目階層画像群のｌｖ階層の画像データ、及び拡大オプティカルフローから、平滑化オプティカルフローを生成する。処理の詳細は、図１１（ｂ）を参照して後述する。ＯＦ平滑化部１１０４、画像変形部１１０５、ＯＦ算出部１１０６、及びＯＦ拡大部１１０７の処理によって、一階層分のオプティカルフローが生成される。ＣＰＵ１０１は、ＯＦ計算部１１０の外部から階層処理の制御を行い、ｌｖ＝０（すなわち、等倍画像）の場合はＯＦ算出部１１０６の結果をＲＡＭ１０２へ出力させ、ｌｖ≠０の場合は結果をＯＦ拡大部１１０７へ出力させる。また、ＣＰＵ１０１は、階層処理を１回行うごとに、制御変数ｌｖにｌｖ−１を代入するようにして制御変数ｌｖを管理し、階層処理を制御する。
【０１７６】
次に、図１１（ｂ）を参照して、ＯＦ平滑化部１１０４の内部ブロック構成とその動作を詳細に説明する。
【０１７７】
ＯＦ平滑化部１１０４は、画像データ取得部１１０８、ＯＦ取得部１１０９、ＯＦ抽出部１１１０、水平ＯＦ平滑化値算出部１１１１、及び垂直ＯＦ平滑化値算出部１１１２を有する。
【０１７８】
画像データ取得部１１０８は、ＲＡＭ１０２に格納された着目画像データと参照画像データを取得する。ＯＦ取得部１１０９は、着目画素周辺の複数の画素のそれぞれに対応する複数の動きベクトルを取得する。ＯＦ抽出部１１１０は、着目画素に対し、画素値の絶対値差がｌｕｍａ＿ｔｈ未満の画素を抽出し、抽出した画素に対応する動きベクトルの集合Ｘを取得する。水平ＯＦ平滑化値算出部１１１１は、集合Ｘに含まれる動きベクトルの水平成分の中央値を算出し、ｕsmoothとする。垂直ＯＦ平滑化値算出部１１１２は、集合Ｘに含まれる動きベクトルの垂直成分の中央値を算出し、ｖsmoothとする。処理の詳細は、図６のステップＳ６０４０、及びステップＳ６０５０の処理と同様である。
【０１７９】
本実施例では、平滑化ベクトル（ｕsmooth（ｘ，ｙ），ｖsmooth（ｘ，ｙ））として、式（７）を使用して集合Ｘに含まれる動きベクトルの各成分の中央値を算出したが、これに限定されない。例えば、式（８）を使用して、集合Ｘに含まれる動きベクトルの各成分の平均値を算出したり、式（９）及び式（１０）を使用して、集合Ｘに含まれる動きベクトルの各成分の重み付き平均値を算出したりしてもよい。また、式（２５）と式（２６）を使った実施例１の変形例で示した通り、後段で平滑化を行っても良い。このような構成でも、実施例１で説明した効果と同様の効果を得ることができる。
【実施例５】
【０１８０】
上述した実施例２では、オプティカルフローの算出処理をＣＰＵ１０１が行うものとして説明したが、本実施例に係る画像処理装置は、実施例２に対応するオプティカルフローの算出処理を実行するためのハードウェア回路をさらに備える。ＣＰＵ１０１は、当該ハードウェア回路制御して、実施例２に対応するオプティカルフローの算出処理を実行する。すなわち、本実施例に係る画像処理装置は、図１１（ａ）を参照して上述した実施例４の画像処理装置１０００と同様の構成を有する。したがって、特別な記載がないかぎり、基本的な動作は実施例２や実施例４で説明したものと同様である。
【０１８１】
一方、上述した実施例４では、ＯＦ平滑化部１１０４が、図１１（ｂ）に示したように構成されたが、本実施例では、図１２に示すように構成される。そこで、以下では、図１２を参照して、本実施例に係るＯＦ平滑化部１１０４の構成を説明する。
【０１８２】
本実施例におけるＯＦ平滑化部１１０４は、画像データ取得部１１０８、ＯＦ取得部１１０９、ＯＦ抽出部１１１０、ＯＦサンプリング部１１１３、ＯＦ積算部１１１４、カウント部１１１５、セレクタ１１１６、及び除算部１１１７を有する。
【０１８３】
画像データ取得部１１０８、ＯＦ取得部１１０９、及びＯＦ抽出部１１１０は、実施例４と同様に動作する。
【０１８４】
ＯＦサンプリング部１１１３は、ＯＦ取得部１１０９が取得したデータを入力として、周辺画素群に対応する動きベクトル群から、ｎ本のサンプリング動きベクトルを取得する。さらに、ＯＦサンプリング部１１１３は、図８のステップＳ８０６０の処理と同様に、集合Ｙkを生成する。ＯＦ積算部１１１４は、集合Ｙkに含まれる動きベクトルの積算を行う。本実施例では、ＯＦ積算部１１１４がアキュムレータを５組１０個有し、ｋが０から４の範囲で水平積算値及び垂直積算値の組を得る。カウント部１１１５は、内部にカウンターを５つ有し、集合Ｙkに含まれる動きベクトルの数をカウントする。セレクタ１１１６は、５組の水平積算値及び垂直積算値と、それらのカウント値を取得し、カウント値が最も大きい積算値の組とカウント値を除算部１１１７へ出力する。除算部１１１７は、積算値の垂直成分と水平成分をそれぞれ、カウント値で除算し、その結果を二次元ベクトルとして出力する。この処理は、平均値の算出に対応し、式（３７）の計算に相当する。また、式（３８）から式（４１）を使って実施例２の変形例で示した通り、後段で平滑化を行っても良い。本実施例においても、実施例２と同様の処理結果を得ることができる。
【その他の実施例】
【０１８５】
本発明は、上述の実施例の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１以上のプロセッサがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【符号の説明】
【０１８６】
１００  画像処理装置
３０１  画像データ取得部
３０２  画像縮小部
３０３  ＯＦ初期化部
３０４  ＯＦ平滑化部
３０５  画像変形部
３０６  ＯＦ算出部
３０７  ＯＦ拡大部
【図１】
2019128950.tif 000037
【図２】
2019128950.tif 000038
【図３】
2019128950.tif 000039
【図４】
2019128950.tif 000040
【図５】
2019128950.tif 000041
【図６】
2019128950.tif 000042
【図７】
2019128950.tif 000043
【図８】
2019128950.tif 000044
【図９】
2019128950.tif 000045
【図１０】
2019128950.tif 000046
【図１１】
2019128950.tif 000047
【図１２】
2019128950.tif 000048
【図１３】
2019128950.tif 000049
【図１４】
2019128950.tif 000050
【図１５】
2019128950.tif 000051