画像一致点検出装置、画像一致点検出方法および記録媒体
【課題】簡易な処理手順で正確かつ高速に画像の一致点検出を行う画像一致点検出装置を提供する。
【解決手段】画像一致点検出装置10は、パターン検出部11と、パターン蓄積部12と、特徴点抽出部13と、一致点検出部14とを有する。パターン蓄積部12は、画像に含まれるパターン情報をパターン番号ごとに分類し、パターン番号と、同一のパターン番号の出現回数と、パターン番号に対応するパターン位置に関する情報とを蓄積する。特徴点抽出部13は、画像におけるパターン番号の出現回数が1回だけであるパターン情報を特徴点パターン情報として抽出する。一致点検出部14は、複数の画像のそれぞれについて特徴点パターン情報として抽出されたパターン情報のパターン番号が一致しているか否かを判断し、一致しているパターン番号を一致点情報として検出する。
【解決手段】画像一致点検出装置10は、パターン検出部11と、パターン蓄積部12と、特徴点抽出部13と、一致点検出部14とを有する。パターン蓄積部12は、画像に含まれるパターン情報をパターン番号ごとに分類し、パターン番号と、同一のパターン番号の出現回数と、パターン番号に対応するパターン位置に関する情報とを蓄積する。特徴点抽出部13は、画像におけるパターン番号の出現回数が1回だけであるパターン情報を特徴点パターン情報として抽出する。一致点検出部14は、複数の画像のそれぞれについて特徴点パターン情報として抽出されたパターン情報のパターン番号が一致しているか否かを判断し、一致しているパターン番号を一致点情報として検出する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、複数のビットマップ画像に含まれる画像の一致点情報を検出する画像一致点検出装置に関する。
【背景技術】
【0002】
従来の画像一致点検出手法は、多くの画素値に対してSAD(絶対差分和:Sum Absolute Difference)などの演算を行い、画像の差分が小さくなる点を探して画像の一致を検出している(特許文献1参照)。
【0003】
ところが、SADでは、複数の画素値同士を直接比較する必要があり、一つの一致点を見つけ出すだけでも多くの画素値同士を比較しなければならず、演算量が膨大になるという問題がある。
【0004】
このため、画像を縮小して解像度を下げることで比較するデータ量を減らし、徐々に解像度を上げて一致探索するような手法が考案されている(特許文献2参照)。ところが、特許文献2の手法でも、画像値同士の比較を行う必要があり、演算量を大幅に減らすのは困難である。また、周期パターンでの誤検出やノイズの問題などもあり、一致点検出の精度が低いのが現状である。さらに、カメラの傾きによる画像の回転や、カメラの前後方向の移動やズームによる拡縮までを考慮に入れようとすると、さらに比較回路が増えて演算量が増大する。
【0005】
一方、特許文献3には、所定数の特徴点を自動抽出して、画像のカメラの揺れに起因するブレを補正する手法が開示されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2008−39491号公報
【特許文献2】特開平10−136304号公報
【特許文献3】特開2005−295495号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
一致点(特徴点)を数多く抽出するほど、カメラの移動やブレを正確に特定することができるが、多くの一致点を検出することは演算量を増大させてしまう。したがって、コストやサイズが増大したりして利用できる用途が限定されるか、あるいは追従できるカメラや被写体の動きの範囲を限定せざるを得ないのが現状である。
【0008】
また、一致点を検出する処理に先だって、ノイズ除去処理や被写体の明るさの変化なども考慮に入れなければ実用にならないため、RRF(Radical Reach Filter)などを使用するなどの工夫を行う必要があり、さらなる演算量の増加を招く。
【0009】
本発明は、上述した課題に鑑みてなされたものであり、その目的は、簡易な処理手順で正確かつ高速に画像の一致点検出を行う画像一致点検出装置、画像一致点検出方法および記録媒体を提供することにある。
【課題を解決するための手段】
【0010】
上記の課題を解決するために、本発明の一態様によれば、複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表現する数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出するパターン検出部と、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納するパターン蓄積部と、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出する特徴点抽出部と、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を含む複数の前記パターン情報を一致点情報として検出する一致点検出部と、を備えることを特徴とする画像一致点検出装置が提供される。
【発明の効果】
【0011】
本発明によれば簡易な処理手順で正確かつ高速に画像の一致点検出を行うことができる。
【図面の簡単な説明】
【0012】
【図1】本発明の一実施形態に係る画像一致点検出装置を備えたビデオカメラの概略構成を示すブロック図。
【図2】画像一致点検出装置10の内部構成の一例を示すブロック図。
【図3】パターン検出部11が行う前処理の一例を示すフローチャート。
【図4】パターン番号素の検出に利用される4画素の位置の一例を示す図。
【図5】2値画像が入力された場合の前処理の一例を示すフローチャート。
【図6】画素ブロックの一例を示す図。
【図7】パターン番号生成処理の一例を示すフローチャート。
【図8】第1のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図9】パターン蓄積部12が行う第1のパターン蓄積処理の一例を示すフローチャート。
【図10】図9に続くフローチャート。
【図11】第2のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図12】パターン蓄積部12が行う第2のパターン蓄積処理の一例を示すフローチャート。
【図13】図12に続くフローチャート。
【図14】図13に続くフローチャート。
【図15】第3のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図16】パターン蓄積部12が行う第3のパターン蓄積処理の一例を示すフローチャート。
【図17】図16に続くフローチャート。
【図18】図17に続くフローチャート。
【図19】第1の特徴点抽出処理における特徴点バッファのデータ構造を示す図。
【図20】第1の特徴点抽出処理の一例を示すフローチャート。
【図21】第2の特徴点抽出処理の一例を示すフローチャート。
【図22】第3の特徴点抽出処理の一例を示すフローチャート。
【図23】パターン画像の観測確率の予測処理を行うパターン確率算出部15を備えた画像一致点検出装置10の内部構成の一例を示すブロック図。
【図24】パターン番号素と観測確率との対応関係を示すテーブルの一例を示す図。
【図25】パターン確率算出部15が行う処理の一例を示すフローチャート。
【図26A】蓄積制御処理の一例を示すフローチャート。
【図26B】図26Aに続くフローチャート。
【図26C】図26Bに続くフローチャート。
【図26D】図26Cに続くフローチャート。
【図26E】図26Dに続くフローチャート。
【図27】一致点情報のデータ構造を示す図。
【図28】一致点検出部14が行う一致点検出処理の一例を示すフローチャート。
【図29】一致点検出情報に基づく画像変換の手法を模式的に示す図。
【図30】LUTをグラフ化した一例を示す図。
【図31】図29で画像変換した後の3つのコマ画像のそれぞれに重み付けを行う例を示す図。
【図32】露出を変えながら撮影した3枚のコマ画像A,B,Cの重み付けの一例を模式的に説明する図。
【図33】ピント位置に合わせて重みを調整する手法を模式的に示す図。
【発明を実施するための形態】
【0013】
以下、図面を参照しながら、本発明の実施形態について詳細に説明する。
【0014】
(本実施形態の基本原理)
まず、本実施形態による画像一致点検出の基本原理を説明する。本実施形態によれば、複数のビットマップ画像から一致点を見つける際に、ビットマップ画像を構成する画素値同士を直接比較する必要がない。本実施形態では、各々のビットマップ画像から抽出された特徴点パターン情報のみを比較して一致点を検出する。このため、画像を構成する画素の画素値または、画素値をフィルタリング演算した結果同士を比較するのに比べて、圧倒的に少ない処理量で一致点検出を行える。
【0015】
本実施形態の基本原理の理解を助けるために例えを紹介する。例えば、人間にリンゴが写真内の右側に写っているものと、左側に写っているものを順に見せると、瞬時にリンゴが右から左に移ったことが認識される。人間は画素の集合体であるビットマップの比較を行わずして、これを達成している。このとき、リンゴがどのにあったかという非常に少ない情報だけを覚えている。本実施形態の手法はこれに似ている。本実施形態によれば、右側にリンゴが写っている最初の写真から、リンゴの表面や輪郭だけに含まれている特徴点の相対的な大小関係を表すパターン番号とパターン位置(座標)を抽出し、左側にリンゴが写っている写真からも同様の情報を抽出する。そして、これらの2種類の情報を比較することで、同一の特徴を持つ位置を抽出して、一致点として決定する。
【0016】
ここでもし、リンゴが大量に写っている写真を人間に見せた場合を想定すると、人間は、もはやリンゴの位置を記憶するのは得策ではないと判断し、代わりにその絵の特徴的な部分を記憶する。本実施形態による手法は、まさにこれに似た動作を行う。
【0017】
本実施形態が特徴的なのは、複雑な画像の画素情報の相対的な大小関係をパターン番号という単なる1つの数値に置き換えてしまうユニークなパターン検出手法を採用することである。そしてもう一つの特徴は、これらの数値を画像の多くの場所から検出したのち、その画像(または検出対象領域)にたった1箇所しかないパターン番号を抽出して特徴点とする特徴点抽出手法を採用することである。複数の数値からたった1回しか現れなかった数値を抜き出すのはたやすいことである。なお、実際には、複数回現れたパターンであっても、その範囲が狭い範囲にとどまっている場合には1箇所から検出されたとみなして良い。
【0018】
このような特徴点を抽出することは大きな意味を持つ。画像の中から、特徴的な部分のみを抜き出すことになるためである。先のリンゴの例でいえば、その画像にリンゴが1個しかなければ、リンゴの上の画素から検出されたパターン情報が抽出されることになるし、リンゴが大量に写っているならば、他の特徴的な部分が抽出されることになる。つまり、画像の絵柄に応じて自動的に見つけやすい部分が特定され、その位置を記録するということが行われ、しかもその特徴的な情報は数値(パターン番号)と座標値(パターン位置)の羅列であるため、画像データそのものを比較するのに比べて処理コストが圧倒的に少なくなる。
【0019】
本実施形態は、特徴的な部分が自動的に特定されて抽出される仕組みを持つため、一致点検出処理を高精度で、かつ非常に少ない演算量で実現できる。
【0020】
さらに、本実施形態の変形例として、ビットマップ画像中から検出されたパターン番号から、1箇所にしか検出されなかったパターン番号の抽出を高速化するために、良く現れるパターンを排除して蓄積する工夫を行うことも可能である。
【0021】
本実施形態によれば、画像をたった一度スキャンするだけで、他の画像との一致点を検出するための軽量なデータ(特徴点パターン情報)を収集できる。しかも、ノイズなどの影響を受けにくいため、従来必要であったノイズ除去処理に代表される前処理を行う必要もない。さらに、周期的に同じパターンが続く部分での誤検出が自動的に防止される。このため、デジタルカメラなどに応用する場合には、処理の前段である検波ロジックにこれを組み込むことが可能になり、低コストでリアルタイムに画像の一致点検出を行うことができ、手ぶれ補正をはじめとするさまざまな機能を低コストで実現することが容易になる。
【0022】
(本実施形態の具体的な構成および処理動作)
以下、本実施形態について、より詳細に説明する。図1は本発明の一実施形態に係る画像一致点検出装置を備えたビデオカメラの概略構成を示すブロック図である。図1のビデオカメラは、画像を撮像する撮像素子1と、撮像素子1で撮像した画像をデジタル画素データに変換するA/D変換器2と、デジタル画素データに対して各種画像処理を行う画像処理回路3と、画像処理後のデジタル画素データを符号化する符号化装置4とを備えている。本実施形態に係る画像一致点検出装置10は、画像処理装置の内部に設けられている。この画像処理装置では、上述した検波処理と画像処理を行うものであり、本実施形態に係る画像一致点検出装置10の処理は検波処理の一部として行ってもよいし、画像処理の一部として行ってもよい。
【0023】
図2は画像一致点検出装置10の内部構成の一例を示すブロック図である。図2の画像一致点検出装置10は、パターン検出部11と、パターン蓄積部12と、特徴点抽出部13と、一致点検出部14とを有する。
【0024】
パターン検出部11は、ビットマップ画像(以下、単に画像と呼ぶ)に含まれる画素ブロックごとに、画素ブロックのパターン情報を表すパターン番号を計算して、そのパターン情報の位置(パターン位置)とともに出力する。パターン番号とは、画像中の隣接する複数画素からなる画素ブロックのパターン画像を、画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値(つまり、数値が完全に一致するか不一致かの比較によって、画像の特徴の一致が検出できる性質を持つ数値)で表現したものである。パターン検出部11が出力するパターン番号とパターン位置を組にしたものはパターン情報と呼ばれる。パターン検出部11は、パターン情報を画素ブロックごとに検出する。
【0025】
パターン蓄積部12は、画像に含まれるパターン情報をパターン番号ごとに分類し、パターン番号と、同一のパターン番号の出現回数と、それぞれのパターン番号に対応するパターン位置に関する情報とを蓄積する。
【0026】
特徴点抽出部13は、パターン蓄積部12に蓄積された各種情報を用いて、画像におけるパターン番号の出現回数が1回だけであるパターン情報を特徴点パターン情報として抽出する。
【0027】
一致点検出部14は、複数の画像のそれぞれについて特徴点パターン情報として抽出されたパターン情報のパターン番号が一致しているか否かを判断し、一致しているパターン番号を一致点情報として検出する。
【0028】
パターン検出部11は、まず最初に、パターン番号素を検出する前処理を行う。パターン番号素とは、注目画素を含む周囲複数画素内のエッジの配置パターンを表すビット列信号である。前処理は、入力される画像の種類によって、処理内容が異なる。まずは、カラー画像、ベイヤ画像およびモノクロ多階調画像の場合の処理について説明する。
【0029】
図3はパターン検出部11が行う前処理の一例を示すフローチャートである。この前処理では、まず、カラー画像の場合は、R,G,BまたはC,M,Y等で表される各色の画素値から輝度値を計算してモノクロ多階調画像に変換するか、またはR,G,B,C,M,Yのうちのいずれか1つの色の画素値を抜き出してモノクロ多階調画像に変換する。
【0030】
このとき、撮像素子1がベイヤ配列の場合は、R,GinR,GinB,Bのいずれか、あるいはC,M,Y,Gのいずれかの画素値に基づいて、解像度が縦横ともに半分になったモノクロ多階調画像に変換するか、あるいはデモザイク処理を行って輝度値を計算してモノクロ多階調画像に変換してから処理を行う。
【0031】
撮像素子1がハニカム配列の場合は、正方画素変換後、あるいは奇数ラインか偶数ラインのみを抽出してモノクロ多階調正方画素に変換してから行えばよい。
【0032】
注目画素の画素位置をx,yとして、その画素値をp(x, y)とすると、注目画素と、右、下、斜め右下の4画素値は、p(x, y)、p(x+1, y)、p(x, y+1)、p(x+1, y+1)で表される。図4は、これら4画素の位置の一例を示す図である。これら4画素値の和は以下の(1)で表される。
Sum =p(x, y) + p(x+1, y) + p(x, y+1) + p(x+1, y+1) …(1)
ここで、以下の(2)〜(4)式に基づいて、d、T0、T1を計算する。
d=Sum/16 …(2)
T0=Sum/4−d …(3)
T1=Sum/4+d …(4)
パターン番号素は4ビットのビット列信号であり、以下の基準でビット値が定まる。以下では、パターン番号素をn(x, y)と表す。
p(x, y)がT0以上でT1以下なら、Bit0を0、そうでなければ1とする。
p(x+1, y)がT0以上でT1以下なら、Bit1を0、そうでなければ1とする。
p(x, y+1)がT0以上でT1 以下なら、Bit2を0、そうでなければ1とする。
p(x+1, y+1)がT0以上でT1以下なら、Bit3を0、そうでなければ1とする。
【0033】
以下、前処理の具体的な処理手順を図3を用いて順に説明する。まず、上記(1)式に従って、注目画素を含む周囲4画素の画素値の和を計算する(ステップS1)。次に、(2)式に従って許容度(allowance)dを計算する(ステップS2)。次に、(3)式に従って下側閾値T0を計算する(ステップS3)。次に、(4)式に従って上側閾値T1を計算する(ステップS4)。
【0034】
次に、注目画素値p(x, y)が下側閾値T0と上側閾値T1の範囲内にあるか否かを判定する(ステップS5)上記範囲外の場合は、パターン番号素の最下位ビットBit0を1に設定する(ステップS6)。なお、パターン番号素nは、初期状態では0とする。
【0035】
次に、注目画素の右隣の画素値p(x+1, y)が上記範囲内にあるか否かを判定する(ステップS7)。上記範囲外の場合は、パターン番号素のBit1を1に設定する(ステップS8)。
【0036】
ステップS7で上記範囲内と判定された場合、またはステップS8の処理が終わった場合は、注目画素の下隣の画素値p(x, y+1)が上記範囲内にあるか否かを判定する(ステップS9)。上記範囲外の場合は、パターン番号素のBit2を1に設定する(ステップS10)。
【0037】
ステップS9で上記範囲内と判定された場合、またはステップS10の処理が終わった場合は、注目画素の斜め右下の画素値p(x+1, y+1)が上記範囲内にあるか否かを判定する(ステップS11)。上記範囲外の場合は、パターン番号素のBit3を1に設定する(ステップS12)。以上で、図3の処理は終了する。
【0038】
次に、パターン検出部11に入力される画像が2値画像の場合の前処理について説明する。この前処理では、p(x, y)が0か、それ以外(通常は1)の2つの値しか取らないため、以下のようにパターン番号素n(x, y)を設定する。
p(x, y)が0ならば、Bit0を0、そうでなければ1とする。
p(x+1, y) が0ならば、Bit1を0、そうでなければ1とする。
p(x, y+1) が0ならば、Bit2を0、そうでなければ1とする。
p(x+1, y+1)が0ならば、Bit3を0、そうでなければ1とする。
【0039】
図5は2値画像が入力された場合の前処理の一例を示すフローチャートである。まず、p(x, y)が0か否かを判定し(ステップS21)、0でなければパターン番号素のBit0を1に設定する(ステップS22)。なお、パターン番号素nは、初期状態では0とする。
【0040】
ステップS21で0と判定された場合、またはステップS22の処理が終わると、p(x+1, y)が0か否かを判定し(ステップS23)、0でなければパターン番号素のBit1を1に設定する(ステップS24)。
【0041】
ステップS23で0と判定された場合、またはステップS24の処理が終わると、p(x, y+1)が0か否かを判定し(ステップS25)、0でなければパターン番号素のBit2を1に設定する(ステップS26)。
【0042】
ステップS25で0と判定された場合、またはステップS26の処理が終わると、p(x+1, y+1)が0か否かを判定し(ステップS27)、0でなければパターン番号素のBit3を1に設定する(ステップS28)。以上で、図5の処理は終了する。
【0043】
パターン検出部11は、図3または図5の前処理が終わると、パターン番号生成処理を行う。パターン番号生成処理では、処理対象のパターン番号素n(x,y)を中心とする周囲3×3個のパターン番号素(以下、画素ブロック)のビットパターンの種類を表すパターン番号を生成する。
【0044】
図6は画素ブロックの一例を示す図である。画素ブロック内の計9個のパターン番号素は、n(x-2, y-2)、n(x, y-2)、n(x+2, y-2)、n(x-2, y)、n(x, y)、n(x+2, y)、n(x-2, y+2)、n(x, y+2)、n(x+2, y+2)である。各パターン番号素は4ビットで表され、これら4ビットのパターン番号素を9個並べた計36ビットのビット列がパターン番号となる。パターン番号は、以下の式で表される。
パターン番号=n(x-2, y-2) ×232+n(x, y-2) ×228+n(x+2, y-2) ×224
+n(x-2, y)×220+n(x, y)×216+n(x+2, y)×212+n(x-2, y+2) ×28
+n(x, y+2) ×24+n(x+2, y+2) …(5)
(5)式からわかるように、パターン番号は0から236−1までの値を取る。
【0045】
パターン検出部11は、(5)式で表されるパターン番号と、このパターン番号の画素ブロックの画像中の位置を示すパターン位置とを組にしたパターン情報を生成する。このパターン情報はパターン蓄積部12に送られる。
【0046】
図7は上述したパターン番号生成処理の一例を示すフローチャートである。まず、(x-2, y-2)位置のパターン番号素n(x-2, y-2)をpat_idに入力する(ステップS31)。次に、pat_idを左に4ビットシフトし、(x, y-2)位置のパターン番号素を加算する(ステップS32)。次に、pat_idを左に4ビットシフトし、(x+2, y-2)位置のパターン番号素を加算する(ステップS33)。次に、pat_idを左に4ビットシフトし、(x-2, y)位置のパターン番号素を加算する(ステップS34)。次に、pat_idを左に4ビットシフトし、(x, y)位置のパターン番号素を加算する(ステップS35)。次に、pat_idを左に4ビットシフトし、(x+2, y)位置のパターン番号素を加算する(ステップS36)。次に、pat_idを左に4ビットシフトし、(x-2, y+2)位置のパターン番号素を加算する(ステップS37)。次に、pat_idを左に4ビットシフトし、(x, y+2)位置のパターン番号素を加算する(ステップS38)。次に、pat_idを左に4ビットシフトし、(x+2, y+2)位置のパターン番号素を加算する(ステップS39)。
【0047】
以上で、パターン検出部11の処理動作の概略説明は終りであるが、一つの画素ブロックから複数種類のパターン情報を生成してもよい。この場合、複数種類の前処理部を設けて、それぞれの前処理部が互いに異なるパターン番号素を生成するようにする必要がある。
【0048】
例えば、上述した(2)式のdを、d=Sum/8としてパターン番号素を生成する処理を追加で行えば、同一の画像でありながら、生成されるパターン番号素を複数種類設けることができ、結果として、パターン番号も変えることができ、複数種類のパターン情報を生成することができる。
【0049】
上述したdを変えるということは、画像の中にエッジ情報が含まれるかどうかの判断基準を変えることであり、例えばdを大きくすることは、エッジとみなす輝度の差のスレッショルドが大きくなるため、よりはっきりしたエッジのみがパターン番号のビットに反映されることになり、結果ノイズの影響を受けにくくなるため、ノイズの多い画像においては、一致点検出の精度の向上につながる。
【0050】
このように、複数の許容度(閾値)dのそれぞれごとに、パターン番号と、同一のパターン番号の出現回数とそれぞれのパターン番号に対応するパターン位置に関する情報とを蓄積することで、どのような画像に対しても、良好な一致点検出結果が得られる。
【0051】
例えば、ノイズが多い高感度撮影された映像の場合は、dを小さくすると、ノイズに反応してしまうため、dは大きくするのが望ましい。ところが、単にdを大きくしただけだと、ノイズは少ないがエッジがはっきりしない画像では、エッジを正しく検出できないおそれがある。この2つの要求を満足させるためには、同一画像に対して、dを小さくして得られたパターン番号とdを大きくして得られたパターン番号をともに重複しないで二種類設ければよい。例えば、dを小さくした場合のパターン番号を0〜236−1の範囲内の数値とし、dを大きくした場合のパターン番号を236〜237−1の範囲内の数値とする。これにより、両者のパターン番号は重複しなくなり、同一画像について、二種類の異なる基準で二種類のパターン番号を生成できる。これにより、例えばノイズの影響を受けにくくなり、かつ不鮮明なエッジでも確実に検出できるようになる。
【0052】
上述した例では、dの大きさを変えることで、二種類の重複しないパターン番号を生成したが、全く異なるアルゴリズムで複数種類のパターン番号を重複しないように生成してもよい。これらの異なるアルゴリズムで生成された複数種類のパターン番号を用いて一致点検出を行うことで、個々のアルゴリズムで生成したパターン番号を用いて一致点検出を行った場合に得られる効果を組み合わせた効果が得られる。
【0053】
上述したように、パターン検出部11は、3×3個のパターン番号素を含む画素ブロックを単位としてパターン検出処理を行うが、各パターン番号素は周囲の4画素のエッジ情報を考慮に入れた4ビットのビット列であり、結局、本実施形態では、縦6画素×横6画素の画素ブロックを単位としてパターン検出処理を行うことになる。
【0054】
パターン検出部11が一つの画素ブロックの処理が終了すると、次の画素ブロックのパターン検出処理を行うことになる。この場合、画素ブロックを画素単位でずらして新たな画素ブロックを設定するのが望ましいが、処理の簡略化と高速化の観点で、画素ブロック同士が重なり合わないように新たな画素ブロックを設定してもよい。
【0055】
ただし、画像中のある物体が1画素だけ移動した場合を考えると、1画素単位で画素ブロックをずらしながらパターン検出処理を行わないと、その物体の移動を正しく検出できなくなる。したがって、画素ブロックの設定単位を間引く場合は、ローパスフィルタ処理等の何らかの画像処理を前段に設けるのが望ましい。
【0056】
なお、パターン番号素は必ずしも4ビットのビット列である必要はないし、周辺の計4画素以外の画素情報を用いてパターン番号素を検出してもよい。また、パターン番号を検出する単位となる画素ブロックのサイズも、必ずしも3×3画素サイズには限定されない。
【0057】
<第1のパターン蓄積処理>
次に、パターン蓄積部12の処理動作を説明する。パターン蓄積部12は、パターン検出部11で検出されたパターン番号の数分の蓄積バッファ(不図示)を有する。図8は第1のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。蓄積バッファは、パターン番号pat_idと、パターン位置x, yと、同じパターン番号のパターン情報を蓄積した回数を示す計数値cntとを格納する。
【0058】
個々の蓄積バッファの計数値cntは、パターン情報の蓄積を開始する前に0に初期化される。蓄積バッファにパターン情報を格納する際には、同じパターン番号のパターン情報がすでに格納されているか否かを確認する。この確認処理は、計数値cntが0か否かで判断する。すでに格納されている場合、すなわち計数値cntが0以外の場合は、計数値cntをインクリメントする。なお、本明細書では、1だけ数を増やすことを単に「インクリメントする」と呼ぶ。
【0059】
このとき、計数値cntが0であれば、蓄積バッファ内に新たなパターン番号pat_idと、対応するパターン位置x, yを格納し、計数値cntを1にする。
【0060】
このような処理を繰り返して、画像内のすべての画素ブロックについて、パターン情報と計数値cntを蓄積バッファに格納し終えると、パターンの蓄積処理は終了する。
【0061】
図9および図10はパターン蓄積部12が行う第1のパターン蓄積処理の一例を示すフローチャートである。まず、蓄積バッファ上の位置を表す変数iを0に初期化する(ステップS41)。次に、i番目の蓄積バッファstockの計数値cntを0に初期化する(ステップS42)。次に、変数iをインクリメントする(ステップS43)。次に、変数iが蓄積バッファstockの総数より小さいか否かを判定する(ステップS44)。小さい場合はステップS42に戻って、残りの蓄積バッファstockの係数値cntを初期化する。
【0062】
変数iが蓄積バッファstockの総数以上であれば、蓄積バッファstockに格納したパターン番号pat_idの総数stock_maxを0に初期化する(ステップS45)。
【0063】
次に、パターン検出部11で検出されたパターン番号上の位置を表す変数jを0に初期化する(ステップS46)。次に、変数iを再度0に初期化する(ステップS47)。
【0064】
このように、ステップS41〜S47では、全ての蓄積バッファstockの初期化を行う。
【0065】
次に、パターン検出部11で検出されたパターン番号pat_idがi番目の蓄積バッファstockのパターン番号pat_idと一致するか否かを判定する(ステップS48)。一致しない場合は、次の蓄積バッファstockを検出するために、変数iをインクリメントする(ステップS49)。
【0066】
次に、まだ比較していない蓄積バッファstockのパターン番号pat_idが残っているか否かを判定する(ステップS50)。残っている場合は、ステップS48に戻る。残っていない場合は、パターン検出部11で検出されたパターン番号pat_idを新たな蓄積バッファに蓄積バッファに格納する(ステップS51)。次に、そのパターン番号pat_idに対応するパターン位置を同じ蓄積バッファに格納する(ステップS52)。そして、その蓄積バッファの計数値cntを1に設定する(ステップS53)。次に、蓄積バッファの総数stock_maxをインクリメントする(ステップS54)。
【0067】
一方、ステップS48で、一致すると判定された場合は、蓄積バッファstockの計数値cntをインクリメントする(ステップS55)。
【0068】
ステップS54またはS55の処理が終わると、変数jをインクリメントする(ステップS56)。
【0069】
次に、パターン検出部11で検出されたパターン番号の総数が変数jより大きいか否かを判定する(ステップS57)。大きい場合は、ステップS47以降の処理を行う。大きくない場合は、蓄積処理を終了する。
【0070】
<第2のパターン蓄積処理>
上述したパターン蓄積部12内の各蓄積バッファは図8の情報を格納したが、格納する情報は図8に限定されない。図11は第2のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。図11の蓄積バッファは、パターン番号pat_idと、パターン位置xの最大値max_xと、パターン位置yの最大値max_yと、パターン位置xの最小値min_xと、パターン位置yの最小値min_yと、パターン位置xの積算値sum_xと、パターン位置yの積算値sum_yと、格納した回数を示す計数値cntとを有する。
【0071】
この場合の蓄積バッファも、パターン検出部11で検出されたパターン番号の数分だけ設けられる。蓄積バッファへの格納を開始する前に、すべての蓄積バッファの計数値cntが0に初期化される。
【0072】
パターン蓄積部12は、蓄積バッファにパターン情報を格納する際には、同じパターン番号のパターン情報がすでに格納されているか否かを確認し、すでに格納されている場合には、新たに格納しようとするパターン位置x, yを、累積和sum_x, sum_yにそれぞれ加算する。また、このパターン位置xが最大値max_xより大きければmax_xをxに置き換え、パターン位置yが最大値max_yより大きければmax_yをyに置き換える。同様に、パターン位置xが最小値min_xより小さければmin_xをxに置き換え、パターン位置yが最小値min_xより小さければmin_yをyに置き換える。さらに、計数値cntをインクリメントする。
【0073】
一方、上記確認を行った結果、まだ格納されていない場合は、新たな蓄積バッファのpat_idに格納対象のパターン番号pat_idを格納し、sum_x, max_x, min_xのいずれにも格納対象のパターン位置xを格納し、sum_y, max_y, min_yのいずれにも格納対象のパターン情報yを格納する。さらに、計数値cntを1に設定する。
【0074】
このようにして、画像内のすべての画素ブロックについてのパターン情報を格納し終わったら、パターン蓄積処理は終了する。
【0075】
図12〜図14はパターン蓄積部12が行う第2のパターン蓄積処理の一例を示すフローチャートである。まず、蓄積バッファ上の位置を表す変数iを0に初期化する(ステップS61)。次に、i番目の蓄積バッファstockの計数値cntを0に初期化する(ステップS62)。次に、変数iをインクリメントする(ステップS63)。次に、変数iが蓄積バッファstockの総数未満か否かを判定する(ステップS64)。総数未満の場合はステップS62に戻る。
【0076】
ステップS64で、総数に達したと判定された場合は、パターン番号の総数stock_maxを0に初期化する(ステップS65)。次に、パターン検出部11で検出されたパターン番号上の位置を示す変数jを0に初期化する(ステップS66)。次に、変数iを再度0に初期化する(ステップS67)。
【0077】
次に、パターン検出部11で検出されたパターン情報のパターン番号pat_idが蓄積バッファstockのパターン番号pat_idと一致するか否かを判定する(ステップS68)。一致する場合は、パターン検出部11で検出されたパターン位置xをsum_xに加算し(ステップS69)、パターン位置yをsum_yに加算する(ステップS70)。
【0078】
次に、パターン検出部11で検出されたパターン位置xはmax_xより大きいか否かを判定し(ステップS71)、大きい場合にはmax_xをxに置き換える(ステップS72)。
【0079】
次に、パターン検出部11で検出されたパターン位置xはmin_xより小さいか否かを判定し(ステップS73)、小さい場合にはmin_xをxに置き換える(ステップS74)。
【0080】
次に、パターン検出部11で検出されたパターン位置yはmax_yより大きいか否かを判定し(ステップS75)、大きい場合にはmax_yをyに置き換える(ステップS76)。
【0081】
次に、パターン検出部11で検出されたパターン位置yはmin_yより小さいか否かを判定し(ステップS77)、小さい場合にはmin_yをyに置き換える(ステップS78)。
【0082】
次に、蓄積バッファstockの計数値cntをインクリメントする(ステップS79)。次に、変数jをインクリメントする(ステップS80)。
【0083】
次に、パターン検出部11で検出されたパターン番号の総数が変数jより大きいか否かを判定する(ステップS81)。大きくなければ処理を終了し、大きければステップS67以降の処理を行う。
【0084】
一方、上述したステップS68で一致しないと判定されると、変数iをインクリメントする(ステップS82)。次に、パターン検出部11で検出されたパターン情報のパターン番号との比較をまだ行っていない蓄積バッファが残っているか否かを判定する(ステップS83)。残っている場合にはステップS68以降の処理を行う。残っていない場合は、パターン検出部11で検出されたパターン番号pat_idを蓄積バッファに格納し(ステップS84)、対応するパターン位置xをsum_x, max_x, min_xにそれぞれ格納する(ステップS85〜S87)。また、対応するパターン位置yをsum_y, max_y, min_yにそれぞれ格納する(ステップS88〜S90)。次に、計数値cntを1に設定し(ステップS91)、蓄積バッファの種類を示す変数stock_maxをインクリメントし(ステップS92)、その後にステップS80以降の処理を行う。
【0085】
<第3のパターン蓄積処理>
第2のパターン蓄積処理のように、パターン位置x, yの最大値と最小値を格納する代わりに、パターン位置xの2乗の積算値sum_x2とパターン位置yの2乗の積算値sum_y2を格納してもよい。
【0086】
図15は第3のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。図示のように、蓄積バッファは、パターン番号pat_idと、パターン位置xの積算値sum_xと、パターン位置yの積算値sum_yと、パターン位置xの2乗の積算値sum_x2と、パターン位置yの2乗の積算値sum_y2と、蓄積バッファに格納した回数を示す計数値cntとを有する。
【0087】
パターン蓄積部12は、蓄積バッファにすでに格納されたデータが存在する場合は、sum_x, sum_yにそれぞれパターン位置x, yを加算し、sum_x2にxの2乗を加算し、sum_y2にyの2乗を加算し、計数値cntをインクリメントする。
【0088】
蓄積バッファにまだ格納されていないパターン番号の場合は、新たな蓄積バッファのパターン番号pat_idに、格納対象のパターン情報のpat_idを格納し、sum_x, sum_yに格納対象のパターン情報のパターン位置x, yをそれぞれ格納し、sum_x2, sum_y2に格納対象のパターン情報のxの2乗とyの2乗をそれぞれ格納し、cntを1に設定する。このようにして、画像内のすべての検出位置のパターン情報を格納し終えたら、パターン蓄積処理は終了する。
【0089】
図16〜図18はパターン蓄積部12が行う第3のパターン蓄積処理の一例を示すフローチャートである。ステップS101〜S110は図12および図13のステップS61〜S70と共通するため、説明を省略する。
【0090】
ステップS110の処理が終わると、パターン位置xの2乗をsum_x2に加算する(ステップS111)。次に、パターン位置yの2乗をsum_y2に加算する(ステップS112)。その後、ステップS113〜S119は、図13および図14のステップS79〜S85と共通するため、説明を省略する。
【0091】
ステップS119の処理が終わると、次に、対応するパターン位置yをsum_yに格納し(ステップS120)、対応するパターン位置xの2乗をsum_x2に格納し(ステップS121)、対応するパターン位置yの2乗をsum_y2に格納する(ステップS122)。その後、計数値cntを1に初期化し(ステップS123)、蓄積バッファの種類を示す変数stock_maxをインクリメントする(ステップS124)。
【0092】
ステップS124の後にステップS114に移行する。
【0093】
以上で、パターン蓄積部12の処理動作の説明は終りである。次に、特徴点抽出部13の処理動作を説明する。特徴点抽出部13の処理動作として、以下の第1〜第3の特徴点抽出処理が考えられる。
【0094】
<第1の特徴点抽出処理>
第1の特徴点抽出処理は、図8のデータ構造の蓄積バッファに対応するものであり、第1のパターン蓄積処理の後に行われる。特徴点抽出部13は、図8のデータ構造の蓄積バッファを走査し、計数値cntが1の情報を抽出して、特徴点バッファ(不図示)に格納する。
【0095】
図19は第1の特徴点抽出処理における特徴点バッファのデータ構造を示す図である。図19の特徴点バッファには、パターン番号pat_idと、パターン位置xと、パターン位置yとが格納される。
【0096】
図20は第1の特徴点抽出処理の一例を示すフローチャートである。まず、蓄積バッファstock上の位置を示す変数iと、特徴点バッファpatinfo上の位置を示す変数jをともに0に初期化する(ステップS131)。
【0097】
次に、i番目の蓄積バッファ内の計数値cntが1か否かを判定する(ステップS132)。1であれば、その蓄積バッファ内のパターン番号pat_idとパターン位置x, yを、特徴点バッファpatinfoに格納する(ステップS133、S134)。続いて、変数jとiをインクリメントする(ステップS135、S136)。
【0098】
次に、変数iが蓄積バッファの総数未満か否かを判定し(ステップS137)、総数未満であれば、ステップS132に移行し、総数に達すると処理を終わる。
【0099】
<第2の特徴点抽出処理>
第2の特徴点抽出処理は、図11のデータ構造の蓄積バッファに対応するものであり、第2のパターン蓄積処理の後に行われる。特徴点抽出部13は、図11のデータ構造の蓄積バッファを走査し、計数値cntが1の蓄積バッファか、あるいは以下の3つの条件を満たす蓄積バッファを抽出する。そして、抽出した蓄積バッファ内の情報を特徴点バッファに格納する。
1)計数値cntが2以上
2)最大値max_x−最小値min_x<dx
3)最大値max_y−最小値min_y<dyの情報
【0100】
第2の特徴点抽出処理における特徴点バッファのデータ構造は図19と同じであるが、パターン位置xには、パターン位置xの総和sum_xを計数値cntで割った値sum_x/cntが格納され、パターン位置yには、パターン位置yの総和sum_yを計数値cntで割った値sum_y/cntが格納される。
【0101】
ここで、上述したdx、dyは、特徴点か否かを判断するための閾値である。画像中の離れた場所に同一パターンが存在する場合は、そのパターンは特徴点として機能しない可能性が高いので、排除する。一方、同一パターンが画像中の狭い範囲内しか存在しない場合は、そのパターンを特徴点とみなして、同一パターンの検出位置を平均化した位置を、そのパターン位置とする。
【0102】
このような処理は、焦点が合っていないぼやけた部分では、近接した位置に同一パターンが発見されることが多いことへの対応策である。
【0103】
複数の画像を合成する場合など、画像の一致をより厳密に行うために画像全域で一致点をなるべく多く見つけ出したい場合には、dxとdyに例えば1〜5程度の数値を与えて実行するのが望ましい。
【0104】
また、手ぶれ補正など、それほど多くの一致点を検出しなくて済む場合は、dxとdyを0に設定すれば、画像中の一箇所のみに存在した画素配置を抽出することになる。この場合は、第1の特徴点抽出処理と等価な処理となるため、処理コストの少ない第1の特徴点抽出処理を実行するのが望ましい。
【0105】
図21は第2の特徴点抽出処理の一例を示すフローチャートである。まず、蓄積バッファstock上の位置を示す変数iと、特徴点バッファpatinfo上の位置を示す変数jをともに0に初期化する(ステップS141)。
【0106】
次に、i番目の蓄積バッファstock内の計数値cntが1か、あるいは、max_x−min_x<dxかつmax_y−min_y<dyかを判定する(ステップS142)。ステップS142の判定がYesの場合は、j番目の特徴点バッファpatinfoに、i番目の蓄積バッファstock内のパターン番号pat_idを格納する(ステップS143)。次に、同じ特徴点バッファpatinfoに、同じ蓄積バッファstock内の情報を用いて計算されたsum_x/cntとsum_y/cntを格納する(ステップS144、S145)。
【0107】
次に、変数j、iをインクリメントする(ステップS146、S147)。次に、変数iが蓄積バッファの総数に達したか否かを判定し(ステップS148)、達していなければ、ステップS142以降の処理を行い、達した場合は処理を終了する。
【0108】
<第3の特徴点抽出処理>
第3の特徴点抽出処理は、図15のデータ構造の蓄積バッファに対応するものであり、第3のパターン蓄積処理の後に行われる。特徴点抽出部13は、図15のデータ構造の蓄積バッファを走査し、計数値cntが1の蓄積バッファか、あるいは以下の3つの条件を満たす蓄積バッファを抽出する。そして、抽出した蓄積バッファ内の情報を特徴点バッファに格納する。
1)計数値cntが2以上
2)標準偏差stdev_x=√((cnt*sum_x2−sum_x*sum_x)/cnt/(cnt−1)<dx
3)標準偏差stdev_y=√((cnt*sum_y2−sum_y*sum_y)/cnt/(cnt−1)<dy
【0109】
第3の特徴点抽出処理における特徴点バッファのデータ構造は図19と同じであるが、パターン位置xにはsum_x/cntが格納され、パターン位置yにはsum_y/cntが格納される。すなわち、第2の特徴点抽出処理と同様である。
【0110】
第3の特徴点抽出処理も、第2の特徴点抽出処理と同様に、画像中の近接した場所のみに同一パターンが存在する場合には特徴点とみなす。近接した場所かどうかを判断するためにパターン位置x, yの標準偏差stdev_x, stdev_yを閾値と比較する点が第2の特徴点抽出処理と異なる。
【0111】
図22は第3の特徴点抽出処理の一例を示すフローチャートである。蓄積バッファstockの種類を示す変数iと、特徴点バッファpatinfoの種類を示す変数jをともに0に初期化する(ステップS151)。
【0112】
次に、i番目の蓄積バッファstock内の計数値cntが1か否かを判定する(ステップS152)。1であれば、j番目の特徴点バッファに、i番目の蓄積バッファ内のパターン番号pat_idと、sum_x/cntと、sum_y/cntとを格納する(ステップS153〜S155)。
【0113】
次に、変数i,jをインクリメントする(ステップS156,S157)。次に、変数iが蓄積バッファの総数に達したか否かを判定し(ステップS158)、達していなければステップS152に戻り、達した場合には処理を終了する。
【0114】
一方、ステップS152で1でないと判定された場合は、標準偏差stdev_x=√((cnt*sum_x2−sum_x*sum_x)/cnt/(cnt−1)<dxか否かを判定する(ステップS159)。判定がYesの場合は、標準偏差stdev_y=√((cnt*sum_y2−sum_y*sum_y)/cnt/(cnt−1)<dyか否かを判定する(ステップS160)。
【0115】
ステップS160でYesと判定された場合はステップS153に移行し、ステップS159またはS160でNoと判定された場合はステップS157に移行する。
【0116】
上述した第1、第2または第3の特徴点抽出処理によって、特徴点バッファに格納されたデータが特徴点パターン情報patInfoとなる。
【0117】
<パターン観測確率算出処理>
上述したパターン蓄積部12は、パターン番号を検出すべきビットマップ画像の全画素数分の蓄積バッファを設けることを念頭に置いた。ところが、実際には、同じパターン番号を持つ画素ブロックのパターン情報は同じ蓄積バッファに格納されるため、必ずしも、ビットマップ画像の全画素数分の蓄積バッファを用意する必要はない。この場合、蓄積バッファの数を予め制限して、すべての蓄積バッファを使い終わった時点でパターン蓄積部12の蓄積処理を終了するか、あるいは蓄積バッファに格納するパターン情報を予め制限して、有用なパターン情報のみを蓄積バッファに格納してもよい。
【0118】
画素ブロック内のパターン番号の観測確率を予め予測して、観測確率が低いパターン画像に関するパターン情報のみを蓄積することで、蓄積されるパターン情報の数を減らすことも考えられる。観測確率が低いパターン画像のみに限定する理由は、観測確率の低いパターン番号はまれにしか出現しないことを意味するから、特徴的である可能性が高いためである。
【0119】
このようなパターン画像の観測確率の予測は、上述したパターン蓄積部12が処理を行う前に行う必要がある。図23はパターン画像の観測確率の予測処理を行うパターン確率算出部15を備えた画像一致点検出装置10の内部構成の一例を示すブロック図である。図示のように、パターン検出部11とパターン蓄積部12の間にパターン確率算出部15が設けられ、これ以外の構成は図2と同じである。
【0120】
画像の中に、あるパターン番号のパターン画像が含まれる確率は、各画像ごとに異なるが、パターン確率算出部15は、蓄積バッファの数を減らして処理の高速化を図るために設けられるものであり、単に蓄積バッファへのパターン情報の格納を行うか否かを示す情報のみを出力すればよい。
【0121】
本実施形態では、6×6=36画素からなる画素ブロックを、3×3=9個のパターン番号素の組合せで表現している。したがって、各パターン番号素が観測される確率を9個分掛け合わせて得られる乗算値を閾値と比較することにより、その画素ブロックのパターン情報を蓄積するべきか否かを判断すればよい。
【0122】
パターン番号素は、0〜15の数値を取り得るため、予め代表的な画像について、各パターン番号素の観測確率を求めて、テーブル化しておく。図24はパターン番号素と観測確率との対応関係を示すテーブルの一例を示す図である。このようなテーブルをルックアップテーブル(以下、LUT)として参照することで、容易に観測確率を算出できる。
【0123】
図25はパターン確率算出部15が行う処理の一例を示すフローチャートである。このフローチャートは、パターン番号を検出する単位である画素ブロックごとに行われる。まず、パターン番号素の種類を表す変数idsを初期化する(ステップS161)。ここでは、新たなパターン番号素の値pat_idを変数idsに代入する。
【0124】
次に、パターン観測確率pat_probを1に初期化する(ステップS162)。次に、確率を求めたパターン番号素の総数を表す変数iを0に初期化する(ステップS163)。
【0125】
次に、変数idsを16で割った余りを変数nに代入する(ステップS164)。次に、変数idsに対応する確率LUT(u)をLUTから参照し、パターン観測確率pat_probと掛け合わせる(ステップS165)。次に、変数idsを更新するために、(ids−n)/16を変数idsに代入する(ステップS166)。次に、変数iをインクリメントする(ステップS167)。
【0126】
次に、変数iがパターン番号素の総数に達したか否かを判定する(ステップS168)。達していなければステップS164以降の処理を行う。変数iがパターン番号素の総数に達した場合は、パターン観測確率pat_probが求まったことを示しており、このパターン観測確率pat_probが予め定めた閾値未満か否かを判定する(ステップS169)。
【0127】
パターン観測確率pat_probが閾値未満であれば、上述した第1,第2または第3のパターン蓄積処理を行う(ステップS170)。一方、閾値以上であれば、その画素ブロックのパターン情報はパターン蓄積部12には蓄積しないものと決定する(ステップS171)。
【0128】
図25の処理では、パターン観測確率pat_probの大きさにより、パターン蓄積を行うか否かを判断している。ところが、画像によっては、細かな模様が数多く含まれているものや、逆にコントラストが低い画像や夜景のように暗い画像もある。したがって、図25の処理では、細かな模様が数多く含まれている画像は数多くのパターン情報が蓄積され、コントラストが低い画像等はあまり蓄積されない結果となる。
【0129】
パターン蓄積部12内の蓄積バッファをできるだけ最大限使うためには、画像の種類ごとに異なる適切な閾値を設定しなければならないが、そのためには、閾値を決定する処理を別個に行わなければならず、処理速度の高速化という観点から不利である。
【0130】
そこで、図25の処理によって得られたパターン観測確率pat_probを複数の段階に分類し(段階分類部)、各段階ごとに蓄積バッファを設けて、蓄積バッファを使用するか否かを各段階ごとに判断することで、蓄積バッファの使用量を制限することが考えられる。
【0131】
この場合、対応する段階またはそれ以下の段階に属する特徴点パターン情報の候補の数を計測する(特徴点候補計数部)。次に、特徴点パターン情報の候補のパターン番号と、同一のパターン番号の出現回数と、各パターン番号に対応するパターン位置に関する情報とを、複数の蓄積バッファに分けて格納するようにする。その際、特徴点候補計数部で計測された数が所定の閾値未満であれば、対応する蓄積バッファへの格納を許可し、特徴点候補計測部で計測された数が閾値より大きければ、対応する段階以上(つまり、観測確率の高い段階)のすべての蓄積バッファへの格納を禁止する。図26A、図26B、図26Cおよび図26Dはこの種の蓄積制御処理の一例を示すフローチャートである。
【0132】
図26Aは、図9のステップS42、図12のステップS62または図16のステップS102の処理に代わるものであり、段階ごとに設けられる複数の蓄積バッファをすべてクリアする処理を行う。
【0133】
まず、段階を表す変数kを0に設定する(ステップS42−1)。次に、k番目の段階の蓄積バッファstockを使用すべく、stockポインタを設定する(ステップS42−2)。
【0134】
次に、k番目の段階のi番目の蓄積バッファstockの計測数cntを0に設定(クリア)する(ステップS42−3)。次に、変数kをインクリメントし(ステップS42−4)、すべての段階(例えば、16段階)の蓄積バッファstockすべてをクリアしたか否かを判定し、判定がNoの場合はステップS42−2に戻り、Yesの場合は図9のステップS43、図12のステップS63または図16のステップS103に移行する。
【0135】
図26Bは、図9のステップS46、図12のステップS66または図16のステップS106の処理に代わるものであり、すべての段階の特徴点パターン情報の候補数(以下、特徴点候補数)ccntと蓄積バッファへの格納を許可するか否かを設定するための蓄積許可フラグFlagを初期化する。
【0136】
まず、パターン検出部11で検出されたパターン番号上の位置を表す変数jを0に設定する(ステップS46−1)。次に、段階を表す変数kを0に設定する(ステップS46−2)。次に、k番目の段階の特徴点候補数ccnt[k]を0に設定する(ステップS46−3)。次に、k番目の段階の蓄積許可フラグFlag[k]を許可状態(例えば1)に設定する(ステップS46−4)。次に、変数kをインクリメントする(ステップS46−5)。
【0137】
次に、16段階全ての特徴点候補数ccnt[k]と蓄積許可フラグFlag[k]を初期化したか否かを判定し(ステップS46−6)、判定がNoの場合はステップS46−3に戻り、判定がYesの場合は、図9のステップS47、図12のステップS67または図16のステップS107の処理を行う。
【0138】
図26Cは、図9のステップS47、図12のステップS67または図16のステップS107の処理に代わるものであり、蓄積許可フラグFlagが許可状態のときのみ、蓄積バッファへの格納を行うものである。
【0139】
まず、蓄積バッファstock上の位置を示す変数iを0に設定する(ステップS47−1)。次に、パターン番号pat_id[j]からパターン観測確率pat_probを算出する(ステップS47−2)。ここでは、図25の処理を実行する。
【0140】
次に、算出したパターン観測確率pat_probから段階LEVを算出する(ステップS47−3)。パターン観測確率pat_probの最大値は539であり、log10539=約15であるため、段階LEVは、0〜15の範囲内の16段階を示す値となる。
【0141】
次に、段階LEVの蓄積バッファへの格納が許可されているか否かを判定する(ステップS47−4)。ここでは、蓄積許可Flagの値で判断する。許可されていなければ、図10のステップS56、図13のステップS80または図17のステップS114に移行し、許可されていれば、LEV番目の段階の蓄積バッファにパターン番号等を格納する設定を行う(ステップS47−5)。その後、図10のステップS48、図12のステップS68または図17のステップS108の処理を行う。
【0142】
図26Dは、図10のステップS55、図13のステップS79または図17のステップS113の処理に代わるものであり、パターン検出部11で検出されたパターン番号pat_idがi番目の蓄積バッファstockのパターン番号pat_idと一致した場合には、特徴点パターン情報ではなくなることから、特徴点候補数ccnt[LEV]をデクリメントするものである。
【0143】
まず、計数値cntをインクリメントし(ステップS55−1)、次に、特徴点候補数ccnt[LEV]をデクリメントする(ステップS55−2)。その後、図10のステップS56、図13のステップS80または図17のステップS114の処理を行う。
【0144】
図26Eは、図10のステップS54、図14のステップS92または図18のステップS124の処理に代わるものであり、特徴点候補数が閾値以上か否かを判定して、蓄積バッファ部への格納制御と蓄積許可フラグFlagの設定を行う。
【0145】
まず、蓄積バッファ部の総数stock_maxをインクリメントする(ステップS54−1)。次に、段階LEVの特徴点候補数ccnt[LEV]をインクリメントする(ステップS54−2)。次に、各段階の特徴点候補数数ccnt[LEV]の和を求める計数値sum_ccntに、ccnt[LEV]を代入する(ステップS54−3)。
【0146】
次に、段階を表す変数kを0に設定する(ステップS54−4)。次に、計数値sum_ccntに、k段階の特徴点候補数を加算する(ステップS54−5)。次に、変数kをインクリメントする(ステップS54−6)。
【0147】
次に、段階LEVよりもパターン観測確率の低い段階の特徴点候補数の加算が終了したか否かを判定する(ステップS54−7)。この判定がNoであればステップS54−5に戻り、Yesであれば、特徴点候補数の和sum_ccntが閾値以上か否かを判定する(ステップS54−8)。
【0148】
ステップS54−8の判定がYesであれば、変数kを次の段階の値に設定する(ステップS54−9)。次に、段階kの蓄積許可フラグFlagを0に設定する(ステップS54−10)。次に、変数kをインクリメントする(ステップS54−11)。
【0149】
次に、パターン観測確率が最も高い段階まで処理したか否かを判定し(ステップS54−12)、判定がNoであればステップS54−10に戻り、判定がYesの場合、あるいはステップS54−8の判定がNoの場合は、図10のステップS55、図13のステップS80または図17のステップS114に移行する。
【0150】
<一致点検出処理>
次に、一致点検出処理について説明する。まずは、2つの画像から抽出された特徴点の情報を利用して一致点を検出する例を説明する。3つ以上の画像間での一致点検出は、そのうちの2つの画像について、まず一致点の検出を行い、その検出結果と、まだ一致点検出を行っていない残りの一つの画像との間で一致点を検出し、その検出結果を利用して、さらに残りの一つの画像との間で一致点検出を行うといった処理を繰り返せばよい。
【0151】
話を戻して、2つの画像間での一致点の検出処理について説明する。ここで、画像Aから得られた特徴点パターン情報をpatInfoA、画像Bから得られた特徴点パターン情報をpatInfoBとする。
【0152】
特徴点パターン情報patInfoAに、複数の特徴点に関するパターン情報が格納されている場合には、その一つ一つのパターンに対応するパターン番号を、特徴点パターン情報patInfoBに格納されているすべての特徴点パターン情報のパターン番号と照合し、共通して含まれるパターン番号と、そのパターン位置とを抽出する。
【0153】
ここで、特徴点パターン情報patInfoAから抽出されたパターン位置をa、特徴点パターン情報patInfoBから抽出されたパターン位置をbとすると、画像Aでは位置aに写っていたものが画像Bでは位置bに写っていたことになる。
【0154】
このようにして、共通するパターン番号を持つ特徴点パターン情報をすべて抽出することにより、画像AとBの間での対応する位置情報を複数得ることができる。もちろん、場合によっては、一つしか得られない場合や、一つも得られない場合もあり得る。
【0155】
一致点検出部14は、上記の処理手順で図27のような一致点情報を検出する。図27の一致点情報は、パターン番号pat_idと、画像Aの位置xの値x0と、同画像Aの位置yの値y0と、画像Bの位置xの値x1と、同画像Bの位置yの値y1とを有する。
【0156】
ここで、パターン番号pat_idは、さらに別の画像との間で一致点検出を行う場合には必要となるが、2つの画像間での一致点検出だけを行うのであれば、必ずしも必要ない。
【0157】
図28は一致点検出部14が行う一致点検出処理の一例を示すフローチャートである。まず、画像Aに対して、上述した第1、第2または第3の特徴点抽出処理を行って得た特徴点パターン情報patInfoAを取得する(ステップS191)。同様に、画像Bに対しても特徴点パターン情報patInfoBを取得する(ステップS192)。
【0158】
次に、特徴点パターン情報patInfoA上の位置を表す変数iと、一致点の数を表す変数kをともに0に初期化する(ステップS193)。同様に、特徴点パターン情報patInfoB上の位置を表す変数jを0に初期化する(ステップS194)。
【0159】
次に、i番目の特徴点パターン情報patInfoAのパターン番号と、j番目の特徴点パターン情報patInfoBのパターン番号とが一致するか否かを判定する(ステップS195)。両者が一致しない場合は、変数jをインクリメントする(ステップS196)。変数jが特徴点パターン情報patInfoBの総数に達したか否かを判定する(ステップS197)。達しなかった場合はステップS195以降の処理を行い、達した場合は変数iをインクリメントする(ステップS198)。
【0160】
変数iは特徴点パターン情報patInfoAの総数に達したか否かを判定する(ステップS199)。達していなければステップS194以降の処理を行い、達した場合は処理を終わる。
【0161】
一方、ステップS195で両者のパターン番号が一致したと判定されると、図27のような一致点情報を追加する(ステップS200)。次に、一致点情報の数を表す変数kをインクリメントし(ステップS201)、ステップS198以降の処理を行う。
【0162】
<画像の移動、回転、拡縮>
一致点検出部14により検出された一致点情報は、種々の目的で利用できるが、ここでは、2つの画像A,B間の一致点検出情報に基づいて、画像Aが画像Bに近づくように、画像Aの移動、回転および拡縮の少なくとも一つの処理を行う例を説明する。
【0163】
画像A中の座標(x, y)に対して何らかの座標変換を行った後の座標を(x', y')とする。
【0164】
例えば、座標(x, y)を移動量dx, dyで平行移動した後の座標(x', y')は、以下の(6)式で表される。この(6)式では、変換元の二次元座標に、z=1を補って3次元のベクトルとして、3×3の行列Gを用いて変換を行う。
【数1】
【0165】
座標(x, y)を原点の回りにθ度回転させた後の座標(x', y')は、以下の(7)式で表される。
【数2】
【0166】
座標(x, y)を原点を不動点とする拡縮率fで拡縮した後の座標(x', y')は、以下の(8)式で表される。
【数3】
【0167】
上述した(6)〜(8)式を組み合わせた変換式は、以下の(9)式で表される。
【数4】
【0168】
上記(9)式の右辺の3×3行列を3つ乗算して得られる行列Gは、移動、回転および拡縮の処理をまとめて実施するものである。
【0169】
ここで、p=(x, y)からq=(x', y')の変換をgとしたときに、q=g(p)と表すことにする。
【0170】
ここで、一致点検出部14で検出された一致点情報のn番目の画像A上の位置をAn、画像B上の対応位置をBnとすると、
B0=g(A0)
B1=g(A1)
…
Bn=g(An)
となる変換gを求めれば、変換gの具体的内容である移動量dx, dyや、回転角度θ、拡縮率fを検出できる。
【0171】
あるいは、ベクトルvの長さの二乗をLen2(v)と表記する。このLen2(v)は、ベクトルv同士の内積により算出可能である。このLen2(v)を用いると、画像Aの位置と対応する画像Bの位置の距離の二乗和は、以下の(10)式で表される。
Len2(B0−g(A0))+Len2(B1−g(A1))+…+Len2(Bn−g(An)) …(10)
【0172】
(10)式が小さくなるように、変換gの移動量dx, dyと、回転角度θと、拡縮率fとを求めれば、移動量、回転量および拡縮率を算出できる。
(10)式の計算は、いわゆる収束計算によって行えばよい。
【0173】
あるいは、行列Gの代わりに、下記のような行列Hを用いて処理を行う方法もある。
【0174】
変換後の位置B0=H*変換元の位置A0
変換後の位置B1=H*変換元の位置A1
…
変換後の位置Bn=H*変換元の位置An …(11)
【0175】
上記(11)式は、変換前の位置0、1、…、nを列ベクトルに持つ3行n+1列の行列Aに行列Hを乗算して、変換後の位置0、1、…、nを列ベクトルに持つ3行n+1列の行列Bを得るものであり、B=H*Aで表すことができる。
【0176】
通常、逆行列とは、正方行列のみに存在するが、正方でないn+1行3列の行列Ainvが、A*Ainv=3×3の単位行列となるとき、Ainvは疑似逆行列と呼ばれる。
【0177】
このAinvを、上述したB=H*Aの両辺に左側から掛け合わせると、以下の(12)式が得られる。
B*Ainv=H*A*Ainv …(12)
A*Ainvは単位行列であるため、上記(12)式は(13)式のように変換される。
B*Ainv=H*単位行列=H …(13)
【0178】
この(13)式により、行列Hが確定する。行列Hにより行われる変換は、移動、回転、拡縮のみならず、より複雑な変換をも含む。Hによる変換は、上述したように、2次元座標を3次元のz=1面に置き換えて空間一次変換を行うすべての自由度を含む変換である。この行列Hによる画像変換を行い、その結果に基づいて行列Hが求まってしまえば、移動、回転、拡縮、その他のすべての自由度を含む変換を行える。
【0179】
移動、回転、拡縮以外の変換としては、例えば、正方形を平行四辺形にするような変換や、縦と横で異なる倍率の拡縮なども行うことができる。これにより、例えば被写体が回転している方向だけに拡縮を行う場合に対しても追従でき、処理能力が許せば、行列Hを用いた手法の方が望ましいかもしれない。この場合は、Gを計算する必要はなくなる。
【0180】
一方、移動、回転、拡縮等の既存の画像処理系を利用する場合は、上述したように、行列Gの移動量dx, dy、回転角度θおよび拡縮率fを求めればよい。また、移動量dx, dy、回転角度θおよび拡縮率fのうち、少なくとも一つを処理するように設計してもよい。
【0181】
3つ以上の画像について、移動、回転または拡縮を行う場合も同様の手順で行列GまたはHを求めればよい。例えば、画像A,Bの他に画像Cがあり、画像C上の位置をC0〜Cnで表記する場合、上述した(10)式の代わりに、以下の(14)式を求める。
【0182】
Len2(B0−g(A0))+Len2(C0−g(A0))+Len2(B1−g(A1))+Len2(C1−g(A1))+…+Len2(Bn−g(An))+Len2(Cn−g(An)) …(14)
上記(14)式により、変換後の画像Aと、画像BおよびCとの一致点の距離の二乗の和を小さくするようにすれば、画像BとCの平均的な位置に画像Aを合わせることになる。さらに、画像Dとの一致点も処理すると、画像Aを画像B,C,Dの平均的な位置に合わせることになる。この性質を利用すると、デジタルビデオカメラの手ぶれ補正処理に応用することができる。
【0183】
図29は上述した一致点検出情報に基づく画像変換の手法を模式的に示す図である。図29では、3つのコマ画像A,B,Cの一致点を合わせて、一致点の位置が重なり合うように画像変換を行う例を示している。例えば、コマ画像A,B,C中のりんごの部分が一致点として検出されたとする。この場合、上述した行列GまたはHを用いて、画像変換が行われる。その後、画像変換後の3つのコマ画像中の一致点同士が重なり合うように画像合成が行われる。
【0184】
本実施形態をビデオカメラに適用する場合、各コマ(フレームまたはフィールド)画像に対して上述した第1、第2または第3の特徴点抽出処理を行い、最近の数コマ(例えば2〜60コマ程度)を参照コマとして、直前のコマを処理対象とする。
【0185】
上述した(14)式が小さくなるように処理を行うと、参照コマに対する平均的な位置に、処理対象コマが合致または近づくように変換が行われ、手ぶれによる画像の移動回転拡縮が平滑化されることになる。このことは、例えばフレームレートが30コマ/秒のカメラで最近の30コマを参照コマとして実行した場合、1秒分の動きが平滑化された映像に対して合わせられることを意味する。すなわち、細かな振動を画像から取り除くことになり、手ぶれまたは被写体ブレを緩和することができる。
【0186】
なお、参照コマから一致点検出を行う場合、特徴点パターン情報だけを保持しておけばよく、画像データ自体を保持する必要はない点でも本実施形態は優れている。例えば、参照コマ数が多いほど瞬間的な移動によるブレは平滑化されることになり、60コマ程度に増やした場合でも、画像そのものを保持しておく必要はなく、メモリ消費も少なくて実装が容易である。
【0187】
従来のコマ間での移動情報(フレーム間差分による移動情報)を積算しながら処理する方式では、画像同士を比較するために、最近の画像と直前の画像とを比較するのが精一杯であり、フレーム間差分を最小化するように移動量などを計算していた。本実施形態によれば、誤差の蓄積を防止できるだけでなく、時間的に離れた複数のコマとの比較も行うため、検出精度が極めて高くなる。
【0188】
この結果、本実施形態によれば、手ぶれ補正効果が大きくなり、誤動作も少なくなる。また、移動だけでなく、カメラの傾き(回転)や前後またはズーム(拡縮)ブレも緩和できる。
【0189】
上述した手法により複数の画像の一致点検出と画像変換を行うことで、同一画素位置に同一の物体が写されるように変換することができる。このような画像変換処理を行うことで、種々の利点が得られる。
【0190】
一つには、ノイズの低減効果である。ランダムノイズは、不規則に発生するために低減が難しいノイズであるが、不規則に発生する性質を利用すると、複数の画像を重ね合わせることで、低減が可能である。このとき、画像を重ね合わせる手法には種々のものがあるが、以下では、平均化と中間値を算出する手法を説明する。
【0191】
画像変換された複数画像の同一画素位置を平均化して得られる画像は、同一の物体が同一の画像位置に写っているため、平均化によりその物体から得られる信号Sは変化しない。一方、ノイズは不規則であるため、平均化する画素数に応じて低減される。したがって、画像変換された複数画像を合成する場合は、平均化した画素数に応じてS/Nが向上し、ノイズを低減することができる。
【0192】
一方、ランダムノイズは不規則であり、正規分布することが予めわかっている。このため、画像変換された複数画像を合成する際に、中間値を用いることによってもノイズを低減できる。この場合、周辺の画素ではなく、複数画素の合成に応用しているため、中間値フィルタをかけた場合によく見られるように、画像のヌメヌメ感は発生するおそれはない。
【0193】
なお、上述した平均化の際に、必要に応じて重み付けを行ってもよい。以下では、重み付けの一例を説明する。
【0194】
露出を変えながら撮影された一連の画像を合成すると、ノイズを低減できる他に、ダイナミックレンジを拡大できるという効果がある。
【0195】
明るく撮影された画像の方がノイズが少ないため、平均時の重みを大きくし、暗く撮影されている画像では重みを小さくする。ただし、明るい画像中で色または輝度が飽和している部分は白とびが発生しているため、重みを0にする。
【0196】
輝度が次第に明るくなって、飽和に至るまでのグラデーション領域で、急激な重みの変化が発生することで違和感が出ないように、飽和点手前から徐々に重みを下げていく。
【0197】
このような重み付けを行うには、ピクセル値の大きさに応じて重みが増し、飽和点の手前から重みが減少し、飽和点で0になるような関数によって重みを算出するのが望ましい。この種の関数の具体的な実装例として、最も処理量が小さく、かつ自由度の高いものは、ルックアップテーブルである。
【0198】
図30はルックアップテーブル(以下、LUT)をグラフ化した一例を示す図である。図30では、画素値を0〜255とし、重みの範囲も0〜255としている。R,G,Bの各色ごとに、個別あるいは共通のLUTを引いて、画素値に対応する重みを設定すればよい。
【0199】
図31は重み付けの一例を模式的に説明する図である。図31は図29で画像変換した後の3つのコマ画像のそれぞれに重み付けを行う例を示している。コマ画像中の特定画素位置について、コマ画像ごとに別個の重み付けを行う。例えば、コマ画像Aの特定画素位置の画素値が130の場合、LUTを引くことにより、重み200を取得する。同様に、コマ画像Bの特定画素位置の画素値が120であれば重み190を取得し、コマ画像Cの特定画素位置の画素値が125であれば重み195を取得する。そして、以下の(15)式により、合成画素値を算出する。
【数5】
【0200】
本実施形態をデジタルスチルカメラに適用すれば、露出違いで撮影された一連の画像からダイナミックレンジが広くて、かつ階調性が豊かで、ノイズも少ない画像を記録することができる。
【0201】
図32は露出を変えながら撮影した3枚のコマ画像A,B,Cの重み付けの一例を模式的に説明する図である。コマ画像A,B,Cの順に露出が低くなっているものとする。コマ画像A,Bは露出が高いため、一部が白飛びしている。白飛びしている画素領域(画素値=255)は重みが0に設定され、この画素領域については、白飛びしていないコマ画像Cは0でないので、合成結果はCの画像データが使われる。
【0202】
コマ画像Cは一部が黒つぶれしている。黒つぶれした画素領域は、黒つぶれしていないコマ画像AまたはBの重みよりも小さく設定されるため、結果Aが優先され、B,Cの順に低い重みで合成される。
【0203】
なお、上述した重みづけは他の画像には依存しないため、一連の映像を同時に参照せずに重みを決定でき、必要に応じて逐次重み付けを行いながら合成画像を蓄積することができる。これにより同時に必要な作業用メモリ量を削減できる。
【0204】
例えば、作業用メモリには、画素数分の画素の合計値SumR, SumG, SumB と重みの合計値 SumFact を格納し、0に初期化しておく。先の変換処理によって変換済みの映像が入力されたら各画素値から重み(Fact)を算出して、R画素値と重みFactの乗算値をSumRに足しこむ、同様に、G画素値と重みFactの乗算値をSumGに足しこむ。同様に、B画素値と重みFactをSumBに足しこむ。SumFact には Fact を足しこむ。
【0205】
このようにして、一連の画像のすべてのピクセルの足しこみ処理が完了したら、各画素の SumR, SumG, SumB を SumFact で除算して、平均化された画素値が得られる。
【0206】
なお、ここで SumFact で除算する代わりに、例えば SumFact/4 で除算すると、画像合成前の画像よりも4倍大きな画素値が得られる。例えば、4枚の画像を合成している場合には、4倍程度階調性が増しているので、4倍大きな画素値を取り出すことで、豊かな階調を得ることもできる。
【0207】
本実施形態の他の応用は、ピント位置を変化させながら撮影された一連の画像から、できるだけ広い範囲にピントがあった画像を生成することである。これもまた、画素毎に設定された重みによる加重平均を利用する。
【0208】
このとき、ピントが合っている箇所ほど大きな重みとなり、ピントが合っていない箇所ほど重みが小さくなるように重みづけされて平均化すれば良い。これにもさまざまな手法が考えられるが、以下では、高い周波数が含まれている部分ほどピントが合っていると判断し、大きな重みを設定する例を説明する。
【0209】
処理対象画像に対して、(15)式の行列で表される高周波検出フィルタを通すと、高周波が多く含まれている部分ほど大きな値が算出される。
【数6】
【0210】
算出された値の絶対値または、2乗値を重みとすれば良い。この際、カラー画像であっても、R,G,Bごとに別個に処理を行う必要はなく、予めR,G,Bから輝度(例えば、輝度Y=(3R+6G+B)/10)を求めてからフィルタリングすると、全体の処理量が小さくなり有利である。
【0211】
なお、このフィルタリングは、あくまでも重みの算出のためのものであるから、ここでの輝度の計算は厳密である必要はない。処理量を少なくしたい場合には、さらに計算を簡略化しても構わない。(例:Y=(R+2G+B)/4)
図33はピント位置に合わせて重みを調整する手法を模式的に示す図である。コマ画像Aは人間にピントが合っており、コマ画像Bは木にピントが合っており、コマ画像Cは山にピントが合っているものとする。したがって、人間の写っている画素領域では、コマ画像Aの重みが大きくなり、木が写っている画素領域では、コマ画像Bの重みが大きくなり、山が写っている画素領域では、コマ画像Cの重みが大きくなる。
【0212】
これにより、近くから遠くまで全体的にピントが合った画像が得られる。
【0213】
上述したように、本実施形態によれば、少ない演算量かつ高速に精度の高い一致点を大量に検出することが可能であり、従来の方法の欠点である演算量という問題点を克服できる。局部的な画素値の相対的な大小関係を許容値(閾値)を考慮するため、画像のさまざまなノイズ(ランダムノイズ、圧縮時のブロックノイズやモスキートノイズ)だけでなく、画像の傾きや拡縮(像倍率の変化)に対しても寛容であり、画像1の位置aは、画像2の位置bに対応するというようなベクトル情報を複数提供でき、平行移動だけでなく、回転や拡縮も検出でき、さらには、上述した特許文献3による3次元カメラベクトルを特定してさらに高度なブレ補正を行う用途にも応用可能である。また、高速であるが故に、1対複数画像での一致点検出や、複数対複数の一致点検出も短時間に終わらせることが可能であり、結果より多くの一致検出結果を得ることができ、さらには一致点検出の精度向上が見込める。
【0214】
本実施形態を応用することで、上述した一致点検出機能を持つ画像処理装置、デジタルスチルカメラおよびデジタルビデオカメラ等を提供することができるが、本実施形態の適用範囲はこれだけに留まらない。本実施形態では、処理量を増大させることなく、数多くの一致点を検出できるため、動画映像から動くものだけを発見する場合においても、より小さな移動体を検出できたり、精度が高いことから、それを追跡する場合においても有利である。対象物の動きに追従してズーミングしたり、車に搭載されたビデオカメラからの画像を処理して、近づく人間や物体を警告したり、入って来た人を追いかける監視カメラなど、応用範囲は広範囲に及ぶ。
【0215】
すなわち、本実施形態は、複数の画像から、精度の高い一致点を高速かつ少ない演算量で検出できるため、本実施形態を利用すれば、種々の特徴を持つ応用製品を生み出せる。
【0216】
本発明の態様は、上述した個々の実施形態に限定されるものではなく、当業者が想到しうる種々の変形も含むものであり、本発明の効果も上述した内容に限定されない。すなわち、特許請求の範囲に規定された内容およびその均等物から導き出される本発明の概念的な思想と趣旨を逸脱しない範囲で種々の追加、変更および部分的削除が可能である。
【0217】
上述した実施形態で説明した画像一致点検出装置の少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、画像一致点検出装置の少なくとも一部の機能を実現するプログラムをフレキシブルディスクやCD−ROM等の記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスク等の着脱可能なものに限定されず、ハードディスク装置やメモリなどの固定型の記録媒体でもよい。
【0218】
また、画像一致点検出装置の少なくとも一部の機能を実現するプログラムを、インターネット等の通信回線(無線通信も含む)を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネット等の有線回線や無線回線を介して、あるいは記録媒体に収納して頒布してもよい。
【符号の説明】
【0219】
1 撮像素子
2 A/D変換器
3 画像処理回路
4 符号化装置
10 画像一致点検出装置
11 パターン検出部
12 パターン蓄積部
13 特徴点抽出部
14 一致点検出部
15 パターン確率算出部
【技術分野】
【0001】
本発明は、複数のビットマップ画像に含まれる画像の一致点情報を検出する画像一致点検出装置に関する。
【背景技術】
【0002】
従来の画像一致点検出手法は、多くの画素値に対してSAD(絶対差分和:Sum Absolute Difference)などの演算を行い、画像の差分が小さくなる点を探して画像の一致を検出している(特許文献1参照)。
【0003】
ところが、SADでは、複数の画素値同士を直接比較する必要があり、一つの一致点を見つけ出すだけでも多くの画素値同士を比較しなければならず、演算量が膨大になるという問題がある。
【0004】
このため、画像を縮小して解像度を下げることで比較するデータ量を減らし、徐々に解像度を上げて一致探索するような手法が考案されている(特許文献2参照)。ところが、特許文献2の手法でも、画像値同士の比較を行う必要があり、演算量を大幅に減らすのは困難である。また、周期パターンでの誤検出やノイズの問題などもあり、一致点検出の精度が低いのが現状である。さらに、カメラの傾きによる画像の回転や、カメラの前後方向の移動やズームによる拡縮までを考慮に入れようとすると、さらに比較回路が増えて演算量が増大する。
【0005】
一方、特許文献3には、所定数の特徴点を自動抽出して、画像のカメラの揺れに起因するブレを補正する手法が開示されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2008−39491号公報
【特許文献2】特開平10−136304号公報
【特許文献3】特開2005−295495号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
一致点(特徴点)を数多く抽出するほど、カメラの移動やブレを正確に特定することができるが、多くの一致点を検出することは演算量を増大させてしまう。したがって、コストやサイズが増大したりして利用できる用途が限定されるか、あるいは追従できるカメラや被写体の動きの範囲を限定せざるを得ないのが現状である。
【0008】
また、一致点を検出する処理に先だって、ノイズ除去処理や被写体の明るさの変化なども考慮に入れなければ実用にならないため、RRF(Radical Reach Filter)などを使用するなどの工夫を行う必要があり、さらなる演算量の増加を招く。
【0009】
本発明は、上述した課題に鑑みてなされたものであり、その目的は、簡易な処理手順で正確かつ高速に画像の一致点検出を行う画像一致点検出装置、画像一致点検出方法および記録媒体を提供することにある。
【課題を解決するための手段】
【0010】
上記の課題を解決するために、本発明の一態様によれば、複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表現する数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出するパターン検出部と、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納するパターン蓄積部と、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出する特徴点抽出部と、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を含む複数の前記パターン情報を一致点情報として検出する一致点検出部と、を備えることを特徴とする画像一致点検出装置が提供される。
【発明の効果】
【0011】
本発明によれば簡易な処理手順で正確かつ高速に画像の一致点検出を行うことができる。
【図面の簡単な説明】
【0012】
【図1】本発明の一実施形態に係る画像一致点検出装置を備えたビデオカメラの概略構成を示すブロック図。
【図2】画像一致点検出装置10の内部構成の一例を示すブロック図。
【図3】パターン検出部11が行う前処理の一例を示すフローチャート。
【図4】パターン番号素の検出に利用される4画素の位置の一例を示す図。
【図5】2値画像が入力された場合の前処理の一例を示すフローチャート。
【図6】画素ブロックの一例を示す図。
【図7】パターン番号生成処理の一例を示すフローチャート。
【図8】第1のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図9】パターン蓄積部12が行う第1のパターン蓄積処理の一例を示すフローチャート。
【図10】図9に続くフローチャート。
【図11】第2のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図12】パターン蓄積部12が行う第2のパターン蓄積処理の一例を示すフローチャート。
【図13】図12に続くフローチャート。
【図14】図13に続くフローチャート。
【図15】第3のパターン蓄積処理における蓄積バッファのデータ構造を示す図。
【図16】パターン蓄積部12が行う第3のパターン蓄積処理の一例を示すフローチャート。
【図17】図16に続くフローチャート。
【図18】図17に続くフローチャート。
【図19】第1の特徴点抽出処理における特徴点バッファのデータ構造を示す図。
【図20】第1の特徴点抽出処理の一例を示すフローチャート。
【図21】第2の特徴点抽出処理の一例を示すフローチャート。
【図22】第3の特徴点抽出処理の一例を示すフローチャート。
【図23】パターン画像の観測確率の予測処理を行うパターン確率算出部15を備えた画像一致点検出装置10の内部構成の一例を示すブロック図。
【図24】パターン番号素と観測確率との対応関係を示すテーブルの一例を示す図。
【図25】パターン確率算出部15が行う処理の一例を示すフローチャート。
【図26A】蓄積制御処理の一例を示すフローチャート。
【図26B】図26Aに続くフローチャート。
【図26C】図26Bに続くフローチャート。
【図26D】図26Cに続くフローチャート。
【図26E】図26Dに続くフローチャート。
【図27】一致点情報のデータ構造を示す図。
【図28】一致点検出部14が行う一致点検出処理の一例を示すフローチャート。
【図29】一致点検出情報に基づく画像変換の手法を模式的に示す図。
【図30】LUTをグラフ化した一例を示す図。
【図31】図29で画像変換した後の3つのコマ画像のそれぞれに重み付けを行う例を示す図。
【図32】露出を変えながら撮影した3枚のコマ画像A,B,Cの重み付けの一例を模式的に説明する図。
【図33】ピント位置に合わせて重みを調整する手法を模式的に示す図。
【発明を実施するための形態】
【0013】
以下、図面を参照しながら、本発明の実施形態について詳細に説明する。
【0014】
(本実施形態の基本原理)
まず、本実施形態による画像一致点検出の基本原理を説明する。本実施形態によれば、複数のビットマップ画像から一致点を見つける際に、ビットマップ画像を構成する画素値同士を直接比較する必要がない。本実施形態では、各々のビットマップ画像から抽出された特徴点パターン情報のみを比較して一致点を検出する。このため、画像を構成する画素の画素値または、画素値をフィルタリング演算した結果同士を比較するのに比べて、圧倒的に少ない処理量で一致点検出を行える。
【0015】
本実施形態の基本原理の理解を助けるために例えを紹介する。例えば、人間にリンゴが写真内の右側に写っているものと、左側に写っているものを順に見せると、瞬時にリンゴが右から左に移ったことが認識される。人間は画素の集合体であるビットマップの比較を行わずして、これを達成している。このとき、リンゴがどのにあったかという非常に少ない情報だけを覚えている。本実施形態の手法はこれに似ている。本実施形態によれば、右側にリンゴが写っている最初の写真から、リンゴの表面や輪郭だけに含まれている特徴点の相対的な大小関係を表すパターン番号とパターン位置(座標)を抽出し、左側にリンゴが写っている写真からも同様の情報を抽出する。そして、これらの2種類の情報を比較することで、同一の特徴を持つ位置を抽出して、一致点として決定する。
【0016】
ここでもし、リンゴが大量に写っている写真を人間に見せた場合を想定すると、人間は、もはやリンゴの位置を記憶するのは得策ではないと判断し、代わりにその絵の特徴的な部分を記憶する。本実施形態による手法は、まさにこれに似た動作を行う。
【0017】
本実施形態が特徴的なのは、複雑な画像の画素情報の相対的な大小関係をパターン番号という単なる1つの数値に置き換えてしまうユニークなパターン検出手法を採用することである。そしてもう一つの特徴は、これらの数値を画像の多くの場所から検出したのち、その画像(または検出対象領域)にたった1箇所しかないパターン番号を抽出して特徴点とする特徴点抽出手法を採用することである。複数の数値からたった1回しか現れなかった数値を抜き出すのはたやすいことである。なお、実際には、複数回現れたパターンであっても、その範囲が狭い範囲にとどまっている場合には1箇所から検出されたとみなして良い。
【0018】
このような特徴点を抽出することは大きな意味を持つ。画像の中から、特徴的な部分のみを抜き出すことになるためである。先のリンゴの例でいえば、その画像にリンゴが1個しかなければ、リンゴの上の画素から検出されたパターン情報が抽出されることになるし、リンゴが大量に写っているならば、他の特徴的な部分が抽出されることになる。つまり、画像の絵柄に応じて自動的に見つけやすい部分が特定され、その位置を記録するということが行われ、しかもその特徴的な情報は数値(パターン番号)と座標値(パターン位置)の羅列であるため、画像データそのものを比較するのに比べて処理コストが圧倒的に少なくなる。
【0019】
本実施形態は、特徴的な部分が自動的に特定されて抽出される仕組みを持つため、一致点検出処理を高精度で、かつ非常に少ない演算量で実現できる。
【0020】
さらに、本実施形態の変形例として、ビットマップ画像中から検出されたパターン番号から、1箇所にしか検出されなかったパターン番号の抽出を高速化するために、良く現れるパターンを排除して蓄積する工夫を行うことも可能である。
【0021】
本実施形態によれば、画像をたった一度スキャンするだけで、他の画像との一致点を検出するための軽量なデータ(特徴点パターン情報)を収集できる。しかも、ノイズなどの影響を受けにくいため、従来必要であったノイズ除去処理に代表される前処理を行う必要もない。さらに、周期的に同じパターンが続く部分での誤検出が自動的に防止される。このため、デジタルカメラなどに応用する場合には、処理の前段である検波ロジックにこれを組み込むことが可能になり、低コストでリアルタイムに画像の一致点検出を行うことができ、手ぶれ補正をはじめとするさまざまな機能を低コストで実現することが容易になる。
【0022】
(本実施形態の具体的な構成および処理動作)
以下、本実施形態について、より詳細に説明する。図1は本発明の一実施形態に係る画像一致点検出装置を備えたビデオカメラの概略構成を示すブロック図である。図1のビデオカメラは、画像を撮像する撮像素子1と、撮像素子1で撮像した画像をデジタル画素データに変換するA/D変換器2と、デジタル画素データに対して各種画像処理を行う画像処理回路3と、画像処理後のデジタル画素データを符号化する符号化装置4とを備えている。本実施形態に係る画像一致点検出装置10は、画像処理装置の内部に設けられている。この画像処理装置では、上述した検波処理と画像処理を行うものであり、本実施形態に係る画像一致点検出装置10の処理は検波処理の一部として行ってもよいし、画像処理の一部として行ってもよい。
【0023】
図2は画像一致点検出装置10の内部構成の一例を示すブロック図である。図2の画像一致点検出装置10は、パターン検出部11と、パターン蓄積部12と、特徴点抽出部13と、一致点検出部14とを有する。
【0024】
パターン検出部11は、ビットマップ画像(以下、単に画像と呼ぶ)に含まれる画素ブロックごとに、画素ブロックのパターン情報を表すパターン番号を計算して、そのパターン情報の位置(パターン位置)とともに出力する。パターン番号とは、画像中の隣接する複数画素からなる画素ブロックのパターン画像を、画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値(つまり、数値が完全に一致するか不一致かの比較によって、画像の特徴の一致が検出できる性質を持つ数値)で表現したものである。パターン検出部11が出力するパターン番号とパターン位置を組にしたものはパターン情報と呼ばれる。パターン検出部11は、パターン情報を画素ブロックごとに検出する。
【0025】
パターン蓄積部12は、画像に含まれるパターン情報をパターン番号ごとに分類し、パターン番号と、同一のパターン番号の出現回数と、それぞれのパターン番号に対応するパターン位置に関する情報とを蓄積する。
【0026】
特徴点抽出部13は、パターン蓄積部12に蓄積された各種情報を用いて、画像におけるパターン番号の出現回数が1回だけであるパターン情報を特徴点パターン情報として抽出する。
【0027】
一致点検出部14は、複数の画像のそれぞれについて特徴点パターン情報として抽出されたパターン情報のパターン番号が一致しているか否かを判断し、一致しているパターン番号を一致点情報として検出する。
【0028】
パターン検出部11は、まず最初に、パターン番号素を検出する前処理を行う。パターン番号素とは、注目画素を含む周囲複数画素内のエッジの配置パターンを表すビット列信号である。前処理は、入力される画像の種類によって、処理内容が異なる。まずは、カラー画像、ベイヤ画像およびモノクロ多階調画像の場合の処理について説明する。
【0029】
図3はパターン検出部11が行う前処理の一例を示すフローチャートである。この前処理では、まず、カラー画像の場合は、R,G,BまたはC,M,Y等で表される各色の画素値から輝度値を計算してモノクロ多階調画像に変換するか、またはR,G,B,C,M,Yのうちのいずれか1つの色の画素値を抜き出してモノクロ多階調画像に変換する。
【0030】
このとき、撮像素子1がベイヤ配列の場合は、R,GinR,GinB,Bのいずれか、あるいはC,M,Y,Gのいずれかの画素値に基づいて、解像度が縦横ともに半分になったモノクロ多階調画像に変換するか、あるいはデモザイク処理を行って輝度値を計算してモノクロ多階調画像に変換してから処理を行う。
【0031】
撮像素子1がハニカム配列の場合は、正方画素変換後、あるいは奇数ラインか偶数ラインのみを抽出してモノクロ多階調正方画素に変換してから行えばよい。
【0032】
注目画素の画素位置をx,yとして、その画素値をp(x, y)とすると、注目画素と、右、下、斜め右下の4画素値は、p(x, y)、p(x+1, y)、p(x, y+1)、p(x+1, y+1)で表される。図4は、これら4画素の位置の一例を示す図である。これら4画素値の和は以下の(1)で表される。
Sum =p(x, y) + p(x+1, y) + p(x, y+1) + p(x+1, y+1) …(1)
ここで、以下の(2)〜(4)式に基づいて、d、T0、T1を計算する。
d=Sum/16 …(2)
T0=Sum/4−d …(3)
T1=Sum/4+d …(4)
パターン番号素は4ビットのビット列信号であり、以下の基準でビット値が定まる。以下では、パターン番号素をn(x, y)と表す。
p(x, y)がT0以上でT1以下なら、Bit0を0、そうでなければ1とする。
p(x+1, y)がT0以上でT1以下なら、Bit1を0、そうでなければ1とする。
p(x, y+1)がT0以上でT1 以下なら、Bit2を0、そうでなければ1とする。
p(x+1, y+1)がT0以上でT1以下なら、Bit3を0、そうでなければ1とする。
【0033】
以下、前処理の具体的な処理手順を図3を用いて順に説明する。まず、上記(1)式に従って、注目画素を含む周囲4画素の画素値の和を計算する(ステップS1)。次に、(2)式に従って許容度(allowance)dを計算する(ステップS2)。次に、(3)式に従って下側閾値T0を計算する(ステップS3)。次に、(4)式に従って上側閾値T1を計算する(ステップS4)。
【0034】
次に、注目画素値p(x, y)が下側閾値T0と上側閾値T1の範囲内にあるか否かを判定する(ステップS5)上記範囲外の場合は、パターン番号素の最下位ビットBit0を1に設定する(ステップS6)。なお、パターン番号素nは、初期状態では0とする。
【0035】
次に、注目画素の右隣の画素値p(x+1, y)が上記範囲内にあるか否かを判定する(ステップS7)。上記範囲外の場合は、パターン番号素のBit1を1に設定する(ステップS8)。
【0036】
ステップS7で上記範囲内と判定された場合、またはステップS8の処理が終わった場合は、注目画素の下隣の画素値p(x, y+1)が上記範囲内にあるか否かを判定する(ステップS9)。上記範囲外の場合は、パターン番号素のBit2を1に設定する(ステップS10)。
【0037】
ステップS9で上記範囲内と判定された場合、またはステップS10の処理が終わった場合は、注目画素の斜め右下の画素値p(x+1, y+1)が上記範囲内にあるか否かを判定する(ステップS11)。上記範囲外の場合は、パターン番号素のBit3を1に設定する(ステップS12)。以上で、図3の処理は終了する。
【0038】
次に、パターン検出部11に入力される画像が2値画像の場合の前処理について説明する。この前処理では、p(x, y)が0か、それ以外(通常は1)の2つの値しか取らないため、以下のようにパターン番号素n(x, y)を設定する。
p(x, y)が0ならば、Bit0を0、そうでなければ1とする。
p(x+1, y) が0ならば、Bit1を0、そうでなければ1とする。
p(x, y+1) が0ならば、Bit2を0、そうでなければ1とする。
p(x+1, y+1)が0ならば、Bit3を0、そうでなければ1とする。
【0039】
図5は2値画像が入力された場合の前処理の一例を示すフローチャートである。まず、p(x, y)が0か否かを判定し(ステップS21)、0でなければパターン番号素のBit0を1に設定する(ステップS22)。なお、パターン番号素nは、初期状態では0とする。
【0040】
ステップS21で0と判定された場合、またはステップS22の処理が終わると、p(x+1, y)が0か否かを判定し(ステップS23)、0でなければパターン番号素のBit1を1に設定する(ステップS24)。
【0041】
ステップS23で0と判定された場合、またはステップS24の処理が終わると、p(x, y+1)が0か否かを判定し(ステップS25)、0でなければパターン番号素のBit2を1に設定する(ステップS26)。
【0042】
ステップS25で0と判定された場合、またはステップS26の処理が終わると、p(x+1, y+1)が0か否かを判定し(ステップS27)、0でなければパターン番号素のBit3を1に設定する(ステップS28)。以上で、図5の処理は終了する。
【0043】
パターン検出部11は、図3または図5の前処理が終わると、パターン番号生成処理を行う。パターン番号生成処理では、処理対象のパターン番号素n(x,y)を中心とする周囲3×3個のパターン番号素(以下、画素ブロック)のビットパターンの種類を表すパターン番号を生成する。
【0044】
図6は画素ブロックの一例を示す図である。画素ブロック内の計9個のパターン番号素は、n(x-2, y-2)、n(x, y-2)、n(x+2, y-2)、n(x-2, y)、n(x, y)、n(x+2, y)、n(x-2, y+2)、n(x, y+2)、n(x+2, y+2)である。各パターン番号素は4ビットで表され、これら4ビットのパターン番号素を9個並べた計36ビットのビット列がパターン番号となる。パターン番号は、以下の式で表される。
パターン番号=n(x-2, y-2) ×232+n(x, y-2) ×228+n(x+2, y-2) ×224
+n(x-2, y)×220+n(x, y)×216+n(x+2, y)×212+n(x-2, y+2) ×28
+n(x, y+2) ×24+n(x+2, y+2) …(5)
(5)式からわかるように、パターン番号は0から236−1までの値を取る。
【0045】
パターン検出部11は、(5)式で表されるパターン番号と、このパターン番号の画素ブロックの画像中の位置を示すパターン位置とを組にしたパターン情報を生成する。このパターン情報はパターン蓄積部12に送られる。
【0046】
図7は上述したパターン番号生成処理の一例を示すフローチャートである。まず、(x-2, y-2)位置のパターン番号素n(x-2, y-2)をpat_idに入力する(ステップS31)。次に、pat_idを左に4ビットシフトし、(x, y-2)位置のパターン番号素を加算する(ステップS32)。次に、pat_idを左に4ビットシフトし、(x+2, y-2)位置のパターン番号素を加算する(ステップS33)。次に、pat_idを左に4ビットシフトし、(x-2, y)位置のパターン番号素を加算する(ステップS34)。次に、pat_idを左に4ビットシフトし、(x, y)位置のパターン番号素を加算する(ステップS35)。次に、pat_idを左に4ビットシフトし、(x+2, y)位置のパターン番号素を加算する(ステップS36)。次に、pat_idを左に4ビットシフトし、(x-2, y+2)位置のパターン番号素を加算する(ステップS37)。次に、pat_idを左に4ビットシフトし、(x, y+2)位置のパターン番号素を加算する(ステップS38)。次に、pat_idを左に4ビットシフトし、(x+2, y+2)位置のパターン番号素を加算する(ステップS39)。
【0047】
以上で、パターン検出部11の処理動作の概略説明は終りであるが、一つの画素ブロックから複数種類のパターン情報を生成してもよい。この場合、複数種類の前処理部を設けて、それぞれの前処理部が互いに異なるパターン番号素を生成するようにする必要がある。
【0048】
例えば、上述した(2)式のdを、d=Sum/8としてパターン番号素を生成する処理を追加で行えば、同一の画像でありながら、生成されるパターン番号素を複数種類設けることができ、結果として、パターン番号も変えることができ、複数種類のパターン情報を生成することができる。
【0049】
上述したdを変えるということは、画像の中にエッジ情報が含まれるかどうかの判断基準を変えることであり、例えばdを大きくすることは、エッジとみなす輝度の差のスレッショルドが大きくなるため、よりはっきりしたエッジのみがパターン番号のビットに反映されることになり、結果ノイズの影響を受けにくくなるため、ノイズの多い画像においては、一致点検出の精度の向上につながる。
【0050】
このように、複数の許容度(閾値)dのそれぞれごとに、パターン番号と、同一のパターン番号の出現回数とそれぞれのパターン番号に対応するパターン位置に関する情報とを蓄積することで、どのような画像に対しても、良好な一致点検出結果が得られる。
【0051】
例えば、ノイズが多い高感度撮影された映像の場合は、dを小さくすると、ノイズに反応してしまうため、dは大きくするのが望ましい。ところが、単にdを大きくしただけだと、ノイズは少ないがエッジがはっきりしない画像では、エッジを正しく検出できないおそれがある。この2つの要求を満足させるためには、同一画像に対して、dを小さくして得られたパターン番号とdを大きくして得られたパターン番号をともに重複しないで二種類設ければよい。例えば、dを小さくした場合のパターン番号を0〜236−1の範囲内の数値とし、dを大きくした場合のパターン番号を236〜237−1の範囲内の数値とする。これにより、両者のパターン番号は重複しなくなり、同一画像について、二種類の異なる基準で二種類のパターン番号を生成できる。これにより、例えばノイズの影響を受けにくくなり、かつ不鮮明なエッジでも確実に検出できるようになる。
【0052】
上述した例では、dの大きさを変えることで、二種類の重複しないパターン番号を生成したが、全く異なるアルゴリズムで複数種類のパターン番号を重複しないように生成してもよい。これらの異なるアルゴリズムで生成された複数種類のパターン番号を用いて一致点検出を行うことで、個々のアルゴリズムで生成したパターン番号を用いて一致点検出を行った場合に得られる効果を組み合わせた効果が得られる。
【0053】
上述したように、パターン検出部11は、3×3個のパターン番号素を含む画素ブロックを単位としてパターン検出処理を行うが、各パターン番号素は周囲の4画素のエッジ情報を考慮に入れた4ビットのビット列であり、結局、本実施形態では、縦6画素×横6画素の画素ブロックを単位としてパターン検出処理を行うことになる。
【0054】
パターン検出部11が一つの画素ブロックの処理が終了すると、次の画素ブロックのパターン検出処理を行うことになる。この場合、画素ブロックを画素単位でずらして新たな画素ブロックを設定するのが望ましいが、処理の簡略化と高速化の観点で、画素ブロック同士が重なり合わないように新たな画素ブロックを設定してもよい。
【0055】
ただし、画像中のある物体が1画素だけ移動した場合を考えると、1画素単位で画素ブロックをずらしながらパターン検出処理を行わないと、その物体の移動を正しく検出できなくなる。したがって、画素ブロックの設定単位を間引く場合は、ローパスフィルタ処理等の何らかの画像処理を前段に設けるのが望ましい。
【0056】
なお、パターン番号素は必ずしも4ビットのビット列である必要はないし、周辺の計4画素以外の画素情報を用いてパターン番号素を検出してもよい。また、パターン番号を検出する単位となる画素ブロックのサイズも、必ずしも3×3画素サイズには限定されない。
【0057】
<第1のパターン蓄積処理>
次に、パターン蓄積部12の処理動作を説明する。パターン蓄積部12は、パターン検出部11で検出されたパターン番号の数分の蓄積バッファ(不図示)を有する。図8は第1のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。蓄積バッファは、パターン番号pat_idと、パターン位置x, yと、同じパターン番号のパターン情報を蓄積した回数を示す計数値cntとを格納する。
【0058】
個々の蓄積バッファの計数値cntは、パターン情報の蓄積を開始する前に0に初期化される。蓄積バッファにパターン情報を格納する際には、同じパターン番号のパターン情報がすでに格納されているか否かを確認する。この確認処理は、計数値cntが0か否かで判断する。すでに格納されている場合、すなわち計数値cntが0以外の場合は、計数値cntをインクリメントする。なお、本明細書では、1だけ数を増やすことを単に「インクリメントする」と呼ぶ。
【0059】
このとき、計数値cntが0であれば、蓄積バッファ内に新たなパターン番号pat_idと、対応するパターン位置x, yを格納し、計数値cntを1にする。
【0060】
このような処理を繰り返して、画像内のすべての画素ブロックについて、パターン情報と計数値cntを蓄積バッファに格納し終えると、パターンの蓄積処理は終了する。
【0061】
図9および図10はパターン蓄積部12が行う第1のパターン蓄積処理の一例を示すフローチャートである。まず、蓄積バッファ上の位置を表す変数iを0に初期化する(ステップS41)。次に、i番目の蓄積バッファstockの計数値cntを0に初期化する(ステップS42)。次に、変数iをインクリメントする(ステップS43)。次に、変数iが蓄積バッファstockの総数より小さいか否かを判定する(ステップS44)。小さい場合はステップS42に戻って、残りの蓄積バッファstockの係数値cntを初期化する。
【0062】
変数iが蓄積バッファstockの総数以上であれば、蓄積バッファstockに格納したパターン番号pat_idの総数stock_maxを0に初期化する(ステップS45)。
【0063】
次に、パターン検出部11で検出されたパターン番号上の位置を表す変数jを0に初期化する(ステップS46)。次に、変数iを再度0に初期化する(ステップS47)。
【0064】
このように、ステップS41〜S47では、全ての蓄積バッファstockの初期化を行う。
【0065】
次に、パターン検出部11で検出されたパターン番号pat_idがi番目の蓄積バッファstockのパターン番号pat_idと一致するか否かを判定する(ステップS48)。一致しない場合は、次の蓄積バッファstockを検出するために、変数iをインクリメントする(ステップS49)。
【0066】
次に、まだ比較していない蓄積バッファstockのパターン番号pat_idが残っているか否かを判定する(ステップS50)。残っている場合は、ステップS48に戻る。残っていない場合は、パターン検出部11で検出されたパターン番号pat_idを新たな蓄積バッファに蓄積バッファに格納する(ステップS51)。次に、そのパターン番号pat_idに対応するパターン位置を同じ蓄積バッファに格納する(ステップS52)。そして、その蓄積バッファの計数値cntを1に設定する(ステップS53)。次に、蓄積バッファの総数stock_maxをインクリメントする(ステップS54)。
【0067】
一方、ステップS48で、一致すると判定された場合は、蓄積バッファstockの計数値cntをインクリメントする(ステップS55)。
【0068】
ステップS54またはS55の処理が終わると、変数jをインクリメントする(ステップS56)。
【0069】
次に、パターン検出部11で検出されたパターン番号の総数が変数jより大きいか否かを判定する(ステップS57)。大きい場合は、ステップS47以降の処理を行う。大きくない場合は、蓄積処理を終了する。
【0070】
<第2のパターン蓄積処理>
上述したパターン蓄積部12内の各蓄積バッファは図8の情報を格納したが、格納する情報は図8に限定されない。図11は第2のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。図11の蓄積バッファは、パターン番号pat_idと、パターン位置xの最大値max_xと、パターン位置yの最大値max_yと、パターン位置xの最小値min_xと、パターン位置yの最小値min_yと、パターン位置xの積算値sum_xと、パターン位置yの積算値sum_yと、格納した回数を示す計数値cntとを有する。
【0071】
この場合の蓄積バッファも、パターン検出部11で検出されたパターン番号の数分だけ設けられる。蓄積バッファへの格納を開始する前に、すべての蓄積バッファの計数値cntが0に初期化される。
【0072】
パターン蓄積部12は、蓄積バッファにパターン情報を格納する際には、同じパターン番号のパターン情報がすでに格納されているか否かを確認し、すでに格納されている場合には、新たに格納しようとするパターン位置x, yを、累積和sum_x, sum_yにそれぞれ加算する。また、このパターン位置xが最大値max_xより大きければmax_xをxに置き換え、パターン位置yが最大値max_yより大きければmax_yをyに置き換える。同様に、パターン位置xが最小値min_xより小さければmin_xをxに置き換え、パターン位置yが最小値min_xより小さければmin_yをyに置き換える。さらに、計数値cntをインクリメントする。
【0073】
一方、上記確認を行った結果、まだ格納されていない場合は、新たな蓄積バッファのpat_idに格納対象のパターン番号pat_idを格納し、sum_x, max_x, min_xのいずれにも格納対象のパターン位置xを格納し、sum_y, max_y, min_yのいずれにも格納対象のパターン情報yを格納する。さらに、計数値cntを1に設定する。
【0074】
このようにして、画像内のすべての画素ブロックについてのパターン情報を格納し終わったら、パターン蓄積処理は終了する。
【0075】
図12〜図14はパターン蓄積部12が行う第2のパターン蓄積処理の一例を示すフローチャートである。まず、蓄積バッファ上の位置を表す変数iを0に初期化する(ステップS61)。次に、i番目の蓄積バッファstockの計数値cntを0に初期化する(ステップS62)。次に、変数iをインクリメントする(ステップS63)。次に、変数iが蓄積バッファstockの総数未満か否かを判定する(ステップS64)。総数未満の場合はステップS62に戻る。
【0076】
ステップS64で、総数に達したと判定された場合は、パターン番号の総数stock_maxを0に初期化する(ステップS65)。次に、パターン検出部11で検出されたパターン番号上の位置を示す変数jを0に初期化する(ステップS66)。次に、変数iを再度0に初期化する(ステップS67)。
【0077】
次に、パターン検出部11で検出されたパターン情報のパターン番号pat_idが蓄積バッファstockのパターン番号pat_idと一致するか否かを判定する(ステップS68)。一致する場合は、パターン検出部11で検出されたパターン位置xをsum_xに加算し(ステップS69)、パターン位置yをsum_yに加算する(ステップS70)。
【0078】
次に、パターン検出部11で検出されたパターン位置xはmax_xより大きいか否かを判定し(ステップS71)、大きい場合にはmax_xをxに置き換える(ステップS72)。
【0079】
次に、パターン検出部11で検出されたパターン位置xはmin_xより小さいか否かを判定し(ステップS73)、小さい場合にはmin_xをxに置き換える(ステップS74)。
【0080】
次に、パターン検出部11で検出されたパターン位置yはmax_yより大きいか否かを判定し(ステップS75)、大きい場合にはmax_yをyに置き換える(ステップS76)。
【0081】
次に、パターン検出部11で検出されたパターン位置yはmin_yより小さいか否かを判定し(ステップS77)、小さい場合にはmin_yをyに置き換える(ステップS78)。
【0082】
次に、蓄積バッファstockの計数値cntをインクリメントする(ステップS79)。次に、変数jをインクリメントする(ステップS80)。
【0083】
次に、パターン検出部11で検出されたパターン番号の総数が変数jより大きいか否かを判定する(ステップS81)。大きくなければ処理を終了し、大きければステップS67以降の処理を行う。
【0084】
一方、上述したステップS68で一致しないと判定されると、変数iをインクリメントする(ステップS82)。次に、パターン検出部11で検出されたパターン情報のパターン番号との比較をまだ行っていない蓄積バッファが残っているか否かを判定する(ステップS83)。残っている場合にはステップS68以降の処理を行う。残っていない場合は、パターン検出部11で検出されたパターン番号pat_idを蓄積バッファに格納し(ステップS84)、対応するパターン位置xをsum_x, max_x, min_xにそれぞれ格納する(ステップS85〜S87)。また、対応するパターン位置yをsum_y, max_y, min_yにそれぞれ格納する(ステップS88〜S90)。次に、計数値cntを1に設定し(ステップS91)、蓄積バッファの種類を示す変数stock_maxをインクリメントし(ステップS92)、その後にステップS80以降の処理を行う。
【0085】
<第3のパターン蓄積処理>
第2のパターン蓄積処理のように、パターン位置x, yの最大値と最小値を格納する代わりに、パターン位置xの2乗の積算値sum_x2とパターン位置yの2乗の積算値sum_y2を格納してもよい。
【0086】
図15は第3のパターン蓄積処理における蓄積バッファのデータ構造を示す図である。図示のように、蓄積バッファは、パターン番号pat_idと、パターン位置xの積算値sum_xと、パターン位置yの積算値sum_yと、パターン位置xの2乗の積算値sum_x2と、パターン位置yの2乗の積算値sum_y2と、蓄積バッファに格納した回数を示す計数値cntとを有する。
【0087】
パターン蓄積部12は、蓄積バッファにすでに格納されたデータが存在する場合は、sum_x, sum_yにそれぞれパターン位置x, yを加算し、sum_x2にxの2乗を加算し、sum_y2にyの2乗を加算し、計数値cntをインクリメントする。
【0088】
蓄積バッファにまだ格納されていないパターン番号の場合は、新たな蓄積バッファのパターン番号pat_idに、格納対象のパターン情報のpat_idを格納し、sum_x, sum_yに格納対象のパターン情報のパターン位置x, yをそれぞれ格納し、sum_x2, sum_y2に格納対象のパターン情報のxの2乗とyの2乗をそれぞれ格納し、cntを1に設定する。このようにして、画像内のすべての検出位置のパターン情報を格納し終えたら、パターン蓄積処理は終了する。
【0089】
図16〜図18はパターン蓄積部12が行う第3のパターン蓄積処理の一例を示すフローチャートである。ステップS101〜S110は図12および図13のステップS61〜S70と共通するため、説明を省略する。
【0090】
ステップS110の処理が終わると、パターン位置xの2乗をsum_x2に加算する(ステップS111)。次に、パターン位置yの2乗をsum_y2に加算する(ステップS112)。その後、ステップS113〜S119は、図13および図14のステップS79〜S85と共通するため、説明を省略する。
【0091】
ステップS119の処理が終わると、次に、対応するパターン位置yをsum_yに格納し(ステップS120)、対応するパターン位置xの2乗をsum_x2に格納し(ステップS121)、対応するパターン位置yの2乗をsum_y2に格納する(ステップS122)。その後、計数値cntを1に初期化し(ステップS123)、蓄積バッファの種類を示す変数stock_maxをインクリメントする(ステップS124)。
【0092】
ステップS124の後にステップS114に移行する。
【0093】
以上で、パターン蓄積部12の処理動作の説明は終りである。次に、特徴点抽出部13の処理動作を説明する。特徴点抽出部13の処理動作として、以下の第1〜第3の特徴点抽出処理が考えられる。
【0094】
<第1の特徴点抽出処理>
第1の特徴点抽出処理は、図8のデータ構造の蓄積バッファに対応するものであり、第1のパターン蓄積処理の後に行われる。特徴点抽出部13は、図8のデータ構造の蓄積バッファを走査し、計数値cntが1の情報を抽出して、特徴点バッファ(不図示)に格納する。
【0095】
図19は第1の特徴点抽出処理における特徴点バッファのデータ構造を示す図である。図19の特徴点バッファには、パターン番号pat_idと、パターン位置xと、パターン位置yとが格納される。
【0096】
図20は第1の特徴点抽出処理の一例を示すフローチャートである。まず、蓄積バッファstock上の位置を示す変数iと、特徴点バッファpatinfo上の位置を示す変数jをともに0に初期化する(ステップS131)。
【0097】
次に、i番目の蓄積バッファ内の計数値cntが1か否かを判定する(ステップS132)。1であれば、その蓄積バッファ内のパターン番号pat_idとパターン位置x, yを、特徴点バッファpatinfoに格納する(ステップS133、S134)。続いて、変数jとiをインクリメントする(ステップS135、S136)。
【0098】
次に、変数iが蓄積バッファの総数未満か否かを判定し(ステップS137)、総数未満であれば、ステップS132に移行し、総数に達すると処理を終わる。
【0099】
<第2の特徴点抽出処理>
第2の特徴点抽出処理は、図11のデータ構造の蓄積バッファに対応するものであり、第2のパターン蓄積処理の後に行われる。特徴点抽出部13は、図11のデータ構造の蓄積バッファを走査し、計数値cntが1の蓄積バッファか、あるいは以下の3つの条件を満たす蓄積バッファを抽出する。そして、抽出した蓄積バッファ内の情報を特徴点バッファに格納する。
1)計数値cntが2以上
2)最大値max_x−最小値min_x<dx
3)最大値max_y−最小値min_y<dyの情報
【0100】
第2の特徴点抽出処理における特徴点バッファのデータ構造は図19と同じであるが、パターン位置xには、パターン位置xの総和sum_xを計数値cntで割った値sum_x/cntが格納され、パターン位置yには、パターン位置yの総和sum_yを計数値cntで割った値sum_y/cntが格納される。
【0101】
ここで、上述したdx、dyは、特徴点か否かを判断するための閾値である。画像中の離れた場所に同一パターンが存在する場合は、そのパターンは特徴点として機能しない可能性が高いので、排除する。一方、同一パターンが画像中の狭い範囲内しか存在しない場合は、そのパターンを特徴点とみなして、同一パターンの検出位置を平均化した位置を、そのパターン位置とする。
【0102】
このような処理は、焦点が合っていないぼやけた部分では、近接した位置に同一パターンが発見されることが多いことへの対応策である。
【0103】
複数の画像を合成する場合など、画像の一致をより厳密に行うために画像全域で一致点をなるべく多く見つけ出したい場合には、dxとdyに例えば1〜5程度の数値を与えて実行するのが望ましい。
【0104】
また、手ぶれ補正など、それほど多くの一致点を検出しなくて済む場合は、dxとdyを0に設定すれば、画像中の一箇所のみに存在した画素配置を抽出することになる。この場合は、第1の特徴点抽出処理と等価な処理となるため、処理コストの少ない第1の特徴点抽出処理を実行するのが望ましい。
【0105】
図21は第2の特徴点抽出処理の一例を示すフローチャートである。まず、蓄積バッファstock上の位置を示す変数iと、特徴点バッファpatinfo上の位置を示す変数jをともに0に初期化する(ステップS141)。
【0106】
次に、i番目の蓄積バッファstock内の計数値cntが1か、あるいは、max_x−min_x<dxかつmax_y−min_y<dyかを判定する(ステップS142)。ステップS142の判定がYesの場合は、j番目の特徴点バッファpatinfoに、i番目の蓄積バッファstock内のパターン番号pat_idを格納する(ステップS143)。次に、同じ特徴点バッファpatinfoに、同じ蓄積バッファstock内の情報を用いて計算されたsum_x/cntとsum_y/cntを格納する(ステップS144、S145)。
【0107】
次に、変数j、iをインクリメントする(ステップS146、S147)。次に、変数iが蓄積バッファの総数に達したか否かを判定し(ステップS148)、達していなければ、ステップS142以降の処理を行い、達した場合は処理を終了する。
【0108】
<第3の特徴点抽出処理>
第3の特徴点抽出処理は、図15のデータ構造の蓄積バッファに対応するものであり、第3のパターン蓄積処理の後に行われる。特徴点抽出部13は、図15のデータ構造の蓄積バッファを走査し、計数値cntが1の蓄積バッファか、あるいは以下の3つの条件を満たす蓄積バッファを抽出する。そして、抽出した蓄積バッファ内の情報を特徴点バッファに格納する。
1)計数値cntが2以上
2)標準偏差stdev_x=√((cnt*sum_x2−sum_x*sum_x)/cnt/(cnt−1)<dx
3)標準偏差stdev_y=√((cnt*sum_y2−sum_y*sum_y)/cnt/(cnt−1)<dy
【0109】
第3の特徴点抽出処理における特徴点バッファのデータ構造は図19と同じであるが、パターン位置xにはsum_x/cntが格納され、パターン位置yにはsum_y/cntが格納される。すなわち、第2の特徴点抽出処理と同様である。
【0110】
第3の特徴点抽出処理も、第2の特徴点抽出処理と同様に、画像中の近接した場所のみに同一パターンが存在する場合には特徴点とみなす。近接した場所かどうかを判断するためにパターン位置x, yの標準偏差stdev_x, stdev_yを閾値と比較する点が第2の特徴点抽出処理と異なる。
【0111】
図22は第3の特徴点抽出処理の一例を示すフローチャートである。蓄積バッファstockの種類を示す変数iと、特徴点バッファpatinfoの種類を示す変数jをともに0に初期化する(ステップS151)。
【0112】
次に、i番目の蓄積バッファstock内の計数値cntが1か否かを判定する(ステップS152)。1であれば、j番目の特徴点バッファに、i番目の蓄積バッファ内のパターン番号pat_idと、sum_x/cntと、sum_y/cntとを格納する(ステップS153〜S155)。
【0113】
次に、変数i,jをインクリメントする(ステップS156,S157)。次に、変数iが蓄積バッファの総数に達したか否かを判定し(ステップS158)、達していなければステップS152に戻り、達した場合には処理を終了する。
【0114】
一方、ステップS152で1でないと判定された場合は、標準偏差stdev_x=√((cnt*sum_x2−sum_x*sum_x)/cnt/(cnt−1)<dxか否かを判定する(ステップS159)。判定がYesの場合は、標準偏差stdev_y=√((cnt*sum_y2−sum_y*sum_y)/cnt/(cnt−1)<dyか否かを判定する(ステップS160)。
【0115】
ステップS160でYesと判定された場合はステップS153に移行し、ステップS159またはS160でNoと判定された場合はステップS157に移行する。
【0116】
上述した第1、第2または第3の特徴点抽出処理によって、特徴点バッファに格納されたデータが特徴点パターン情報patInfoとなる。
【0117】
<パターン観測確率算出処理>
上述したパターン蓄積部12は、パターン番号を検出すべきビットマップ画像の全画素数分の蓄積バッファを設けることを念頭に置いた。ところが、実際には、同じパターン番号を持つ画素ブロックのパターン情報は同じ蓄積バッファに格納されるため、必ずしも、ビットマップ画像の全画素数分の蓄積バッファを用意する必要はない。この場合、蓄積バッファの数を予め制限して、すべての蓄積バッファを使い終わった時点でパターン蓄積部12の蓄積処理を終了するか、あるいは蓄積バッファに格納するパターン情報を予め制限して、有用なパターン情報のみを蓄積バッファに格納してもよい。
【0118】
画素ブロック内のパターン番号の観測確率を予め予測して、観測確率が低いパターン画像に関するパターン情報のみを蓄積することで、蓄積されるパターン情報の数を減らすことも考えられる。観測確率が低いパターン画像のみに限定する理由は、観測確率の低いパターン番号はまれにしか出現しないことを意味するから、特徴的である可能性が高いためである。
【0119】
このようなパターン画像の観測確率の予測は、上述したパターン蓄積部12が処理を行う前に行う必要がある。図23はパターン画像の観測確率の予測処理を行うパターン確率算出部15を備えた画像一致点検出装置10の内部構成の一例を示すブロック図である。図示のように、パターン検出部11とパターン蓄積部12の間にパターン確率算出部15が設けられ、これ以外の構成は図2と同じである。
【0120】
画像の中に、あるパターン番号のパターン画像が含まれる確率は、各画像ごとに異なるが、パターン確率算出部15は、蓄積バッファの数を減らして処理の高速化を図るために設けられるものであり、単に蓄積バッファへのパターン情報の格納を行うか否かを示す情報のみを出力すればよい。
【0121】
本実施形態では、6×6=36画素からなる画素ブロックを、3×3=9個のパターン番号素の組合せで表現している。したがって、各パターン番号素が観測される確率を9個分掛け合わせて得られる乗算値を閾値と比較することにより、その画素ブロックのパターン情報を蓄積するべきか否かを判断すればよい。
【0122】
パターン番号素は、0〜15の数値を取り得るため、予め代表的な画像について、各パターン番号素の観測確率を求めて、テーブル化しておく。図24はパターン番号素と観測確率との対応関係を示すテーブルの一例を示す図である。このようなテーブルをルックアップテーブル(以下、LUT)として参照することで、容易に観測確率を算出できる。
【0123】
図25はパターン確率算出部15が行う処理の一例を示すフローチャートである。このフローチャートは、パターン番号を検出する単位である画素ブロックごとに行われる。まず、パターン番号素の種類を表す変数idsを初期化する(ステップS161)。ここでは、新たなパターン番号素の値pat_idを変数idsに代入する。
【0124】
次に、パターン観測確率pat_probを1に初期化する(ステップS162)。次に、確率を求めたパターン番号素の総数を表す変数iを0に初期化する(ステップS163)。
【0125】
次に、変数idsを16で割った余りを変数nに代入する(ステップS164)。次に、変数idsに対応する確率LUT(u)をLUTから参照し、パターン観測確率pat_probと掛け合わせる(ステップS165)。次に、変数idsを更新するために、(ids−n)/16を変数idsに代入する(ステップS166)。次に、変数iをインクリメントする(ステップS167)。
【0126】
次に、変数iがパターン番号素の総数に達したか否かを判定する(ステップS168)。達していなければステップS164以降の処理を行う。変数iがパターン番号素の総数に達した場合は、パターン観測確率pat_probが求まったことを示しており、このパターン観測確率pat_probが予め定めた閾値未満か否かを判定する(ステップS169)。
【0127】
パターン観測確率pat_probが閾値未満であれば、上述した第1,第2または第3のパターン蓄積処理を行う(ステップS170)。一方、閾値以上であれば、その画素ブロックのパターン情報はパターン蓄積部12には蓄積しないものと決定する(ステップS171)。
【0128】
図25の処理では、パターン観測確率pat_probの大きさにより、パターン蓄積を行うか否かを判断している。ところが、画像によっては、細かな模様が数多く含まれているものや、逆にコントラストが低い画像や夜景のように暗い画像もある。したがって、図25の処理では、細かな模様が数多く含まれている画像は数多くのパターン情報が蓄積され、コントラストが低い画像等はあまり蓄積されない結果となる。
【0129】
パターン蓄積部12内の蓄積バッファをできるだけ最大限使うためには、画像の種類ごとに異なる適切な閾値を設定しなければならないが、そのためには、閾値を決定する処理を別個に行わなければならず、処理速度の高速化という観点から不利である。
【0130】
そこで、図25の処理によって得られたパターン観測確率pat_probを複数の段階に分類し(段階分類部)、各段階ごとに蓄積バッファを設けて、蓄積バッファを使用するか否かを各段階ごとに判断することで、蓄積バッファの使用量を制限することが考えられる。
【0131】
この場合、対応する段階またはそれ以下の段階に属する特徴点パターン情報の候補の数を計測する(特徴点候補計数部)。次に、特徴点パターン情報の候補のパターン番号と、同一のパターン番号の出現回数と、各パターン番号に対応するパターン位置に関する情報とを、複数の蓄積バッファに分けて格納するようにする。その際、特徴点候補計数部で計測された数が所定の閾値未満であれば、対応する蓄積バッファへの格納を許可し、特徴点候補計測部で計測された数が閾値より大きければ、対応する段階以上(つまり、観測確率の高い段階)のすべての蓄積バッファへの格納を禁止する。図26A、図26B、図26Cおよび図26Dはこの種の蓄積制御処理の一例を示すフローチャートである。
【0132】
図26Aは、図9のステップS42、図12のステップS62または図16のステップS102の処理に代わるものであり、段階ごとに設けられる複数の蓄積バッファをすべてクリアする処理を行う。
【0133】
まず、段階を表す変数kを0に設定する(ステップS42−1)。次に、k番目の段階の蓄積バッファstockを使用すべく、stockポインタを設定する(ステップS42−2)。
【0134】
次に、k番目の段階のi番目の蓄積バッファstockの計測数cntを0に設定(クリア)する(ステップS42−3)。次に、変数kをインクリメントし(ステップS42−4)、すべての段階(例えば、16段階)の蓄積バッファstockすべてをクリアしたか否かを判定し、判定がNoの場合はステップS42−2に戻り、Yesの場合は図9のステップS43、図12のステップS63または図16のステップS103に移行する。
【0135】
図26Bは、図9のステップS46、図12のステップS66または図16のステップS106の処理に代わるものであり、すべての段階の特徴点パターン情報の候補数(以下、特徴点候補数)ccntと蓄積バッファへの格納を許可するか否かを設定するための蓄積許可フラグFlagを初期化する。
【0136】
まず、パターン検出部11で検出されたパターン番号上の位置を表す変数jを0に設定する(ステップS46−1)。次に、段階を表す変数kを0に設定する(ステップS46−2)。次に、k番目の段階の特徴点候補数ccnt[k]を0に設定する(ステップS46−3)。次に、k番目の段階の蓄積許可フラグFlag[k]を許可状態(例えば1)に設定する(ステップS46−4)。次に、変数kをインクリメントする(ステップS46−5)。
【0137】
次に、16段階全ての特徴点候補数ccnt[k]と蓄積許可フラグFlag[k]を初期化したか否かを判定し(ステップS46−6)、判定がNoの場合はステップS46−3に戻り、判定がYesの場合は、図9のステップS47、図12のステップS67または図16のステップS107の処理を行う。
【0138】
図26Cは、図9のステップS47、図12のステップS67または図16のステップS107の処理に代わるものであり、蓄積許可フラグFlagが許可状態のときのみ、蓄積バッファへの格納を行うものである。
【0139】
まず、蓄積バッファstock上の位置を示す変数iを0に設定する(ステップS47−1)。次に、パターン番号pat_id[j]からパターン観測確率pat_probを算出する(ステップS47−2)。ここでは、図25の処理を実行する。
【0140】
次に、算出したパターン観測確率pat_probから段階LEVを算出する(ステップS47−3)。パターン観測確率pat_probの最大値は539であり、log10539=約15であるため、段階LEVは、0〜15の範囲内の16段階を示す値となる。
【0141】
次に、段階LEVの蓄積バッファへの格納が許可されているか否かを判定する(ステップS47−4)。ここでは、蓄積許可Flagの値で判断する。許可されていなければ、図10のステップS56、図13のステップS80または図17のステップS114に移行し、許可されていれば、LEV番目の段階の蓄積バッファにパターン番号等を格納する設定を行う(ステップS47−5)。その後、図10のステップS48、図12のステップS68または図17のステップS108の処理を行う。
【0142】
図26Dは、図10のステップS55、図13のステップS79または図17のステップS113の処理に代わるものであり、パターン検出部11で検出されたパターン番号pat_idがi番目の蓄積バッファstockのパターン番号pat_idと一致した場合には、特徴点パターン情報ではなくなることから、特徴点候補数ccnt[LEV]をデクリメントするものである。
【0143】
まず、計数値cntをインクリメントし(ステップS55−1)、次に、特徴点候補数ccnt[LEV]をデクリメントする(ステップS55−2)。その後、図10のステップS56、図13のステップS80または図17のステップS114の処理を行う。
【0144】
図26Eは、図10のステップS54、図14のステップS92または図18のステップS124の処理に代わるものであり、特徴点候補数が閾値以上か否かを判定して、蓄積バッファ部への格納制御と蓄積許可フラグFlagの設定を行う。
【0145】
まず、蓄積バッファ部の総数stock_maxをインクリメントする(ステップS54−1)。次に、段階LEVの特徴点候補数ccnt[LEV]をインクリメントする(ステップS54−2)。次に、各段階の特徴点候補数数ccnt[LEV]の和を求める計数値sum_ccntに、ccnt[LEV]を代入する(ステップS54−3)。
【0146】
次に、段階を表す変数kを0に設定する(ステップS54−4)。次に、計数値sum_ccntに、k段階の特徴点候補数を加算する(ステップS54−5)。次に、変数kをインクリメントする(ステップS54−6)。
【0147】
次に、段階LEVよりもパターン観測確率の低い段階の特徴点候補数の加算が終了したか否かを判定する(ステップS54−7)。この判定がNoであればステップS54−5に戻り、Yesであれば、特徴点候補数の和sum_ccntが閾値以上か否かを判定する(ステップS54−8)。
【0148】
ステップS54−8の判定がYesであれば、変数kを次の段階の値に設定する(ステップS54−9)。次に、段階kの蓄積許可フラグFlagを0に設定する(ステップS54−10)。次に、変数kをインクリメントする(ステップS54−11)。
【0149】
次に、パターン観測確率が最も高い段階まで処理したか否かを判定し(ステップS54−12)、判定がNoであればステップS54−10に戻り、判定がYesの場合、あるいはステップS54−8の判定がNoの場合は、図10のステップS55、図13のステップS80または図17のステップS114に移行する。
【0150】
<一致点検出処理>
次に、一致点検出処理について説明する。まずは、2つの画像から抽出された特徴点の情報を利用して一致点を検出する例を説明する。3つ以上の画像間での一致点検出は、そのうちの2つの画像について、まず一致点の検出を行い、その検出結果と、まだ一致点検出を行っていない残りの一つの画像との間で一致点を検出し、その検出結果を利用して、さらに残りの一つの画像との間で一致点検出を行うといった処理を繰り返せばよい。
【0151】
話を戻して、2つの画像間での一致点の検出処理について説明する。ここで、画像Aから得られた特徴点パターン情報をpatInfoA、画像Bから得られた特徴点パターン情報をpatInfoBとする。
【0152】
特徴点パターン情報patInfoAに、複数の特徴点に関するパターン情報が格納されている場合には、その一つ一つのパターンに対応するパターン番号を、特徴点パターン情報patInfoBに格納されているすべての特徴点パターン情報のパターン番号と照合し、共通して含まれるパターン番号と、そのパターン位置とを抽出する。
【0153】
ここで、特徴点パターン情報patInfoAから抽出されたパターン位置をa、特徴点パターン情報patInfoBから抽出されたパターン位置をbとすると、画像Aでは位置aに写っていたものが画像Bでは位置bに写っていたことになる。
【0154】
このようにして、共通するパターン番号を持つ特徴点パターン情報をすべて抽出することにより、画像AとBの間での対応する位置情報を複数得ることができる。もちろん、場合によっては、一つしか得られない場合や、一つも得られない場合もあり得る。
【0155】
一致点検出部14は、上記の処理手順で図27のような一致点情報を検出する。図27の一致点情報は、パターン番号pat_idと、画像Aの位置xの値x0と、同画像Aの位置yの値y0と、画像Bの位置xの値x1と、同画像Bの位置yの値y1とを有する。
【0156】
ここで、パターン番号pat_idは、さらに別の画像との間で一致点検出を行う場合には必要となるが、2つの画像間での一致点検出だけを行うのであれば、必ずしも必要ない。
【0157】
図28は一致点検出部14が行う一致点検出処理の一例を示すフローチャートである。まず、画像Aに対して、上述した第1、第2または第3の特徴点抽出処理を行って得た特徴点パターン情報patInfoAを取得する(ステップS191)。同様に、画像Bに対しても特徴点パターン情報patInfoBを取得する(ステップS192)。
【0158】
次に、特徴点パターン情報patInfoA上の位置を表す変数iと、一致点の数を表す変数kをともに0に初期化する(ステップS193)。同様に、特徴点パターン情報patInfoB上の位置を表す変数jを0に初期化する(ステップS194)。
【0159】
次に、i番目の特徴点パターン情報patInfoAのパターン番号と、j番目の特徴点パターン情報patInfoBのパターン番号とが一致するか否かを判定する(ステップS195)。両者が一致しない場合は、変数jをインクリメントする(ステップS196)。変数jが特徴点パターン情報patInfoBの総数に達したか否かを判定する(ステップS197)。達しなかった場合はステップS195以降の処理を行い、達した場合は変数iをインクリメントする(ステップS198)。
【0160】
変数iは特徴点パターン情報patInfoAの総数に達したか否かを判定する(ステップS199)。達していなければステップS194以降の処理を行い、達した場合は処理を終わる。
【0161】
一方、ステップS195で両者のパターン番号が一致したと判定されると、図27のような一致点情報を追加する(ステップS200)。次に、一致点情報の数を表す変数kをインクリメントし(ステップS201)、ステップS198以降の処理を行う。
【0162】
<画像の移動、回転、拡縮>
一致点検出部14により検出された一致点情報は、種々の目的で利用できるが、ここでは、2つの画像A,B間の一致点検出情報に基づいて、画像Aが画像Bに近づくように、画像Aの移動、回転および拡縮の少なくとも一つの処理を行う例を説明する。
【0163】
画像A中の座標(x, y)に対して何らかの座標変換を行った後の座標を(x', y')とする。
【0164】
例えば、座標(x, y)を移動量dx, dyで平行移動した後の座標(x', y')は、以下の(6)式で表される。この(6)式では、変換元の二次元座標に、z=1を補って3次元のベクトルとして、3×3の行列Gを用いて変換を行う。
【数1】
【0165】
座標(x, y)を原点の回りにθ度回転させた後の座標(x', y')は、以下の(7)式で表される。
【数2】
【0166】
座標(x, y)を原点を不動点とする拡縮率fで拡縮した後の座標(x', y')は、以下の(8)式で表される。
【数3】
【0167】
上述した(6)〜(8)式を組み合わせた変換式は、以下の(9)式で表される。
【数4】
【0168】
上記(9)式の右辺の3×3行列を3つ乗算して得られる行列Gは、移動、回転および拡縮の処理をまとめて実施するものである。
【0169】
ここで、p=(x, y)からq=(x', y')の変換をgとしたときに、q=g(p)と表すことにする。
【0170】
ここで、一致点検出部14で検出された一致点情報のn番目の画像A上の位置をAn、画像B上の対応位置をBnとすると、
B0=g(A0)
B1=g(A1)
…
Bn=g(An)
となる変換gを求めれば、変換gの具体的内容である移動量dx, dyや、回転角度θ、拡縮率fを検出できる。
【0171】
あるいは、ベクトルvの長さの二乗をLen2(v)と表記する。このLen2(v)は、ベクトルv同士の内積により算出可能である。このLen2(v)を用いると、画像Aの位置と対応する画像Bの位置の距離の二乗和は、以下の(10)式で表される。
Len2(B0−g(A0))+Len2(B1−g(A1))+…+Len2(Bn−g(An)) …(10)
【0172】
(10)式が小さくなるように、変換gの移動量dx, dyと、回転角度θと、拡縮率fとを求めれば、移動量、回転量および拡縮率を算出できる。
(10)式の計算は、いわゆる収束計算によって行えばよい。
【0173】
あるいは、行列Gの代わりに、下記のような行列Hを用いて処理を行う方法もある。
【0174】
変換後の位置B0=H*変換元の位置A0
変換後の位置B1=H*変換元の位置A1
…
変換後の位置Bn=H*変換元の位置An …(11)
【0175】
上記(11)式は、変換前の位置0、1、…、nを列ベクトルに持つ3行n+1列の行列Aに行列Hを乗算して、変換後の位置0、1、…、nを列ベクトルに持つ3行n+1列の行列Bを得るものであり、B=H*Aで表すことができる。
【0176】
通常、逆行列とは、正方行列のみに存在するが、正方でないn+1行3列の行列Ainvが、A*Ainv=3×3の単位行列となるとき、Ainvは疑似逆行列と呼ばれる。
【0177】
このAinvを、上述したB=H*Aの両辺に左側から掛け合わせると、以下の(12)式が得られる。
B*Ainv=H*A*Ainv …(12)
A*Ainvは単位行列であるため、上記(12)式は(13)式のように変換される。
B*Ainv=H*単位行列=H …(13)
【0178】
この(13)式により、行列Hが確定する。行列Hにより行われる変換は、移動、回転、拡縮のみならず、より複雑な変換をも含む。Hによる変換は、上述したように、2次元座標を3次元のz=1面に置き換えて空間一次変換を行うすべての自由度を含む変換である。この行列Hによる画像変換を行い、その結果に基づいて行列Hが求まってしまえば、移動、回転、拡縮、その他のすべての自由度を含む変換を行える。
【0179】
移動、回転、拡縮以外の変換としては、例えば、正方形を平行四辺形にするような変換や、縦と横で異なる倍率の拡縮なども行うことができる。これにより、例えば被写体が回転している方向だけに拡縮を行う場合に対しても追従でき、処理能力が許せば、行列Hを用いた手法の方が望ましいかもしれない。この場合は、Gを計算する必要はなくなる。
【0180】
一方、移動、回転、拡縮等の既存の画像処理系を利用する場合は、上述したように、行列Gの移動量dx, dy、回転角度θおよび拡縮率fを求めればよい。また、移動量dx, dy、回転角度θおよび拡縮率fのうち、少なくとも一つを処理するように設計してもよい。
【0181】
3つ以上の画像について、移動、回転または拡縮を行う場合も同様の手順で行列GまたはHを求めればよい。例えば、画像A,Bの他に画像Cがあり、画像C上の位置をC0〜Cnで表記する場合、上述した(10)式の代わりに、以下の(14)式を求める。
【0182】
Len2(B0−g(A0))+Len2(C0−g(A0))+Len2(B1−g(A1))+Len2(C1−g(A1))+…+Len2(Bn−g(An))+Len2(Cn−g(An)) …(14)
上記(14)式により、変換後の画像Aと、画像BおよびCとの一致点の距離の二乗の和を小さくするようにすれば、画像BとCの平均的な位置に画像Aを合わせることになる。さらに、画像Dとの一致点も処理すると、画像Aを画像B,C,Dの平均的な位置に合わせることになる。この性質を利用すると、デジタルビデオカメラの手ぶれ補正処理に応用することができる。
【0183】
図29は上述した一致点検出情報に基づく画像変換の手法を模式的に示す図である。図29では、3つのコマ画像A,B,Cの一致点を合わせて、一致点の位置が重なり合うように画像変換を行う例を示している。例えば、コマ画像A,B,C中のりんごの部分が一致点として検出されたとする。この場合、上述した行列GまたはHを用いて、画像変換が行われる。その後、画像変換後の3つのコマ画像中の一致点同士が重なり合うように画像合成が行われる。
【0184】
本実施形態をビデオカメラに適用する場合、各コマ(フレームまたはフィールド)画像に対して上述した第1、第2または第3の特徴点抽出処理を行い、最近の数コマ(例えば2〜60コマ程度)を参照コマとして、直前のコマを処理対象とする。
【0185】
上述した(14)式が小さくなるように処理を行うと、参照コマに対する平均的な位置に、処理対象コマが合致または近づくように変換が行われ、手ぶれによる画像の移動回転拡縮が平滑化されることになる。このことは、例えばフレームレートが30コマ/秒のカメラで最近の30コマを参照コマとして実行した場合、1秒分の動きが平滑化された映像に対して合わせられることを意味する。すなわち、細かな振動を画像から取り除くことになり、手ぶれまたは被写体ブレを緩和することができる。
【0186】
なお、参照コマから一致点検出を行う場合、特徴点パターン情報だけを保持しておけばよく、画像データ自体を保持する必要はない点でも本実施形態は優れている。例えば、参照コマ数が多いほど瞬間的な移動によるブレは平滑化されることになり、60コマ程度に増やした場合でも、画像そのものを保持しておく必要はなく、メモリ消費も少なくて実装が容易である。
【0187】
従来のコマ間での移動情報(フレーム間差分による移動情報)を積算しながら処理する方式では、画像同士を比較するために、最近の画像と直前の画像とを比較するのが精一杯であり、フレーム間差分を最小化するように移動量などを計算していた。本実施形態によれば、誤差の蓄積を防止できるだけでなく、時間的に離れた複数のコマとの比較も行うため、検出精度が極めて高くなる。
【0188】
この結果、本実施形態によれば、手ぶれ補正効果が大きくなり、誤動作も少なくなる。また、移動だけでなく、カメラの傾き(回転)や前後またはズーム(拡縮)ブレも緩和できる。
【0189】
上述した手法により複数の画像の一致点検出と画像変換を行うことで、同一画素位置に同一の物体が写されるように変換することができる。このような画像変換処理を行うことで、種々の利点が得られる。
【0190】
一つには、ノイズの低減効果である。ランダムノイズは、不規則に発生するために低減が難しいノイズであるが、不規則に発生する性質を利用すると、複数の画像を重ね合わせることで、低減が可能である。このとき、画像を重ね合わせる手法には種々のものがあるが、以下では、平均化と中間値を算出する手法を説明する。
【0191】
画像変換された複数画像の同一画素位置を平均化して得られる画像は、同一の物体が同一の画像位置に写っているため、平均化によりその物体から得られる信号Sは変化しない。一方、ノイズは不規則であるため、平均化する画素数に応じて低減される。したがって、画像変換された複数画像を合成する場合は、平均化した画素数に応じてS/Nが向上し、ノイズを低減することができる。
【0192】
一方、ランダムノイズは不規則であり、正規分布することが予めわかっている。このため、画像変換された複数画像を合成する際に、中間値を用いることによってもノイズを低減できる。この場合、周辺の画素ではなく、複数画素の合成に応用しているため、中間値フィルタをかけた場合によく見られるように、画像のヌメヌメ感は発生するおそれはない。
【0193】
なお、上述した平均化の際に、必要に応じて重み付けを行ってもよい。以下では、重み付けの一例を説明する。
【0194】
露出を変えながら撮影された一連の画像を合成すると、ノイズを低減できる他に、ダイナミックレンジを拡大できるという効果がある。
【0195】
明るく撮影された画像の方がノイズが少ないため、平均時の重みを大きくし、暗く撮影されている画像では重みを小さくする。ただし、明るい画像中で色または輝度が飽和している部分は白とびが発生しているため、重みを0にする。
【0196】
輝度が次第に明るくなって、飽和に至るまでのグラデーション領域で、急激な重みの変化が発生することで違和感が出ないように、飽和点手前から徐々に重みを下げていく。
【0197】
このような重み付けを行うには、ピクセル値の大きさに応じて重みが増し、飽和点の手前から重みが減少し、飽和点で0になるような関数によって重みを算出するのが望ましい。この種の関数の具体的な実装例として、最も処理量が小さく、かつ自由度の高いものは、ルックアップテーブルである。
【0198】
図30はルックアップテーブル(以下、LUT)をグラフ化した一例を示す図である。図30では、画素値を0〜255とし、重みの範囲も0〜255としている。R,G,Bの各色ごとに、個別あるいは共通のLUTを引いて、画素値に対応する重みを設定すればよい。
【0199】
図31は重み付けの一例を模式的に説明する図である。図31は図29で画像変換した後の3つのコマ画像のそれぞれに重み付けを行う例を示している。コマ画像中の特定画素位置について、コマ画像ごとに別個の重み付けを行う。例えば、コマ画像Aの特定画素位置の画素値が130の場合、LUTを引くことにより、重み200を取得する。同様に、コマ画像Bの特定画素位置の画素値が120であれば重み190を取得し、コマ画像Cの特定画素位置の画素値が125であれば重み195を取得する。そして、以下の(15)式により、合成画素値を算出する。
【数5】
【0200】
本実施形態をデジタルスチルカメラに適用すれば、露出違いで撮影された一連の画像からダイナミックレンジが広くて、かつ階調性が豊かで、ノイズも少ない画像を記録することができる。
【0201】
図32は露出を変えながら撮影した3枚のコマ画像A,B,Cの重み付けの一例を模式的に説明する図である。コマ画像A,B,Cの順に露出が低くなっているものとする。コマ画像A,Bは露出が高いため、一部が白飛びしている。白飛びしている画素領域(画素値=255)は重みが0に設定され、この画素領域については、白飛びしていないコマ画像Cは0でないので、合成結果はCの画像データが使われる。
【0202】
コマ画像Cは一部が黒つぶれしている。黒つぶれした画素領域は、黒つぶれしていないコマ画像AまたはBの重みよりも小さく設定されるため、結果Aが優先され、B,Cの順に低い重みで合成される。
【0203】
なお、上述した重みづけは他の画像には依存しないため、一連の映像を同時に参照せずに重みを決定でき、必要に応じて逐次重み付けを行いながら合成画像を蓄積することができる。これにより同時に必要な作業用メモリ量を削減できる。
【0204】
例えば、作業用メモリには、画素数分の画素の合計値SumR, SumG, SumB と重みの合計値 SumFact を格納し、0に初期化しておく。先の変換処理によって変換済みの映像が入力されたら各画素値から重み(Fact)を算出して、R画素値と重みFactの乗算値をSumRに足しこむ、同様に、G画素値と重みFactの乗算値をSumGに足しこむ。同様に、B画素値と重みFactをSumBに足しこむ。SumFact には Fact を足しこむ。
【0205】
このようにして、一連の画像のすべてのピクセルの足しこみ処理が完了したら、各画素の SumR, SumG, SumB を SumFact で除算して、平均化された画素値が得られる。
【0206】
なお、ここで SumFact で除算する代わりに、例えば SumFact/4 で除算すると、画像合成前の画像よりも4倍大きな画素値が得られる。例えば、4枚の画像を合成している場合には、4倍程度階調性が増しているので、4倍大きな画素値を取り出すことで、豊かな階調を得ることもできる。
【0207】
本実施形態の他の応用は、ピント位置を変化させながら撮影された一連の画像から、できるだけ広い範囲にピントがあった画像を生成することである。これもまた、画素毎に設定された重みによる加重平均を利用する。
【0208】
このとき、ピントが合っている箇所ほど大きな重みとなり、ピントが合っていない箇所ほど重みが小さくなるように重みづけされて平均化すれば良い。これにもさまざまな手法が考えられるが、以下では、高い周波数が含まれている部分ほどピントが合っていると判断し、大きな重みを設定する例を説明する。
【0209】
処理対象画像に対して、(15)式の行列で表される高周波検出フィルタを通すと、高周波が多く含まれている部分ほど大きな値が算出される。
【数6】
【0210】
算出された値の絶対値または、2乗値を重みとすれば良い。この際、カラー画像であっても、R,G,Bごとに別個に処理を行う必要はなく、予めR,G,Bから輝度(例えば、輝度Y=(3R+6G+B)/10)を求めてからフィルタリングすると、全体の処理量が小さくなり有利である。
【0211】
なお、このフィルタリングは、あくまでも重みの算出のためのものであるから、ここでの輝度の計算は厳密である必要はない。処理量を少なくしたい場合には、さらに計算を簡略化しても構わない。(例:Y=(R+2G+B)/4)
図33はピント位置に合わせて重みを調整する手法を模式的に示す図である。コマ画像Aは人間にピントが合っており、コマ画像Bは木にピントが合っており、コマ画像Cは山にピントが合っているものとする。したがって、人間の写っている画素領域では、コマ画像Aの重みが大きくなり、木が写っている画素領域では、コマ画像Bの重みが大きくなり、山が写っている画素領域では、コマ画像Cの重みが大きくなる。
【0212】
これにより、近くから遠くまで全体的にピントが合った画像が得られる。
【0213】
上述したように、本実施形態によれば、少ない演算量かつ高速に精度の高い一致点を大量に検出することが可能であり、従来の方法の欠点である演算量という問題点を克服できる。局部的な画素値の相対的な大小関係を許容値(閾値)を考慮するため、画像のさまざまなノイズ(ランダムノイズ、圧縮時のブロックノイズやモスキートノイズ)だけでなく、画像の傾きや拡縮(像倍率の変化)に対しても寛容であり、画像1の位置aは、画像2の位置bに対応するというようなベクトル情報を複数提供でき、平行移動だけでなく、回転や拡縮も検出でき、さらには、上述した特許文献3による3次元カメラベクトルを特定してさらに高度なブレ補正を行う用途にも応用可能である。また、高速であるが故に、1対複数画像での一致点検出や、複数対複数の一致点検出も短時間に終わらせることが可能であり、結果より多くの一致検出結果を得ることができ、さらには一致点検出の精度向上が見込める。
【0214】
本実施形態を応用することで、上述した一致点検出機能を持つ画像処理装置、デジタルスチルカメラおよびデジタルビデオカメラ等を提供することができるが、本実施形態の適用範囲はこれだけに留まらない。本実施形態では、処理量を増大させることなく、数多くの一致点を検出できるため、動画映像から動くものだけを発見する場合においても、より小さな移動体を検出できたり、精度が高いことから、それを追跡する場合においても有利である。対象物の動きに追従してズーミングしたり、車に搭載されたビデオカメラからの画像を処理して、近づく人間や物体を警告したり、入って来た人を追いかける監視カメラなど、応用範囲は広範囲に及ぶ。
【0215】
すなわち、本実施形態は、複数の画像から、精度の高い一致点を高速かつ少ない演算量で検出できるため、本実施形態を利用すれば、種々の特徴を持つ応用製品を生み出せる。
【0216】
本発明の態様は、上述した個々の実施形態に限定されるものではなく、当業者が想到しうる種々の変形も含むものであり、本発明の効果も上述した内容に限定されない。すなわち、特許請求の範囲に規定された内容およびその均等物から導き出される本発明の概念的な思想と趣旨を逸脱しない範囲で種々の追加、変更および部分的削除が可能である。
【0217】
上述した実施形態で説明した画像一致点検出装置の少なくとも一部は、ハードウェアで構成してもよいし、ソフトウェアで構成してもよい。ソフトウェアで構成する場合には、画像一致点検出装置の少なくとも一部の機能を実現するプログラムをフレキシブルディスクやCD−ROM等の記録媒体に収納し、コンピュータに読み込ませて実行させてもよい。記録媒体は、磁気ディスクや光ディスク等の着脱可能なものに限定されず、ハードディスク装置やメモリなどの固定型の記録媒体でもよい。
【0218】
また、画像一致点検出装置の少なくとも一部の機能を実現するプログラムを、インターネット等の通信回線(無線通信も含む)を介して頒布してもよい。さらに、同プログラムを暗号化したり、変調をかけたり、圧縮した状態で、インターネット等の有線回線や無線回線を介して、あるいは記録媒体に収納して頒布してもよい。
【符号の説明】
【0219】
1 撮像素子
2 A/D変換器
3 画像処理回路
4 符号化装置
10 画像一致点検出装置
11 パターン検出部
12 パターン蓄積部
13 特徴点抽出部
14 一致点検出部
15 パターン確率算出部
【特許請求の範囲】
【請求項1】
複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出するパターン検出部と、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納するパターン蓄積部と、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出する特徴点抽出部と、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を含む複数の前記パターン情報を一致点情報として検出する一致点検出部と、を備えることを特徴とする画像一致点検出装置。
【請求項2】
前記パターン蓄積部は、前記パターン番号ごとに、同一の前記パターン番号を持つ前記パターン位置の和と、前記パターン位置の最大値と、前記パターン位置の最小値とを、前記パターン位置に関する情報として蓄積し、
前記特徴点抽出部は、対応する前記ビットマップ画像における前記パターン番号の出現回数が2回以上の場合には、前記パターン蓄積部に蓄積された前記最大値と前記最小値との差が所定の閾値未満か否かを前記パターン番号ごとに判断して、前記閾値未満と判断された前記パターン番号に対応する前記パターン情報を前記特徴点パターン情報として抽出し、該パターン番号に対応する前記パターン位置の和を該パターン番号の出現回数で除算して得られる位置の平均値を、前記特徴点パターン情報の前記パターン位置として抽出することを特徴とする請求項1に記載の画像一致点検出装置。
【請求項3】
前記パターン蓄積部は、前記パターン番号ごとに、同一の前記パターン番号を持つ前記パターン位置の和および前記パターン位置を各座標軸上の位置ごとに2乗して足し合わせた2乗和と、を前記パターン位置に関する情報として蓄積し、
前記特徴点抽出部は、対応する前記ビットマップ画像における前記パターン番号の出現回数が2回以上の場合には、前記パターン蓄積部に蓄積された同一の前記パターン番号を持つ前記パターン位置の和および2乗和と、該パターン番号の前記出現回数とを用いて標準偏差を算出し、該標準偏差が所定の閾値未満か否かを前記パターン番号ごとに判断して、前記閾値未満と判断された前記パターン番号に対応する前記パターン情報を前記特徴点パターン情報として抽出し、該パターン番号に対応する前記和を該パターン番号の出現回数で除算して得られる位置の平均値を、前記特徴点パターン情報の前記パターン位置として抽出することを特徴とする請求項1に記載の画像一致点検出装置。
【請求項4】
前記パターン検出部は、前記パターン画像を前記パターン番号に変換する際、前記パターン番号同士が重複しないように同一の前記パターン画像に対してそれぞれ異なる前記パターン番号を生成する複数のパターン番号変換部を有し、
前記パターン蓄積部は、前記複数のパターン番号変換部で生成された複数種類のパターン番号のそれぞれごとに、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを蓄積することを特徴とする請求項1乃至3のいずれかに記載の画像一致点検出装置。
【請求項5】
前記パターン検出部で検出されるパターン番号が、基準となるビットマップ画像に含まれる確率を算出する確率算出部を備え、
前記パターン蓄積部は、前記確率が所定の閾値未満である前記パターン番号に対応する前記パターン情報のみを蓄積することを特徴とする請求項1乃至4のいずれかに記載の画像一致点検出装置。
【請求項6】
前記パターン蓄積部は、
前記確率をその大きさに応じて複数の段階に分類する段階分類部と、
前記複数の段階のそれぞれごとに設けられ、対応する段階またはそれ以下の前記確率の段階に属する前記特徴点パターン情報の候補の数を計測する特徴点候補計数部と、
前記複数の段階のそれぞれに対応して設けられ、前記特徴点パターン情報の候補の前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納する複数の蓄積バッファと、
前記特徴点候補計測部で計測された数が所定の閾値未満であれば、対応する前記蓄積バッファへの格納を許可し、前記特徴点候補計測部で計測された数が前記閾値以上であれば、対応する段階以上のすべての前記蓄積バッファへの格納を禁止するパターン蓄積制御部と、を有することを特徴とする請求項5に記載の画像一致点検出装置。
【請求項7】
前記特徴点パターン情報をそれぞれ含む2以上の画像の中の一つの画像を処理対象画像として選択し、前記特徴点パターン情報を含む他の画像を参照して、前記処理対象画像の前記特徴点パターン情報と前記他の画像の前記特徴点パターン情報との間で前記一致点検出を行い、検出された一致点情報に基づいて前記処理対象画像の移動、回転および拡縮処理の少なくとも一つを行って、前記処理対象画像のブレを補正するブレ補正部を備えることを特徴とする請求項1乃至6のいずれかに記載の画像一致点検出装置。
【請求項8】
複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出し、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納し、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出し、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を一致点情報として検出することを特徴とする画像一致点検出方法。
【請求項9】
複数のビットマップ画像のそれぞれにおける隣接する複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出し、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納し、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出し、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を一致点情報として検出するプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項1】
複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出するパターン検出部と、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納するパターン蓄積部と、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出する特徴点抽出部と、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を含む複数の前記パターン情報を一致点情報として検出する一致点検出部と、を備えることを特徴とする画像一致点検出装置。
【請求項2】
前記パターン蓄積部は、前記パターン番号ごとに、同一の前記パターン番号を持つ前記パターン位置の和と、前記パターン位置の最大値と、前記パターン位置の最小値とを、前記パターン位置に関する情報として蓄積し、
前記特徴点抽出部は、対応する前記ビットマップ画像における前記パターン番号の出現回数が2回以上の場合には、前記パターン蓄積部に蓄積された前記最大値と前記最小値との差が所定の閾値未満か否かを前記パターン番号ごとに判断して、前記閾値未満と判断された前記パターン番号に対応する前記パターン情報を前記特徴点パターン情報として抽出し、該パターン番号に対応する前記パターン位置の和を該パターン番号の出現回数で除算して得られる位置の平均値を、前記特徴点パターン情報の前記パターン位置として抽出することを特徴とする請求項1に記載の画像一致点検出装置。
【請求項3】
前記パターン蓄積部は、前記パターン番号ごとに、同一の前記パターン番号を持つ前記パターン位置の和および前記パターン位置を各座標軸上の位置ごとに2乗して足し合わせた2乗和と、を前記パターン位置に関する情報として蓄積し、
前記特徴点抽出部は、対応する前記ビットマップ画像における前記パターン番号の出現回数が2回以上の場合には、前記パターン蓄積部に蓄積された同一の前記パターン番号を持つ前記パターン位置の和および2乗和と、該パターン番号の前記出現回数とを用いて標準偏差を算出し、該標準偏差が所定の閾値未満か否かを前記パターン番号ごとに判断して、前記閾値未満と判断された前記パターン番号に対応する前記パターン情報を前記特徴点パターン情報として抽出し、該パターン番号に対応する前記和を該パターン番号の出現回数で除算して得られる位置の平均値を、前記特徴点パターン情報の前記パターン位置として抽出することを特徴とする請求項1に記載の画像一致点検出装置。
【請求項4】
前記パターン検出部は、前記パターン画像を前記パターン番号に変換する際、前記パターン番号同士が重複しないように同一の前記パターン画像に対してそれぞれ異なる前記パターン番号を生成する複数のパターン番号変換部を有し、
前記パターン蓄積部は、前記複数のパターン番号変換部で生成された複数種類のパターン番号のそれぞれごとに、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを蓄積することを特徴とする請求項1乃至3のいずれかに記載の画像一致点検出装置。
【請求項5】
前記パターン検出部で検出されるパターン番号が、基準となるビットマップ画像に含まれる確率を算出する確率算出部を備え、
前記パターン蓄積部は、前記確率が所定の閾値未満である前記パターン番号に対応する前記パターン情報のみを蓄積することを特徴とする請求項1乃至4のいずれかに記載の画像一致点検出装置。
【請求項6】
前記パターン蓄積部は、
前記確率をその大きさに応じて複数の段階に分類する段階分類部と、
前記複数の段階のそれぞれごとに設けられ、対応する段階またはそれ以下の前記確率の段階に属する前記特徴点パターン情報の候補の数を計測する特徴点候補計数部と、
前記複数の段階のそれぞれに対応して設けられ、前記特徴点パターン情報の候補の前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納する複数の蓄積バッファと、
前記特徴点候補計測部で計測された数が所定の閾値未満であれば、対応する前記蓄積バッファへの格納を許可し、前記特徴点候補計測部で計測された数が前記閾値以上であれば、対応する段階以上のすべての前記蓄積バッファへの格納を禁止するパターン蓄積制御部と、を有することを特徴とする請求項5に記載の画像一致点検出装置。
【請求項7】
前記特徴点パターン情報をそれぞれ含む2以上の画像の中の一つの画像を処理対象画像として選択し、前記特徴点パターン情報を含む他の画像を参照して、前記処理対象画像の前記特徴点パターン情報と前記他の画像の前記特徴点パターン情報との間で前記一致点検出を行い、検出された一致点情報に基づいて前記処理対象画像の移動、回転および拡縮処理の少なくとも一つを行って、前記処理対象画像のブレを補正するブレ補正部を備えることを特徴とする請求項1乃至6のいずれかに記載の画像一致点検出装置。
【請求項8】
複数のビットマップ画像のそれぞれにおける複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出し、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納し、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出し、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を一致点情報として検出することを特徴とする画像一致点検出方法。
【請求項9】
複数のビットマップ画像のそれぞれにおける隣接する複数画素からなる画素ブロックのパターン画像を、前記画素ブロック内の全画素のビット数の総和である本来の画素ビット数以下のビット数で画素ブロックの特徴を表す数値であるパターン番号で表現し、前記画素ブロックの前記パターン番号と前記画素ブロックの位置を表すパターン位置とを組にしたパターン情報を前記画素ブロックごとに検出し、
前記複数のビットマップ画像のそれぞれに含まれる前記パターン情報を前記パターン番号により分類し、前記パターン番号と、同一の前記パターン番号の出現回数と、それぞれの前記パターン番号に対応する前記パターン位置に関する情報とを格納し、
前記複数のビットマップ画像のそれぞれについて、前記パターン蓄積部に格納された情報を用いて、前記パターン番号の出現回数が1回だけの前記パターン情報を特徴点パターン情報として抽出し、
前記複数のビットマップ画像のそれぞれについて前記特徴点パターン情報として抽出された前記パターン情報の前記パターン番号が一致しているか否かを判断し、一致している前記パターン番号を一致点情報として検出するプログラムを記録したコンピュータ読み取り可能な記録媒体。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26A】
【図26B】
【図26C】
【図26D】
【図26E】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26A】
【図26B】
【図26C】
【図26D】
【図26E】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【公開番号】特開2011−229080(P2011−229080A)
【公開日】平成23年11月10日(2011.11.10)
【国際特許分類】
【出願番号】特願2010−99029(P2010−99029)
【出願日】平成22年4月22日(2010.4.22)
【特許番号】特許第4689758号(P4689758)
【特許公報発行日】平成23年5月25日(2011.5.25)
【出願人】(596046118)株式会社市川ソフトラボラトリー (19)
【Fターム(参考)】
【公開日】平成23年11月10日(2011.11.10)
【国際特許分類】
【出願日】平成22年4月22日(2010.4.22)
【特許番号】特許第4689758号(P4689758)
【特許公報発行日】平成23年5月25日(2011.5.25)
【出願人】(596046118)株式会社市川ソフトラボラトリー (19)
【Fターム(参考)】
[ Back to top ]