(57)【特許請求の範囲】
【請求項１】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
【請求項２】
前記判定部は、
前記２つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える請求項１記載の弧検出装置。
【請求項３】
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する請求項２記載の弧検出装置。
【請求項４】
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える請求項１乃至３何れか一項に記載の弧検出装置。
【請求項５】
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす請求項４記載の弧検出装置。
【請求項６】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部と、を備え、
前記判定部は、
前記２つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備え、
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出し、
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する弧検出装置。
【請求項７】
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定し、
前記判定の結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
【請求項８】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、弧を検出する弧検出装置、弧検出プログラム及び携帯端末装置に関する。
【背景技術】
【０００２】
画像上で楕円を検出する技術として、エッジを抽出してハフ変換を行う方式が知られている。ハフ変換は様々な形状の図形検出に応用可能な特徴抽出法である。一方、ハフ変換は、変換で扱うパラメータ数に応じて処理時間が長くなり、メモリ消費も多くなる。楕円を検出する場合、座標（Ｘ，Ｙ）、半径（短辺，長辺）と最低４つのパラメータを扱うため、楕円検出にかかる処理時間は長く、メモリ消費量も多かった。
【０００３】
そこで、ハフ変換を用いずに、楕円の弧を検出する技術がある。例えば、円弧を検出する技術として、図形の細線化及び折れ線近似に基づいて円弧を検出する技術が記載されている（特許文献１、２、３）。また、楕円などを含む閉領域を抽出する技術として、地図上で線分や曲線で囲まれた閉領域を抽出する技術がある（特許文献４）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特公平０７−１０４９５４号公報
【特許文献２】特開昭６３−２１３０８７号公報
【特許文献３】特開平０１−１８０６７８号公報
【特許文献４】特開２００６−２９３８０９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１乃至３の技術における折れ線近似による円弧の検出では、細線が途切れていない範囲でなければ円弧を抽出できないという問題点があった。この問題点を回避するために、エッジ抽出を高感度に行うことが考えられるが、より多くの細線で円弧検出処理を行わなければならず、処理時間がかかるとともに、誤検出の可能性が高くなってしまう。
【０００６】
また、特許文献１に記載されている線分からの円又は円弧の再構成や、特許文献３に記載されている隣り合う折れ線の連続性を調べる方法では、円の中心や半径を推定する方式が開示されている。しかし、この方式では、円の長径と短径との比が大きい楕円では適切に検出できないという問題点があった。
【０００７】
また、特許文献４の技術では、閉領域を抽出することはできるものの、その閉領域が楕円であることは判断できず、閉領域を構成する線分の内側に別の線分がある場合は閉領域を抽出できないという問題点があった。
【０００８】
そこで、開示の技術は、上記課題に鑑みてなされたものであり、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができることを目的とする。
【課題を解決するための手段】
【０００９】
開示の一態様における弧検出装置は、画像を入力する入力部と、前記画像から複数の線分を検出する線分検出部と、前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、を備える。
【発明の効果】
【００１０】
開示の技術は、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。
【図面の簡単な説明】
【００１１】
【図１】弧検出装置の構成の一例を示すブロック図。
【図２】検出部の構成の一例を示すブロック図。
【図３】線分検出の一例を示す図。
【図４】線分データのデータ構造の一例を示す図。
【図５】線分の一例を示す図。
【図６】角度の定義を説明するための図。
【図７】線分連結情報のデータ構造の一例を示す図。
【図８】２つの線分の近接関係を説明するための図。
【図９】２つの線分の角度関係を説明するための図。
【図１０】線分連鎖情報のデータ構造の一例を示す図。
【図１１】実施例１における楕円検出処理の一例を示すフローチャート。
【図１２】実施例１における線分連結処理の一例を示すフローチャート。
【図１３】検出された線分の端点、位置及び角度変化量を示す図。
【図１４】実施例１における近接判定処理の一例を示すフローチャート。
【図１５】実施例１における角度関係判定処理の一例を示すフローチャート。
【図１６】角度平均及び角度差算出処理の一例を示すフローチャート。
【図１７】線分連結情報の一例を示す図。
【図１８】実施例１における線分連鎖処理の一例を示すフローチャート。
【図１９】実施例１における線分連鎖抽出処理の一例を示すフローチャート。
【図２０】実施例１におけるロールバック処理の一例を示すフローチャート。
【図２１】実施例１における連分連鎖を一つにまとめる処理の一例を示すフローチャート。
【図２２】実施例１における弧検出処理の一例を示すフローチャート。
【図２３】各処理結果のデータの一例を示す図。
【図２４】実施例１における楕円の位置推定処理の一例を示すフローチャート。
【図２５】実施例１における楕円検出処理の一例を示すフローチャート。
【図２６】楕円検出の手順（その１）を図形で示す図。
【図２７】実施例１における角度変化の方向確認処理の一例を示すフローチャート。
【図２８】楕円検出の手順（その２）を図形で示す図。
【図２９】線分連鎖が一巡する場合の図形を示す図。
【図３０】楕円を８分割した場合の一例を示す図。
【図３１】実施例２における方向抽出処理の一例を示すフローチャート。
【図３２】実施例２における時計回り方向に揃える処理の一例を示すフローチャート。
【図３３】実施例２における最初の方向抽出処理（その１）の一例を示すフローチャート。
【図３４】実施例２における最初の方向抽出処理（その２）の一例を示すフローチャート。
【図３５】実施例２における最初の方向抽出処理（その３）の一例を示すフローチャート。
【図３６】実施例２における最後の方向等抽出処理の一例を示すフローチャート。
【図３７】実施例２における楕円検出処理（その１）の一例を示すフローチャート。
【図３８】実施例２における楕円検出処理（その２）の一例を示すフローチャート。
【図３９】ｅ２のｉｎｉＰｏｓの違いによる図形を説明するための図。
【図４０】処理Ｂの一例を説明するための図。
【図４１】携帯端末装置のハードウェア構成の一例を示す図。
【図４２】画像処理装置のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【００１２】
以下、添付図面を参照しながら各実施例について詳細に説明する。
【００１３】
［実施例１］
＜構成＞
図１は、各実施例に共通する弧検出装置１０の構成の一例を示すブロック図である。図１において、弧検出装置１０は、入力部１０１、制御部１０２、検出部１０３、出力部１０４を含む。
【００１４】
入力部１０１は、撮像素子により撮像された画像データを取得し、制御部１０２に画像データを入力する。以下、画像データは、単に画像ともいう。
【００１５】
制御部１０２は、各部に対するデータのやり取りや、各部の制御を行う。例えば、制御部１０２は、入力部１０１から画像を取得した場合、検出部１０３に画像を出力し、弧を検出するよう検出部１０３を制御する。制御部１０２は、検出部１０３による検出結果を取得し、出力部１０４に出力する。
【００１６】
検出部１０３は、制御部１０２から画像を取得すると、この画像に対し、楕円又は楕円の一部（例えば、弧）を検出する処理を実行する。検出部１０３は、検出結果を制御部１０２に返す。検出部１０３の詳細は後述する。
【００１７】
出力部１０４は、制御部１０２から取得した検出結果及び／又は画像を取得し、次の工程の処理部に対し、検出結果及び／又は画像を出力する。
【００１８】
次に、検出部１０３の構成について説明する。図２は、各実施例における検出部１０３の構成の一例を示すブロック図である。検出部１０３は、線分検出部２０１、判定部２０２、弧検出部２０３、楕円検出部２０４を含む。
【００１９】
線分検出部２０１は、取得した画像に対し、線分検出を行う。例えば、線分検出部２０１は、画像からエッジを抽出し、抽出したエッジに対しハフ変換を用いて線分を検出する。線分を検出するハフ変換は、パラメータが少ないため、処理負荷は大きくない。なお、線分検出部２０１は、その他の従来技術を用いて線分を検出してもよい。
【００２０】
図３は、線分検出の一例を示す図である。図３（Ａ）は、入力された画像を示し、図３（Ｂ）は、図３（Ａ）に示す画像に対し、線分検出を行った後の画像を示す。線分検出部２０１は、図３（Ｂ）に示すように、画像から線分を検出する。以降の処理では、これらの線分から、図３（Ｂ）に示すａ１１やａ１２のような同じ方向に角度が変化する線分の連なりが検出される。
【００２１】
線分検出部２０１は、検出した線分の線分データを保持する。図４は、線分データのデータ構造の一例を示す図である。図４に示す線分データは、線分ＩＤ、端点（ｐｔ１，ｐｔ２）座標、線分の長さ、線分の角度（０〜１７９）を有する。
【００２２】
図５は、線分の一例を示す図である。図５に示す例では、線分の端点ｐｔ１、ｐｔ２のそれぞれの座標はｐｔ１（８０，１２０）、ｐｔ２（１６０，４０）であり、長さは１１３であり、角度は４５度とする。
【００２３】
図６は、角度の定義を説明するための図である。図６に示すように、画像に対して垂直方向の上方（時計の０時方向）を０度とし、水平方向の右方向（時計の３時方向）を９０度とし、垂直方向の下方（時計の６時方向）を１８０度とする。しかし、１８０度は０度として、角度は０〜１７９度で表わすことにする。なお、角度は、０〜３５９度で表現してもよい。
【００２４】
図２に戻り、判定部２０２は、線分検出部２０１により検出された複数の線分に対し、楕円の一部（弧）として関連付けられるかを判定し、関連付けられると判定した線分に対し、関連付けを行う。判定部２０２は、線分連結部２１１、線分連鎖部２１２を含む。
【００２５】
線分連結部２１１は、２つの線分が弧をなす線分として連結できるかを、２つの線分の位置及び角度を用いて判定し、連結できると判定した線分の関連付けを行う。線分連結部２１１は、連結した線分の情報を示す線分連結情報を生成し、保持する。
【００２６】
図７は、線分連結情報のデータ構造の一例を示す図である。図７に示すように、線分連結情報は、線分ＩＤと、端点ｐｔ１、ｐｔ２からの他の線分へのリンク情報ｂ１１とを含む。リンク情報ｂ１１は、リンク数と、リンク数分の線分リンクを含む。線分リンクは、図７のｂ１２に示すように、リンク先の線分ＩＤ、リンク先の線分の端点ｐｔ１、ｐｔ２のどちらにリンクしているか、リンク先の線分に対する角度変化量を含む。
【００２７】
図８、９を用いて、線分連結部２１１が連結する（関連付ける）線分について説明する。図８は、２つの線分の近接関係を説明するための図である。図８（Ａ）は、２つの線分は近接すると判定される例を示す。図８（Ａ）に示す交点ｃ１１は、２つの線分の延長線上の交点である。線分連結部２１１は、交点ｃ１１に近い各線分の端点が、交点ｃ１１から所定距離以内であれば、近接すると判定する。所定距離は、例えば２つの線分の長さの平均の１／４である。所定距離は他にも２つの線分の平均の長さの１／３などでもよい。図８（Ａ）に示す場合は、所定距離の条件を満たすので近接すると判定される。
【００２８】
図８（Ｂ）は、２つの線分は近接すると判定される例を示す。図８（Ｂ）に示す交点ｃ１２は、２つの線分の交点である。線分連結部２１１は、交点ｃ１２に近い各線分の端点が、交点ｃ１２から所定距離以内であれば、近接すると判定する。図８（Ｂ）に示す場合は、所定距離の条件を満たすので近接すると判定される。
【００２９】
図８（Ｃ）は、２つの線分は近接しないと判定される例を示す。図８（Ｃ）に示す交点ｃ１３は、２つの線分の延長線上の交点である。線分連結部２１１は、交点ｃ１３と、交点ｃ１３に近い各線分の端点との距離が所定距離以上離れているため、これらの線分を近接しないと判定する。
【００３０】
図９は、２つの線分の角度関係を説明するための図である。図９（Ａ）は、２つの線分は連結すると判定される例を示す。図９（Ａ）に示すθ１は、２つの線分の角度変化量を示す。線分連結部２１１は、角度θ１が所定角度未満であれば、連結すると判定する。所定角度は、例えば４０度である。この場合、角度変化量θ１が所定角度より小さいため、線分連結部２１１は、これらの線分を連結すると判定する。
【００３１】
図９（Ｂ）は、２つの線分は連結しないと判定される例を示す。図９（Ｂ）に示すθ２は、２つの線分の角度変化量を示す。この場合、線分連結部２１１は、この角度変化量θ２が所定角度以上であるため、これらの線分は連結しないと判定する。
【００３２】
図９（Ｃ）は、２つの線分は連結しないと判定される例を示す。図９（Ｃ）に示すθ３は、２つの線分の角度変化量を示す。この場合、線分連結部２１１は、角度変化量θ３は、所定角度未満であるが、２つの線分の位置関係がＮＧであるため、連結しないと判定する。位置関係については、例えば、２つの線分の中心のＸ座標が左右に位置しているか、Ｙ座標が同程度の位置に位置しているかなどを判定する。位置関係の判定の詳細は後述する。
【００３３】
線分連結部２１１は、図８、９に示すように、２つの線分の端点同士が近接していて、２つの線分の角度変化量が小さく、２つの線分が適切な位置にあるかを判定し、これらの条件を満たすと判定した線分を連結する（関連付ける）。線分連結部２１１は、連結された線分の線分連結情報を生成し、保持する。
【００３４】
図２に戻り、線分連鎖部２１２は、線分連結部２１１から線分連結情報を取得する。線分連鎖部２１２は、両端点で連結されている線分（以下、基準線分ともいう）を探し、この基準線分と連結される線分が他の線分と連結されているかを判定する。
【００３５】
線分連鎖部２１２は、他の線分と連結されている場合は、これらの線分を連鎖するとして関連付ける。線分連鎖部２１２は、基準線分を移動させてこの処理を繰り返し、連鎖数を増やしていく。以下、この処理を連鎖探索処理という。線分連鎖部２１２は、連鎖探索処理を行って、連鎖した線分の情報を示す線分連鎖情報を生成し、保持する。
【００３６】
図１０は、線分連鎖情報のデータ構造の一例を示す図である。図１０に示す例では、線分連鎖情報は、要素数（線分数）、要素数分の要素リストを含む。図１０に示すｄ１１は、要素のデータを示す。要素のデータは、線分ＩＤ、線分リンク番号、端点フラグ、リンク先への角度変化量を有する。
【００３７】
線分リンク番号は、線分連結で抽出した端点からのリンクの番号である。端点フラグは、線分ＩＤの線分のｐｔ１、ｐｔ２のいずれかの端点とリンクするかを示す。
【００３８】
図２に戻り、弧検出部２０３は、線分連鎖情報を取得し、角度変化が同一方向の線分連鎖であり、要素数（線分数）が閾値以上の線分連鎖を抽出する。まず、弧検出部２０３は、取得した線分連鎖情報に基づき、その線分連鎖が、角度変化が同一方向の線分連鎖かを判定する。角度変化が同一方向の線分連鎖の場合、弧検出部２０３は、その線分連鎖に含まれる線分（要素数）をカウントする。弧検出部２０３は、カウント値が閾値以上であれば、この角度変化が同一方向の線分連鎖に含まれる線分を、楕円の一部（弧）であるとして検出する。
【００３９】
楕円検出部２０４は、弧検出部２０３により検出された弧を所定の条件を満たす場合に組み合わせ、組み合わせ結果から楕円を検出する。楕円検出部２０４は、後述するように、楕円の一部が欠けている場合でも楕円とみなして検出することができる。また、楕円検出部２０４は、線分連鎖部２１２により線分が一巡した場合は、一巡した線分の線分連鎖情報を取得し、楕円であるかの確認処理を行う。
【００４０】
＜動作＞
次に、弧検出装置１０の動作について説明する。図１１は、実施例１における楕円検出処理の一例を示すフローチャートである。図１１に示すように、ステップＳ１１で、線分検出部２０１は、取得した画像から線分を検出する。線分検出処理は、従来の技術を用いればよい。
【００４１】
ステップＳ１２で、線分連結部２１１は、検出された全線分に対し、線分の位置及び角度に基づいて連結（関連付け）できる線分がないかを判定する。線分連結部２１１は、連結できると判定した線分を連結し、線分連結情報を生成し、保持する。
【００４２】
ステップＳ１３で、線分連鎖部２１２は、線分連結情報に基づいて、連結された線分が連鎖するかを判定する。線分連鎖部２１２は、連鎖すると判定された線分を連鎖し（関連付け）、線分連鎖情報を生成し、保持する。
【００４３】
ステップＳ１４で、弧検出部２０３は、線分連鎖情報に基づいて、角度変化が同一方向の線分連鎖を抽出し、線分連鎖の要素数（線分数）が閾値以上であるかを判定する。弧検出部２０３は、角度変化が同一方向であり、要素数が閾値以上である線分連鎖に含まれる線分を、弧として検出する。
【００４４】
ステップＳ１５で、楕円検出部２０４は、検出された弧を所定の条件を満たす場合に組み合わせる。楕円検出部２０４は、この組み合わせに基づいて、楕円を検出する。以下、ステップＳ１２〜Ｓ１５の各処理を具体的に説明する。
【００４５】
（１）線分連結処理
図１２は、実施例１における線分連結処理の一例を示すフローチャートである。図１２に示す処理は、ステップＳ１２に相当し、線分検出処理により検出された線分の全ての組み合わせに対して実行される。なお、検出された線分には、他の線分を識別するために線分ＩＤ（例えば０，１，２，・・・，ｎ）が付与される。
【００４６】
ステップＳ１０１で、線分連結部２１１は、線分ＩＤが０の線分をＡの線分として抽出し、Ａ＝０とする。
【００４７】
ステップＳ１０２で、線分連結部２１１は、線分検出部２０１により検出された線分数を取得し、Ａが（線分数−１）未満であるかを判定する。Ａが（線分数−１）未満である場合（ステップＳ１０２−ＹＥＳ）ステップＳ１０３に進み、Ａが（線分数−１）以上である場合（ステップＳ１０２−ＮＯ）この処理を終了する。図では、ＹＥＳをＹ、ＮＯをＮと表現する。
【００４８】
ステップＳ１０３で、線分連結部２１１は、線分ＩＤがＡ＋１の線分をＢとして抽出し、Ｂ＝Ａ＋１とする。
【００４９】
ステップＳ１０４で、線分連結部２１１は、Ｂが線分数未満であるかを判定する。Ｂが線分数未満である場合（ステップＳ１０４−ＹＥＳ）ステップＳ１０６に進み、Ｂが線分数以上である場合（ステップＳ１０４−ＮＯ）ステップＳ１０５に進む。
【００５０】
ステップＳ１０５で、線分連結部２１１は、線分ＩＤがＡ＋１の線分をＡとして抽出し、Ａ＝Ａ＋１とする。ステップＳ１０５の処理後はステップＳ１０２に戻る。
【００５１】
ステップＳ１０６で、線分連結部２１１は、抽出した線分Ａ，Ｂの近接判定処理を行う。近接判定については、図１４を用いて後述する。
【００５２】
ステップＳ１０７で、線分連結部２１１は、線分Ａ，Ｂの近接判定がＯＫであるかを判定する。「近接判定がＯＫ」の場合、線分Ａ，Ｂは近接する。近接判定がＯＫである場合（ステップＳ１０７−ＹＥＳ）ステップＳ１０９に進み、近接判定がＮＧである場合（ステップＳ１０７−ＮＯ）ステップＳ１０８に進む。
【００５３】
ステップＳ１０８で、線分連結部２１１は、線分ＩＤがＢ＋１の線分をＢとして抽出し、Ｂ＝Ｂ＋１とする。ステップＳ１０８の処理後はステップＳ１０４に戻る。
【００５４】
ステップＳ１０９で、線分連結部２１１は、線分Ａ，Ｂの角度関係判定処理を行う。角度関係判定については、図１５を用いて後述する。
【００５５】
ステップＳ１１０で、線分連結部２１１は、角度関係がＯＫであるかを判定する。「角度関係がＯＫ」とは、２つの線分の角度変化が小さく、所定の位置関係にある場合をいう。角度関係がＯＫである場合（ステップＳ１１０−ＹＥＳ）ステップＳ１１１に進み、角度関係がＮＧである場合（ステップＳ１１０−ＮＯ）ステップＳ１０８に進む。
【００５６】
ステップＳ１１１で、線分連結部２１１は、線分連結情報をメモリに記録する。ステップＳ１１１の処理後はステップＳ１０８に戻る。これにより、全ての線分の組み合わせに対して線分連結処理を行うことができ、関連付けられた線分の組み合わせに対する線分連結情報を保持することができる。
【００５７】
次に、具体例を用いて、近接判定処理及び角度関係判定処理を説明する。図１３は、検出された線分の端点、位置及び角度を示す図である。図１３に示す例では、線分ＩＤ０〜７に対し、近接する線分の角度変化量を示す。
【００５８】
（１−１）近接判定処理
図１４は、実施例１における近接判定処理の一例を示すフローチャートである。図１４に示すステップＳ２０１で、線分連結部２１１は、線分Ａ，Ｂの平均の長さを算出する。
【００５９】
ステップＳ２０２で、線分連結部２１１は、線分Ａ，Ｂの交点を抽出する。線分Ａ，Ｂが実際に交わらない場合は、線分連結部２１１は、両線分を延長し、延長線上の交点を抽出する。
【００６０】
ステップＳ２０３で、線分連結部２１１は、線分の交点から、両線分の交点に近いほうの端点までの距離が、例えば平均長さの１／４以下であるかを判定する。この距離が平均長さの１／４以下である場合（ステップＳ２０３−ＹＥＳ）ステップＳ２０４に進み、この距離が平均長さの１／４より長い場合（ステップＳ２０３−ＮＯ）ステップＳ２０５に進む。「１／４」については、実験により適切な値が与えられればよい。
【００６１】
ステップＳ２０４で、線分連結部２１１は、この２つの線分は、近接判定ＯＫであると判定する。ステップＳ２０５で、線分連結部２１１は、この２つの線分は、近接判定ＮＧであると判定する。
【００６２】
（１−２）角度関係判定処理
図１５は、実施例１における角度関係判定処理の一例を示すフローチャートである。図１５に示すステップＳ３０１で、線分連結部２１１は、線分Ａ，Ｂの角度平均及び角度差を算出する。線分Ａ，Ｂの角度平均及び角度差の算出については、図１６を用いて後述する。
【００６３】
ステップＳ３０２で、線分連結部２１１は、線分Ａ，Ｂの角度差が４０度未満であるかを判定する。角度差が４０度未満である場合（ステップＳ３０２−ＹＥＳ）ステップＳ３０３に進み、角度差が４０度以上である場合（ステップＳ３０２−ＮＯ）ステップＳ３１１に進む。
【００６４】
ステップＳ３０３で、線分連結部２１１は、Ｘ座標での位置関係の判定処理を行う。線分連結部２１１は、両線分の中間点のＸ座標を比較し、左にある線分を線分Ｌ、右にある線分を線分Ｒとする。
【００６５】
このとき、線分連結部２１１は、次の条件を満たすかを判定する。
線分Ｌの中間点のＸ座標＜線分Ｒの両端点のＸ座標  かつ
線分Ｒの中間点のＸ座標＞線分Ｌの両端点のＸ座標
線分連結部２１１は、この条件を満たす場合、Ｘ座標での位置関係をＯＫとする。線分連結部２１１は、条件を満たさない場合、Ｘ座標での位置関係はＮＧとする。線分連結部２１１は、例えば、この２つの線分にはＸ座標の位置関係の判定結果を表すフラグを立てるとよい。
【００６６】
ステップＳ３０４で、線分連結部２１１は、Ｙ座標での位置関係の判定処理を行う。線分連結部２１１は、両線分の中間点のＹ座標を比較し、上にある線分を線分Ｕ、下にある線分を線分Ｄとする。
【００６７】
このとき、線分連結部２１１は、次の条件を満たすかを判定する。
線分Ｕの中間点のＹ座標＜線分Ｄの両端点のＹ座標  かつ
線分Ｄの中間点のＹ座標＞線分Ｕの両端点のＹ座標
線分連結部２１１は、この条件を満たす場合、Ｙ座標での位置関係をＯＫとする。線分連結部２１１は、例えば、この２つの線分にはＹ座標の位置関係がＯＫであるフラグを立てる。画像上のＹ座標は、下に行くほど値が大きくなるとする。
【００６８】
ステップＳ３０５で、線分連結部２１１は、両線分の角度の平均が３０度未満又は１５０度以上であるかを判定する。この条件を満たす場合（ステップＳ３０５−ＹＥＳ）ステプＳ３０６に進み、この条件を満たさない場合（ステップＳ３０５−ＮＯ）ステップＳ３０８に進む。
【００６９】
ステップＳ３０６で、線分連結部２１１は、Ｙ座標での位置関係がＯＫであるかを判定する。Ｙ座標での位置関係がＯＫである場合（ステップＳ３０６−ＹＥＳ）ステップＳ３０７に進み、Ｙ座標での位置関係がＮＧである場合（ステップＳ３０６−ＮＯ）ステップＳ３１１に進む。
【００７０】
ステップＳ３０７で、線分連結部２１１は、この２つの線分は、角度関係判定がＯＫであると判定する。
【００７１】
ステップＳ３０８で、線分連結部２１１は、両線分の角度の平均が６０度以上かつ１２０度未満であるかを判定する。この条件を満たす場合（ステップＳ３０８−ＹＥＳ）ステプＳ３０９に進み、この条件を満たさない場合（ステップＳ３０８−ＮＯ）ステップＳ３１０に進む。
【００７２】
ステップＳ３０９で、線分連結部２１１は、Ｘ座標での位置関係がＯＫであるかを判定する。Ｘ座標での位置関係がＯＫである場合（ステップＳ３０９−ＹＥＳ）ステップＳ３０７に進み、Ｘ座標での位置関係がＮＧである場合（ステップＳ３０９−ＮＯ）ステップＳ３１１に進む。
【００７３】
ステップＳ３１０で、線分連結部２１１は、Ｘ座標での位置関係がＯＫであり、Ｙ座標での位置関係がＯＫであるかを判定する。この条件を満たす場合（ステップＳ３１０−ＹＥＳ）ステップＳ３０７に進み、この条件を満たさない場合（ステップＳ３１０−ＮＯ）ステップＳ３１１に進む。
【００７４】
ステップＳ３１１で、線分連結部２１１は、この２つの線分は、角度関係がＮＧであると判定する。
【００７５】
（１−２−１）角度平均及び角度差算出
図１６は、角度平均及び角度差算出処理の一例を示すフローチャートである。図１６に示すステップＳ４０１で、線分連結部２１１は、次の式によりａｎｇＡ２を算出する。
ａｎｇＡ２＝線分Ａの角度＋９０
【００７６】
ステップＳ４０２で、線分連結部２１１は、ａｎｇＡ２が１８０度以上であるかを判定する。１８０度以上である場合（ステップＳ４０２−ＹＥＳ）ステップＳ４０３に進み、１８０度未満である場合（ステップＳ４０２−ＮＯ）ステップＳ４０４に進む。
【００７７】
ステップＳ４０３で、線分連結部２１１は、次の式によりａｎｇＡ２を算出する。
ａｎｇＡ２＝ａｎｇＡ２−１８０
【００７８】
ステップＳ４０４で、線分連結部２１１は、次の式によりａｎｇＢ２を算出する。
ａｎｇＢ２＝線分Ｂの角度＋９０
【００７９】
ステップＳ４０５で、線分連結部２１１は、ａｎｇＢ２が１８０度以上であるかを判定する。１８０度以上である場合（ステップＳ４０５−ＹＥＳ）ステップＳ４０６に進み、１８０度未満である場合（ステップＳ４０５−ＮＯ）ステップＳ４０７に進む。
【００８０】
ステップＳ４０６で、線分連結部２１１は、次の式によりａｎｇＢ２を算出する。
ａｎｇＢ２＝ａｎｇＢ２−１８０
【００８１】
ステップＳ４０７で、線分連結部２１１は、角度差１を次の式により算出する。
角度差１＝（線分Ａの角度−線分Ｂの角度）の絶対値
【００８２】
ステップＳ４０８で、線分連結部２１１は、角度差２を次の式により算出する。
角度差２＝（ａｎｇＡ２−ａｎｇＢ２）の絶対値
【００８３】
ステップＳ４０９で、線分連結部２１１は、角度差１が角度差２以下であるかを判定する。角度差１が角度差２以下である場合（ステップＳ４０９−ＹＥＳ）ステップＳ４１０に進み、角度差１が角度差２より大きい場合（ステップＳ４０９−ＮＯ）ステップＳ４１１に進む。
【００８４】
ステップＳ４１０で、線分連結部２１１は、次の式により角度平均を算出する。
角度平均＝（線分Ａの角度＋線分Ｂの角度）／２
線分連結部２１１は、次の式により角度差を算出する。
角度差＝角度差１
【００８５】
ステップＳ４１１で、線分連結部２１１は、次の式により角度平均を算出する。
角度平均＝（（ａｎｇＡ２＋ａｎｇＢ２）／２）−９０
線分連結部２１１は、次の式により角度差を算出する。
角度差＝角度差２
【００８６】
ステップＳ４１２で、線分連結部２１１は、算出した角度平均が０未満であるかを判定する。０未満である場合（ステップＳ４１２−ＹＥＳ）ステップＳ４１３に進み、０以上である場合（ステップＳ４１２−ＮＯ）この処理を終了する。
【００８７】
ステップＳ４１３で、線分連結部２１１は、次の式により角度平均を修正する。
角度平均＝１８０＋角度平均
以上の処理を行うことで、角度平均を求めることができる。
【００８８】
図１７は、線分連結情報の一例を示す図である。図１７に示す線分連結情報は、図１３に示す線分から線分連結処理を行った結果を示す。
【００８９】
図１７に示すように、線分ＩＤ＝０のｐｔ１側には、２つの線分が関連（リンク）付けられ、ｌｉｎｋＮｕｍ＝２が付与される。「ｌｉｎｋＮｕｍ」は、リンク総数を表す。「リンク０」は、線分ＩＤ＝１の線分とのリンクを表す。
【００９０】
線分リンク番号「リンク０」は、ｌｉｎｋＩｄ、ｌｉｎｋＰｔ、ａｎｇｌｅの各データを有する。「ｌｉｎｋＩｄ」は、関連付けられている線分の線分ＩＤを示す。「ｌｉｎｋＰｔ」は、関連付けられている線分の端点を示す。「ａｎｇｌｅ」は、基準となる線分から関連付けられた線分への角度変化量を示し、時計回りを正とする。図１７に示す例では、基準となる線分は、線分ＩＤ＝０の線分であり、関連付けられた線分は、線分ＩＤ＝１の線分である。
【００９１】
例えば、線分リンク番号「リンク０」は、ｌｉｎｋＩｄ＝１、ｌｉｎｋＰｔ＝ｐｔ２、ａｎｇｌｅ＝３０の各データを有する。線分リンク番号「リンク１」は、線分ＩＤ＝２の線分とのリンクを表す。「リンク１」は、ｌｉｎｋＩｄ＝２、ｌｉｎｋＰｔ＝ｐｔ１、ａｎｇｌｅ＝１５の各データを有する。
【００９２】
図１７に示すように、線分ＩＤ＝０の線分のｐｔ２側には、１つの線分が関連（リンク）付けられ、ｌｉｎｋＮｕｍ＝１が付与される。「リンク０」は、線分ＩＤ＝４の線分とのリンクを表す。「リンク０」は、ｌｉｎｋＩｄ＝４、ｌｉｎｋＰｔ＝ｐｔ２、ａｎｇｌｅ＝−１８の各データを有する。図１７に示すように、線分連結部２１１は、全ての線分に対して、線分連結情報を生成する。
【００９３】
（２）線分連鎖処理
図１８は、実施例１における線分連鎖処理の一例を示すフローチャートである。図１８に示す処理は、図１１に示すステップＳ１３、Ｓ１４に相当する。図１８に示すステップＳ５０１で、線分連鎖部２１２は、初期化のため、探索するＩＤを０に設定する。
【００９４】
ステップＳ５０２で、線分連鎖部２１２は、ＩＤが全線分数未満であるかを判定する。ＩＤが全線分数未満である場合（ステップＳ５０２−ＹＥＳ）ステップＳ５０３に進み、ＩＤが全線分数以上である場合（ステップＳ５０２−ＮＯ）この処理を終了する。
【００９５】
ステップＳ５０３で、線分連鎖部２１２は、ＩＤと同じ線分ＩＤの線分について、ｐｔ１、ｐｔ２両方に線分リンクがあるかを判定する。「線分リンクがある」とは、他の線分と関連付け（リンク）されている場合をいう。両方に線分リンクがある場合（ステップＳ５０３−ＹＥＳ）ステップＳ５０５に進み、両方に線分リンクがない場合（ステップＳ５０３−ＮＯ）ステップＳ５０４に進む。
【００９６】
ステップＳ５０４で、線分連鎖部２１２は、ＩＤに１を加算する。ステップＳ５０４の処理後は、ステップＳ５０２に戻る。
【００９７】
ステップＳ５０５で、線分連鎖部２１２は、探索開始線分ＩＤ＝ＩＤとする。ステップＳ５０６で、線分連鎖部２１２は、探索開始線分ＩＤと同じ線分ＩＤを有する線分のｐｔ１側で、線分のリンク数を増やす線分連鎖抽出処理を行う。線分連鎖抽出処理は、図１９を用いて後述する。
【００９８】
ステップＳ５０７で、線分連鎖部２１２は、線分のリンク数を増やした結果、線分の連鎖が一巡したかを判定する。線分連鎖部２１２は、探索開始線分ＩＤと同じ線分ＩＤに戻ってきた場合に、一巡したと判定できる。一巡した場合（ステップＳ５０７−ＹＥＳ）ステップＳ５０８に進み、一巡しなかった場合（ステップＳ５０７−ＮＯ）ステップＳ５０９に進む。
【００９９】
ステップＳ５０８で、楕円検出部２０４は、角度変化方向の確認処理を行う。角度変化方向の確認処理は、図２７を用いて後述する。
【０１００】
ステップＳ５０９で、線分連鎖部２１２は、探索開始線分ＩＤと同じ線分ＩＤを有する線分のｐｔ２側で、線分連鎖抽出処理を行う。連分連鎖抽出処理は、図１９を用いて後述する。
【０１０１】
ステップＳ５１０で、線分連鎖部２１２は、ｐｔ１側の連鎖と、ｐｔ２側の連鎖とを１つにまとめる。この処理は、図２１を用いて後述する。
【０１０２】
ステップＳ５１１で、弧検出部２０３は、ステップＳ５１０で１つにまとめられた線分連鎖から、角度変化が同一方向であり、線分数が閾値以上の線分連鎖を検出する。検出した線分連鎖は、弧であり、楕円の一部となりうる。この処理は、弧検出処理として図２２を用いて後述する。ステップＳ５１１は、図１１に示すステップＳ１４に相当する。
【０１０３】
ステップＳ５１１の処理後は、ステップＳ５０４に進み、全ての線分に対して処理を実行する。
【０１０４】
（２−１）線分連鎖抽出処理
図１９は、実施例１における線分連鎖抽出処理の一例を示すフローチャートである。図１９に示すステップＳ６０１で、線分連鎖部２１２は、線分連鎖を探索するための初期化を行う。例えば、要素数ｎｕｍ＝０、最大要素数ｍａｘ＝０、注目線分ｌｉｄ＝探索開始線分ＩＤ、線分リンクｌｉｎｋ＝注目端点の０番目の線分リンクが設定される。
【０１０５】
ステップＳ６０２で、線分連鎖部２１２は、注目線分ｌｉｄの注目端点の線分リンク数が０より大きいかを判定する。線分リンク数が０より大きい場合（ステップＳ６０２−ＹＥＳ）、ステップＳ６０３に進み、線分リンク数が０以下である場合（ステップＳ６０２−ＮＯ）ステップＳ６０８に進む。
【０１０６】
ステップＳ６０３で、線分連鎖部２１２は、連鎖探索リスト［ｎｕｍ］に、注目線分ｌｉｄ、注目中の線分リンク番号、線分リンクｌｉｎｋの端点フラグ、角度変化量を記録する。
【０１０７】
ステップＳ６０４で、線分連鎖部２１２は、注目線分ｌｉｄをｌｉｎｋ先の線分ＩＤに更新する。また、線分連鎖部２１２は、ｌｉｎｋを新ｌｉｄの元ｌｉｎｋとリンクしている端点の反対側の端点に設定する。これは、図１３を用いて説明すれば、線分ＩＤ＝０から線分ＩＤ＝１に更新した場合、ｌｉｎｋは、線分ＩＤ＝０のｐｔ１から線分ＩＤ＝１のｐｔ１に更新される。つまり、新ｌｉｎｋは、線分ＩＤ＝１の線分が線分ＩＤ＝０の線分とリンクしている端点の反対側に設定される。
【０１０８】
ステップＳ６０５で、線分連鎖部２１２は、ｎｕｍに１を加算する。ｎｕｍは、リンク数を表す。
【０１０９】
ステップＳ６０６で、注目線分ｌｉｄが探索開始線分ＩＤと同じであるかを判定する。注目線分ｌｉｄが探索開始線分ＩＤと同じである場合（ステップＳ６０６−ＹＥＳ）ステプＳ６０７に進み、注目線分ｌｉｄが探索開始線分ＩＤと違う場合（ステップＳ６０６−ＮＯ）ステップＳ６０２に戻る。
【０１１０】
ステップＳ６０７で、線分連鎖部２１２は、完全に一巡していると判定し、現在の連鎖探索リスト［０〜ｎｕｍ］を線分連鎖の抽出結果とする。
【０１１１】
ステップＳ６０８で、線分連鎖部２１２は、ｎｕｍがｍａｘ以上であるかを判定する。ｎｕｍがｍａｘ以上である場合（ステップＳ６０８−ＹＥＳ）ステップＳ６０９に進み、ｎｕｍがｍａｘ未満である場合（ステップＳ６０８−ＮＯ）ステップＳ６１０に進む。
【０１１２】
ステップＳ６０９で、線分連鎖部２１２は、Ｓ６０３で記録した連鎖探索リスト［０〜ｎｕｍ］を所定の記録領域に記録する。以下では、所定の記録領域を、最大連鎖記録領域と呼ぶ。この連鎖探索リストが線分連鎖情報になる。
【０１１３】
ステップＳ６１０で、線分連鎖部２１２は、ロールバック処理を行う。ロールバック処理は、線分連鎖の枝分かれした連鎖に対してリンクを辿るための処理である。ロールバック処理は、図２０を用いて後述する。
【０１１４】
ステップＳ６１１で、線分連鎖部２１２は、ｎｕｍが０より大きいかを判定する。ｎｕｍが０より大きい場合（ステップＳ６１１−ＹＥＳ）ステップＳ６０２に戻り、ｎｕｍが０以下の場合（ステップＳ６１１−ＮＯ）ステップＳ６１２に進む。
【０１１５】
ステップＳ６１２で、線分連鎖部２１２は、最大連鎖記録領域に記録された連鎖探索リストを線分連鎖の抽出結果とする。
【０１１６】
以上の処理を行うことで、線分連鎖部２１２は、探索開始線分から一番長い線分連鎖を抽出することができる。
【０１１７】
（２−１−１）ロールバック処理
図２０は、実施例１におけるロールバック処理の一例を示すフローチャートである。図２０に示すステップＳ７０１で、線分連鎖部２１２は、ｎｕｍが０より大きいかを判定する。ｎｕｍが０より大きい場合（ステップＳ７０１−ＹＥＳ）ステップＳ７０２に進み、ｎｕｍが０より以下の場合（ステップＳ７０１−ＮＯ）処理を終了する。
【０１１８】
ステップＳ７０２で、線分連鎖部２１２は、連鎖探索リスト［ｎｕｍ−１］の線分リンク番号に１を追加する。これは、線分連鎖の終端の一つ前の線分に戻り、その線分の枝分かれした線分を探すための処理である。
【０１１９】
ステップＳ７０３で、線分連鎖部２１２は、連鎖探索リスト［ｎｕｍ−１］について、線分リンク番号が端点フラグ側のリンク総数より小さいかを判定する。リンク番号がリンク総数よりも小さい場合（ステップＳ７０３−ＹＥＳ）ステップＳ７０４に進み、リンク番号がリンク総数以上である場合（ステップＳ７０３−ＮＯ）ステップＳ７０５に進む。
【０１２０】
ステップＳ７０４で、線分連鎖部２１２は、注目線分ｌｉｄを連鎖探索リスト［ｎｕｍ−１］の端点フラグ側の線分リンク番号のリンクが指す線分ＩＤに更新する。線分連鎖部２１２は、線分リンクを注目線分ｌｉｄの、連鎖探索リスト［ｎｕｍ−１］の線分とリンクしている端点の反対側の端点に設定する。これは、線分連鎖の終端の手前の線分から枝分かれした線分に対して連鎖探索処理を開始するための処理である。
【０１２１】
ステップＳ７０５で、線分連鎖部２１２は、ｎｕｍから１を減算する。ステップＳ７０５の処理後はステップＳ７０１に戻る。これにより、ステップＳ７０５で、最大連鎖から逆に辿っていき探索開始線分に戻ったとき、又はステップＳ７０４の処理後に、ロールバック処理を終了する。
【０１２２】
（２−２）線分連鎖を一つにまとめる処理
図２１は、実施例１における連分連鎖を一つにまとめる処理の一例を示すフローチャートである。図２１に示すステップＳ８０１で、線分連鎖部２１２は、この処理を行うための初期化を行う。例えば、要素数ｎｕｍ＝０、インデックスｉｄｘ＝ｐｔ２側の要素数−１が設定される。
【０１２３】
ステップＳ８０２で、線分連鎖部２１２は、ｉｄｘが０より大きいかを判定する。ｉｄｘが０より大きい場合（ステップＳ８０２−ＹＥＳ）ステップＳ８０３に進み、ｉｄｘが０以下の場合（ステップＳ８０２−ＮＯ）ステップＳ８０５に進む。
【０１２４】
ステップＳ８０３で、線分連鎖部２１２は、次の演算を行う。
合計線分連鎖［ｎｕｍ］＝ｐｔ２側の線分連鎖［ｉｄｘ］
合計線分連鎖［ｎｕｍ］の角度変化量＝ｐｔ２側の線分連鎖［ｉｄｘ−１］の角度変化量×（−１）
ここで、線分連鎖［］は、図１９に示すステップＳ６１２で抽出結果となる連鎖探索リスト［］である。
この処理は、線分連鎖を反対向きに辿っているので、角度は＋、−を入れ替えるための処理である。
【０１２５】
ステップＳ８０４で、線分連鎖部２１２は、次の演算を行う。
ｎｕｍ＝ｎｕｍ＋１
ｉｄｘ＝ｉｄｘ−１
ステップＳ８０４の処理後はステップＳ８０２に戻る。
【０１２６】
ステップＳ８０５で、線分連鎖部２１２は、ｉｄｘを０にする。ステップＳ８０６で、線分連鎖部２１２は、ｉｄｘがｐｔ１側の要素数より小さいかを判定する。ｉｄｘが要素数よりも小さい場合（ステップＳ８０６−ＹＥＳ）ステップＳ８０７に進み、ｉｄｘがｐｔ１側の要素数以上である場合（ステップＳ８０６−ＮＯ）この処理を終了する。
【０１２７】
ステップＳ８０７で、線分連鎖部２１２は、次の演算を行う。
合計線分連鎖［ｎｕｍ］＝ｐｔ１側の線分連鎖［ｉｄｘ］
【０１２８】
ステップＳ８０８で、線分連鎖部２１２は、次の演算を行う。
ｎｕｍ＝ｎｕｍ＋１
ｉｄｘ＝ｉｄｘ＋１
ステップＳ８０８の処理後はステップＳ８０６に戻る。
【０１２９】
以上の処理により、ｐｔ１側の線分連鎖とｐｔ２側の線分連鎖とを１つにまとめることができる。
【０１３０】
（３）弧検出処理
図２２は、実施例１における弧検出処理の一例を示すフローチャートである。図２２に示す処理は、図１１に示すステップＳ１４に相当する。弧は、楕円又は楕円の一部を含むとする。図２２に示すステップＳ９０１で、弧検出部２０３は、弧を検出するための初期化を行う。例えば、インデックスｉｄｘ＝１、始点ｐｏｓ＝０、連続数ｃｏｎｔ＝１が設定される。
【０１３１】
ステップＳ９０２で、弧検出部２０３は、ｉｄｘが合計要素数よりも小さいかを判定する。ｉｄｘが合計要素数よりも小さい場合（ステップＳ９０２−ＹＥＳ）ステップＳ９０３に進み、ｉｄｘが合計要素数以上である場合（ステップＳ９０２−ＮＯ）処理を終了する。
【０１３２】
ステップＳ９０３で、弧検出部２０３は、ｉｄｘが（合計要素数−１）と同じであるかを判定する。ｉｄｘが（合計要素数−１）と同じである場合（ステップＳ９０３−ＹＥＳ）ステップＳ９０７に進み、ｉｄｘが（合計要素数−１）と違う場合（ステップＳ９０３−ＮＯ）ステップＳ９０４に進む。
【０１３３】
ステップＳ９０４で、弧検出部２０３は、（ｉｄｘ−１）番目の角度変化量×ｉｄｘ番目の角度変化量が０より大きいかを判定する。これは、両者の角度変化量の符号（＋、−）が同じならば正になる。乗算結果が正である場合（ステップＳ９０４−ＹＥＳ）ステップＳ９０５に進み、乗算結果が０以下である場合（ステップＳ９０４−ＮＯ）ステップＳ９０７に進む。
【０１３４】
ステップＳ９０５で、弧検出部２０３は、ｃｏｎｔに１を加算する。ステップＳ９０６で、弧検出部２０３は、ｉｄｘに１を加算する。ステップＳ９０６の処理後はステップＳ９０２に戻る。
【０１３５】
ステップＳ９０７で、弧検出部２０３は、ｃｏｎｔが３以上であるかを判定する。ｃｏｎｔが３以上である場合（ステップＳ９０７−ＹＥＳ）ステップＳ９０８に進み、ｃｏｎｔが３未満である場合（ステップＳ９０７−ＮＯ）ステップＳ９０９に進む。
【０１３６】
ステップＳ９０８で、弧検出部２０３は、合計線分連鎖［ｐｏｓ〜ｉｄｘ］を弧（楕円又は楕円の一部）として記録する。
【０１３７】
ステップＳ９０９で、弧検出部２０３は、次の演算を行う。
ｐｏｓ＝ｉｄｘ
ｃｏｎｔ＝１
ステップ９０９の処理が終わると、ステップＳ９０６に進む。
【０１３８】
以上の処理を行うことで、合計線分連鎖のうち、同じ方向の角度変化をしている部分を楕円の一部として検出することができる。
【０１３９】
図２３は、各処理結果のデータの一例を示す図である。図２３は、図１３に示す線分に対し、図１８に示すステップＳ５０６、Ｓ５０９、Ｓ５１０、Ｓ５１１の各処理をした結果を示す。図２３に示す「ｌｉｎｅＩｄ」は線分ＩＤを表し、「ｌｉｎｋＰｔ」は端点フラグを表し、「ｌｉｎｋＩｄ」は線分リンク番号を表し、「ａｎｇｌｅ」は角度変化量を表す。
【０１４０】
図２３（Ａ）は、Ｓ５０６の処理結果のデータを示す。図２３（Ａ）は、線分ＩＤ＝０の線分のｐｔ１側の連鎖抽出結果を示す。図２３（Ａ）に示すように、線分ＩＤ＝０の線分のｐｔ１側では、線分ＩＤ（ｌｉｎｅＩｄ）＝２の線分、線分ＩＤ＝３の線分、線分ＩＤ＝５の線分が連鎖していることを表す。要素数は、リンク数を表し、この場合の要素数は４である。
【０１４１】
図２３（Ｂ）は、Ｓ５０９の処理結果のデータを示す。図２３（Ｂ）は、線分ＩＤ＝０の線分のｐｔ２側の連鎖抽出結果を示す。図２３（Ｂ）に示すように、線分ＩＤ＝０の線分のｐｔ２側では、線分ＩＤ＝４の線分が連鎖していることを表す。この場合の要素数は、２である。
【０１４２】
図２３（Ｃ）は、Ｓ５１０の処理結果のデータを示す。図２３（Ｃ）は、図２３（Ａ）に示すデータと、図２３（Ｂ）に示すデータとを重複を除いて１つにまとめた例を示す。この場合の要素数は、５である。
【０１４３】
図２３（Ｄ）は、Ｓ５１１の処理結果のデータを示す。図２３（Ｄ）は、図２３（Ｃ）に示す線分連鎖から、角度変化が同一方向の線分が抽出された結果を示す。図２３（Ｄ）に示すように、線分ＩＤ＝５の線分が、線分ＩＤ＝３の線分からの角度変化の符号が他の線分間の角度変化の符号と異なるため、リストから消去される。
【０１４４】
（４）楕円検出
以下に説明する処理は、図１１に示すステップＳ１５に相当する。
（４−１）楕円の位置推定処理
図２４は、実施例１における楕円の位置推定処理の一例を示すフローチャートである。図２４に示す処理で、弧（楕円の一部）が楕円のどの部分に相当するかを推定する。
【０１４５】
ステップＳ１００１で、楕円検出部２０４は、フラグ上、下、左、右をＯＦＦにセットする。ステップＳ１００２で、楕円検出部２０４は、ｉｄｘを０に設定する。
【０１４６】
ステップＳ１００３で、楕円検出部２０４は、ｉｄｘが（要素数−１）より小さいかを判定する。ｉｄｘが（要素数−１）より小さい場合（ステップＳ１００３−ＹＥＳ）ステップＳ１００４に進み、ｉｄｘが（要素数−１）以上である場合（ステップＳ１００３−ＮＯ）この処理を終了する。
【０１４７】
ステップＳ１００４で、楕円検出部２０４は、次の設定を行う。
ａ１＝ｉｄｘ番目の要素の線分の角度
ａ２＝（ｉｄｘ＋１）番目の要素の線分の角度
【０１４８】
ステップＳ１００５で、楕円検出部２０４は、次の条件を満たすかを判定する。
（４５≦ａ１＜９０）ＡＮＤ（９０≦ａ２＜１３５）又は
（４５≦ａ２＜９０）ＡＮＤ（９０≦ａ１＜１３５）
この条件を満たす場合（ステップＳ１００５−ＹＥＳ）ステップＳ１００８に進み、この条件を満たさない場合（ステップＳ１００５−ＮＯ）ステップＳ１００６に進む。
【０１４９】
ステップＳ１００６で、楕円検出部２０４は、次の条件を満たすかを判定する。
ａ１＜４５  ＡＮＤ  ａ２≧１３５  又は
ａ２＜４５  ＡＮＤ  ａ１≧１３５
この条件を満たす場合（ステップＳ１００６−ＹＥＳ）ステップＳ１０１２に進み、この条件を満たさない場合（ステップＳ１００６−ＮＯ）ステップＳ１００７に進む。
【０１５０】
ステップＳ１００７で、楕円検出部２０４は、ｉｄｘに１を加算する。ステップＳ１００７の処理後はステップＳ１００３に戻る。
【０１５１】
ステップＳ１００８で、楕円検出部２０４は、左側にある線分をＬ、右側にある線分をＲとし、２つの線分の交点を算出する。楕円検出部２０４は、線分Ｌについて、交点に近い端点のＹ座標をＬＹ１、他方をＬＹ２とし、線分Ｒについて、交点に近い端点のＹ座標をＲＹ１、他方をＲＹ２とする。
【０１５２】
ステップＳ１００９で、楕円検出部２０４は、次の条件を満たすかを判定する。なお、Ｙ座標は下に行くほど値が大きい。
ＬＹ１≦ＬＹ２  ＡＮＤ  ＲＹ１≦ＲＹ２
この条件を満たす場合（ステップＳ１００９−ＹＥＳ）ステップＳ１０１０に進み、この条件を満たさない場合（ステップＳ１００９−ＮＯ）ステップＳ１０１１に進む。
【０１５３】
ステップＳ１０１０で、楕円検出部２０４は、フラグ上をＯＮにし、交点座標を記録する。
【０１５４】
ステップＳ１０１１で、楕円検出部２０４は、フラグ下をＯＮにし、交点座標を記録する。ステップＳ１０１０、Ｓ１０１１の処理後はステップＳ１００７に戻る。
【０１５５】
ステップＳ１０１２で、楕円検出部２０４は、上側にある線分をＵ、下側にある線分をＤとし、２つの線分の交点を算出する。楕円検出部２０４は、線分Ｕについて、交点に近い端点のＸ座標をＵＸ１、他方をＵＸ２とし、線分Ｄについて、交点に近い端点のＸ座標をＤＸ１、他方をＤＸ２とする。
【０１５６】
ステップＳ１０１３で、楕円検出部２０４は、次の条件を満たすかを判定する。なお、Ｘ座標は、右に行くほど値が大きい。
ＵＸ１≦ＵＸ２  ＡＮＤ  ＤＸ１≦ＤＸ２
この条件を満たす場合（ステップＳ１０１３−ＹＥＳ）ステップＳ１０１４に進み、この条件を満たさない場合（ステップＳ１０１３−ＮＯ）ステップＳ１０１５に進む。
【０１５７】
ステップＳ１０１４で、楕円検出部２０４は、フラグ左をＯＮにし、交点座標を記録する。
【０１５８】
ステップＳ１０１５で、楕円検出部２０４は、フラグ右をＯＮにし、交点座標を記録する。ステップＳ１０１４、Ｓ１０１５の処理後はステップＳ１０１７に戻る。
【０１５９】
以上の処理を行うことで、楕円の一部が、楕円のどの部分に相当するかを推定し、楕円の一部に推定結果を示すフラグを立てることができる。
【０１６０】
（４−２）楕円検出処理
図２５は、実施例１における楕円検出処理の一例を示すフローチャートである。図２５に示すステップＳ１１０１で、楕円検出部２０４は、楕円検出のための初期化を行う。例えば、ｉｄｘ１＝０が設定される。
【０１６１】
ステップＳ１１０２で、楕円検出部２０４は、ｉｄｘ１が（楕円の一部数（弧の数）−１）より小さいかを判定する。ｉｄｘ１が（楕円の一部数−１）より小さい場合（ステップＳ１１０２−ＹＥＳ）ステップＳ１１０３に進み、ｉｄｘ１が（楕円の一部数−１）以上である場合（ステップＳ１１０２−ＮＯ）この処理を終了する。
【０１６２】
ステップＳ１１０３で、楕円検出部２０４は、次の演算を行う。
ｉｄｘ２＝ｉｄｘ１＋１
【０１６３】
ステップＳ１１０４で、楕円検出部２０４は、ｉｄｘ２が楕円の一部数より小さいかを判定する。ｉｄｘ２が楕円の一部数より小さい場合（ステップＳ１１０４−ＹＥＳ）ステップＳ１１０６に進み、ｉｄｘ２が楕円の一部数以上である場合（ステップＳ１１０４−ＮＯ）ステップＳ１１０５に進む。
【０１６４】
ステップＳ１１０５で、楕円検出部２０４は、ｉｄｘ１に１を加算する。ステップＳ１００５の処理後はステップＳ１００２に戻る。
【０１６５】
ステップＳ１１０６で、楕円検出部２０４は、次の設定を行う。
ｅ１＝ｉｄｘ１番目の楕円の一部
ｅ２＝ｉｄｘ２番目の楕円の一部
【０１６６】
ステップＳ１１０７で、楕円検出部２０４は、次の条件を満たすかを判定する。
ｅ１のフラグ上がＯＮ  ＡＮＤ  ｅ２のフラグ下がＯＮ、又は
ｅ１のフラグ下がＯＮ  ＡＮＤ  ｅ２のフラグ上がＯＮ
この条件を満たす場合（ステップＳ１１０７−ＹＥＳ）ステップＳ１１０８に進み、この条件を満たさない場合（ステップＳ１１０７−ＮＯ）ステップＳ１１１１に進む。
【０１６７】
ステップＳ１１０８で、楕円検出部２０４は、次の設定を行う。
Ｅ１＝ｅ１、ｅ２の上側
Ｅ２＝ｅ１、ｅ２の下側
【０１６８】
ステップＳ１１０９で、楕円検出部２０４は、以下の設定を行う。
Ｒ１＝Ｅ１を囲む矩形
Ｒ２＝Ｅ２を囲む矩形
【０１６９】
ステップＳ１１１０で、楕円検出部２０４は、次の条件を満たすかを判定する。
Ｅ１交点とＥ２交点のＸ座標の差分＜（Ｒ１、Ｒ２の平均幅／４）
この条件を満たす場合（ステップＳ１１１０−ＹＥＳ）ステップＳ１１１２に進み、この条件を満たさない場合（ステップＳ１１１０−ＮＯ）ステップＳ１１１１に進む。この条件は、線分の交点のうち、最も上側にある交点と、最も下側にある交点との差分が、楕円の一部を囲う矩形のＸ方向の幅の１／４未満であるかを調べる。「１／４」という数字は、所定の数字に適宜変更することができる。
【０１７０】
ステップＳ１１１１で、楕円検出部２０４は、ｉｄｘ２に１を加算する。ステップＳ１１１１の処理後はステップＳ１１０４に戻る。
【０１７１】
ステップＳ１１１２で、楕円検出部２０４は、Ｒ１高さ＜Ｒ２高さであるかを判定する。Ｒ１の高さがＲ２の高さよりも小さい場合（ステップＳ１１１２−ＹＥＳ）ステップＳ１１１３に進み、Ｒ１の高さがＲ２以上である場合（ステップＳ１１１２−ＮＯ）進む。
【０１７２】
ステップＳ１１１３で、楕円検出部２０４は、（Ｒ１の高さ×２）＞Ｒ２の高さの条件を満たすかを判定する。この条件を満たす場合（ステップＳ１１１３−ＹＥＳ）ステップＳ１１１５に進み、この条件を満たさない場合（ステップＳ１１１３−ＮＯ）ステップＳ１１１１に進む。
【０１７３】
ステップＳ１１１４で、楕円検出部２０４は、Ｒ１の高さ＜（Ｒ２の高さ×２）の条件を満たすかを判定する。この条件を満たす場合（ステップＳ１１１４−ＹＥＳ）ステップＳ１１１５に進み、条件を満たさない場合（ステップＳ１１１４−ＮＯ）ステップＳ１１１１に進む。
【０１７４】
ステップＳ１１１５で、楕円検出部２０４は、次の条件を満たすかを判定する。
（Ｒ２上辺Ｙ座標−Ｒ１下辺Ｙ座標）＜Ｒ１、Ｒ２の高さ平均
この条件を満たす場合（ステップＳ１１１５−ＹＥＳ）ステップＳ１１１６に進み、この条件を満たさない場合（ステップＳ１１１５−ＮＯ）ステップＳ１１１１に進む。
【０１７５】
ステップＳ１１１６で、楕円検出部２０４は、ｅ１とｅ２との組み合わせを楕円と判断する。ステップＳ１１１６の処理後はステップＳ１１１１に戻る。
【０１７６】
以上の処理を行うことで、検出された楕円の一部（弧）が楕円のどの部分に相当するかを判断し、楕円の一部（弧）を組み合わせることで、楕円を検出することができる。以上の処理は、両矩形の高さに大きな差が無く、上側の矩形と下側の矩形との間に大きな差がなければ、両矩形内の楕円の一部の組み合わせを楕円として検出する処理である。
【０１７７】
なお、以上の処理は、楕円の一部（弧）が上、下の場合を説明したが、楕円の一部（弧）が左、右の場合にも適用できる。例えば、図２５に示す処理の上、下を左、右に変え、ＸをＹに変え、高さを幅に変え、幅を高さに変えれば、楕円の一部が左、右にある場合でも、これらを組み合わせて楕円を検出することができる。
【０１７８】
図２６は、楕円検出の手順（その１）を図形で示す図である。図２６（Ａ）は、入力画像を示す。図２６（Ｂ）は、図２６（Ａ）の入力画像に対して、図１１に示す線分検出処理（Ｓ１１）を行い、線分を検出した結果の画像を示す。
【０１７９】
図２６（Ｃ）は、図２６（Ｂ）に示す線分に対して、図１１に示す線分連結処理（Ｓ１２）、線分連鎖処理（Ｓ１３）、弧検出処理（Ｓ１４）を行った結果の画像を示す。図２６（Ｃ）に示す点線枠内の線分は、弧として検出された線分連鎖を示す。
【０１８０】
図２６（Ｄ）は、図２６（Ｃ）に示す弧に対して、組み合わせを判断して楕円を検出した結果の画像を示す。図２６（Ｄ）に示す点線枠は、弧を囲む矩形を示す。図２６（Ｄ）に示すｄ１１は、楕円上部の交点を示し、ｄ１２は楕円下部の交点を示し、ｄ１３は交点のＸ座標の差分を示し、ｄ１４は、矩形間のＹ座標における差（Ｒ２上辺Ｙ座標−Ｒ１下辺Ｙ座標）を示す。
【０１８１】
（５）角度変化の方向確認処理
次に、連分連鎖が一巡した場合の処理について説明する。この処理は、図１８に示す線分連鎖が一巡した場合に行う処理である。
【０１８２】
図２７は、実施例１における角度変化の方向確認処理の一例を示すフローチャートである。図２７に示す処理は、図１１に示すステップＳ１５に相当する。図２７に示すステップＳ１２０１で、楕円検出部２０４は、線分連鎖部２１２から線分連鎖が一巡した線分連鎖情報を取得し、ｉｄｘを１に設定する。
【０１８３】
ステップＳ１２０２で、楕円検出部２０４は、ｉｄｘが線分連鎖数より小さいかを判定する。ｉｄｘが線分連鎖数より小さい場合（ステップＳ１２０２−ＹＥＳ）ステップＳ１２０３に進み、ｉｄｘが線分連鎖数以上になる場合（ステップＳ１２０２−ＮＯ）ステップＳ１２０５に進む。
【０１８４】
ステップＳ１２０３で、楕円検出部２０４は、次の条件を満たすかを判定する。
（０番目の要素の角度変化量×ｉｄｘ番目の要素の角度変化量）＞０
これは、角度変化量の符号が同じであれば正になり、２つの線分は、同一方向の角度変化をしているといえる。この条件を満たす場合（ステップＳ１２０３−ＹＥＳ）ステップＳ１２０２に戻り、この条件を満たさない場合（ステップＳ１２０３−ＮＯ）ステップＳ１２０４に進む。
【０１８５】
ステップＳ１２０４で、楕円検出部２０４は、一巡している線分連鎖を楕円ではないと判断する。一巡している線分連鎖の中に、１つでも角度変化の方向（符号）が同じでないものがあるからである。
【０１８６】
ステップＳ１２０５で、楕円検出部２０４は、一巡している線分連鎖を楕円であると判断する。一巡している線分連鎖の角度変化が、全て同じ方向（符号）であるからである。
【０１８７】
以上の処理を行うことで、線分連鎖が一巡している場合でも、適切に楕円を検出することができる。
【０１８８】
図２８は、楕円検出の手順（その２）を図形で示した図である。図２８（Ａ）は、入力画像を示す。図２８（Ｂ）は、図２８（Ａ）の入力画像に対して、図１１に示す線分検出処理（Ｓ１１）を行い、線分を検出した結果の画像を示す。
【０１８９】
図２８（Ｃ）は、図２８（Ｂ）に示す線分に対して、図１１に示す線分連結処理（Ｓ１２）、線分連鎖処理（Ｓ１３）を行った結果の画像を示す。図２８（Ｃ）に示す点線枠内の線分は、一巡した線分連鎖を示す。
【０１９０】
図２８（Ｄ）は、図２８（Ｃ）に示す線分連鎖に対して、角度変化の方向を確認して楕円を検出した結果の画像を示す。
【０１９１】
図２９は、線分連鎖が一巡する場合の図形を示す図である。図２９（Ａ）は楕円の図形を示し、図２９（Ｂ）は、楕円ではない図形を示す。図１１に示す線分連鎖処理（Ｓ１３）では、図２９（Ａ）、（Ｂ）どちらも一巡する線分連鎖として抽出される。しかし、楕円検出部２０４により、図２７に示す角度変化の確認処理を行えば、図２９（Ａ）に示す図形のみを楕円と判断することができる。
【０１９２】
以上、実施例１によれば、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。また、実施例１によれば、検出した弧を組み合わせることで楕円を検出することができる。これは、ハフ変換を用いて楕円検出するよりも高速にかつ処理負荷を軽減して楕円を検出することができる。また、実施例１によれば、楕円の長径と短径との比が大きい場合でも、適切に楕円を検出することができる。なお、従来技術のように、複数の弧を組み合わせる場合に、各弧の中心と半径が略一致することで一つの弧と推測する方法では、楕円の長径と短径との比が大きい場合（例えば細長い楕円）、各弧は一つの弧とは推測されない。各弧の中心と半径が異なるからである。しかし、実施例１の弧検出方法では、幅広く楕円の弧を検出することができる。
【０１９３】
［実施例２］
次に、実施例２における弧検出装置について説明する。実施例２では、楕円の一部が欠けている場合でも楕円とみなして楕円を検出する。実施例２における弧検出装置の構成は、図１に示す構成と同様であり、検出部の構成は、図２に示す構成と同様である。実施例２における弧を検出する方法は、実施例１と同様であるため、説明を省略する。実施例２では、楕円検出部２０４による楕円検出の方法が、実施例１と異なるため、以下では楕円検出部２０４について説明する。
【０１９４】
＜構成＞
楕円検出部２０４は、弧検出部２０３により検出された弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上であれば、これらの所定位置に相当する弧を楕円とみなして検出する。
【０１９５】
図３０は、楕円を８分割した場合の一例を示す図である。図３０に示すように、楕円が８分割され、分割された楕円の一部にそれぞれ方向０〜７の識別子が付与される。楕円検出部２０４は、検出された弧が、方向０〜７の楕円の一部のどこに相当するかを判定し、例えば６つ以上の方向に相当すると判定された場合、この６つ以上の方向に相当する弧を楕円とみなして検出する。楕円検出部２０４による楕円検出の具体的な処理は、処理手順を示して説明する。
【０１９６】
＜動作＞
次に、実施例２における弧検出装置１０の動作について説明する。実施例２では、図１１に示す処理手順と同様であり、楕円検出処理の具体的な処理が実施例１とは異なるため、図１１に示すステップＳ１５の処理について具体的に説明する。
【０１９７】
（６）方向抽出処理
楕円検出部２０４は、弧として検出された線分連鎖が属する方向を抽出する。図３１は、実施例２における方向抽出処理の一例を示すフローチャートである。図３１に示すステップＳ１３０１で、楕円検出部２０４は、インデックスｉｄｘを０に設定する。
【０１９８】
ステップＳ１３０２で、楕円検出部２０４は、ｉｄｘが線分連鎖数よりも小さいかを判定する。線分連鎖数は、弧検出部２０３により検出された弧（線分連鎖）の数である。ｉｄｘが線分連鎖数よりも小さい場合（ステップＳ１３０２−ＹＥＳ）ステップＳ１３０３に進み、ｉｄｘが線分連鎖数以上の場合（ステップＳ１３０２−ＮＯ）この処理を終了する。
【０１９９】
ステップＳ１３０３で、楕円検出部２０４は、線分連鎖［ｉｄｘ］を時計回り方向に揃える処理を行う。この処理は、図３２を用いて後述する。連分連鎖［ｉｄｘ］は、例えば、図２３（Ｄ）に示すリストを示す。
【０２００】
ステップＳ１３０４で、楕円検出部２０４は、線分連鎖［ｉｄｘ］の最初の方向（ｉｎｉＰｏｓ）を抽出する。この処理は、図３３〜図３５を用いて後述する。
【０２０１】
ステップＳ１３０５で、楕円検出部２０４は、線分連鎖［ｉｄｘ］の最後の方向（ｆｉｎＰｏｓ）を抽出する。この処理は、図３６を用いて後述する。
【０２０２】
ステップＳ１３０６で、楕円検出部２０４は、ｉｄｘに１を加算する。ステップＳ１３０６の処理の後は、ステップＳ１３０２に戻る。
【０２０３】
（６−１）時計回り方向に揃える処理
図３２は、実施例２における時計回り方向に揃える処理の一例を示すフローチャートである。図３２に示すステップＳ１４０１で、楕円検出部２０４は、線分連鎖［ｉｄｘ］の０番目の要素の角度変化量が０より小さいかを判定する。角度変化量が０より小さい場合（ステップＳ１４０１−ＹＥＳ）ステップＳ１４０２に進み、角度変化量が０以上の場合（ステップＳ１４０１−ＮＯ）この処理を終了する。
【０２０４】
ステップＳ１４０２で、楕円検出部２０４は、次の設定を行う。
ｃｎｔ０＝線分連鎖［ｉｄｘ］の長さ−１（長さ＝要素数）
ｃｎｔ１＝０
【０２０５】
ステップＳ１４０３で、楕円検出部２０４は、ｃｎｔ０が０より大きいかを判定する。ｃｎｔ０が０より大きい場合（ステップＳ１４０３−ＹＥＳ）ステップＳ１４０５に進み、ｃｎｔ０が０以下の場合（ステップＳ１４０３−ＮＯ）ステップＳ１４０４に進む。
【０２０６】
ステップＳ１４０４で、楕円検出部２０４は、線分連鎖［ｉｄｘ］を新線分連鎖［ｉｄｘ］に置き換える。
【０２０７】
ステップＳ１４０５で、楕円検出部２０４は、次の設定を行う。
新線分連鎖要素［ｃｎｔ１］＝線分連鎖要素「ｃｎｔ０」
【０２０８】
ステップＳ１４０６で、楕円検出部２０４は、次の設定を行う。
新線分連鎖要素［ｃｎｔ１］の角度変化量＝線分連鎖要素［ｃｎｔ０−１］の角度変化量×（−１）
【０２０９】
ステップＳ１４０７で、楕円検出部２０４は、ｃｎｔ０から１を減算し、ｃｎｔ１に１を加算する。ステップＳ１４０７の処理後は、ステップＳ１４０３に戻る。
【０２１０】
以上の処理を行うことで、線分連鎖の線分について、角度変化量がマイナス（反時計回り）をプラス（時計回り）に揃えることができる。
【０２１１】
（６−２）最初の方向抽出処理
図３３〜３５は、実施例２における最初の方向抽出処理の一例を示すフローチャートである。図３３に示すステップＳ１５０１で、楕円検出部２０４は、次の設定を行う。
ｌｉｎｅ０＝線分連鎖［ｉｄｘ］の０番目の線分
ｌｉｎｅ１＝線分連鎖［ｉｄｘ］の１番目の線分
【０２１２】
ステップＳ１５０２で、楕円検出部２０４は、次の設定を行う。
ａｎｇ０＝ｌｉｎｅ０の角度
ａｎｇ１＝ｌｉｎｅ１の角度
この角度は、絶対角度を表す。
【０２１３】
ステップＳ１５０３で、楕円検出部２０４は、次の設定を行う。
ｘｃ０＝ｌｉｎｅ０の中間点のＸ座標
ｙｃ０＝ｌｉｎｅ０の中間点のＹ座標
ｘｃ１＝ｌｉｎｅ１の中間点のＸ座標
ｙｃ１＝ｌｉｎｅ１の中間点のＹ座標
ステップＳ１５０２及びＳ１５０３は順不同である。
【０２１４】
ステップＳ１５０４で、楕円検出部２０４は、次の条件を満たすかを判定する。
４５≦ａｎｇ１＜９０  かつ
９０≦ａｎｇ２＜１３５
この条件を満たす場合（ステップＳ１５０４−ＹＥＳ）ステップＳ１５０５に進み、この条件を満たさない場合（ステップＳ１５０４−ＮＯ）ステップＳ１５０８に進む。
【０２１５】
ステップＳ１５０５で、楕円検出部２０４は、ｘｃ０＜ｘｃ１を満たすかを判定する。ｘｃ０がｘｃ１より小さい場合（ステップＳ１５０５−ＹＥＳ）ステップＳ１５０６に進み、ｘｃ０がｘｃ１以上の場合（ステップＳ１５０５−ＮＯ）ステップＳ１５０７に進む。
【０２１６】
ステップＳ１５０６で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、７であると判定する。ここで、「ｉｎｉＰｏｓ」の数字は、図３０に示す方向のことをいう。
【０２１７】
ステップＳ１５０７で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、３であると判定する。これにより、水平方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５０６及びＳ１５０７の処理後は図３６の処理に遷移する。
【０２１８】
ステップＳ１５０８で、楕円検出部２０４は、次の条件を満たすかを判定する。
１３５≦ａｎｇ１  かつ
ａｎｇ２＜２４
この条件を満たす場合（ステップＳ１５０８−ＹＥＳ）ステップＳ１５０９に進み、この条件を満たさない場合）（ステップＳ１５０８−ＮＯ）図３４に示す処理１に進む。
【０２１９】
ステップＳ１５０９で、楕円検出部２０４は、ｙｃ０がｙｃ１より小さいかを判定する。ｙｃ０がｙｃ１より小さい場合（ステップＳ１５０９−ＹＥＳ）ステップＳ１５１０に進み、ｙｃ０がｙｃ１以上の場合（ステップＳ１５０９−ＮＯ）ステップＳ１５１１に進む。
【０２２０】
ステップＳ１５１０で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、１であると判定する。
【０２２１】
ステップＳ１５１１で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、５であると判定する。これにより、垂直方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５１０及びＳ１５１１の処理後は図３６の処理に遷移する。
【０２２２】
図３４は、実施例２における最初の方向抽出処理（その２）の一例を示すフローチャートである。図３４に示すステップＳ１５１２で、楕円検出部２０４は、角度平均を次の式により算出する。
ａｖｅ＝（ａｎｇ０＋ａｎｇ１）／２
【０２２３】
ステップＳ１５１３で、楕円検出部２０４は、ａｖｅが４５より小さいかを判定する。ａｖｅが４５より小さい場合（ステップＳ１５１３−ＹＥＳ）ステップＳ１５１４に進み、ａｖｅが４５以上の場合（ステップ１５１３−ＮＯ）ステップＳ１５２１に進む。
【０２２４】
ステップＳ１５１４で、楕円検出部２０４は、ｙｃ０がｙｃ１より小さいかを判定する。ｙｃ０がｙｃ１より小さい場合（ステップＳ１５１４−ＹＥＳ）ステップＳ１５１５に進み、ｙｃ０がｙｃ１以上の場合（ステップＳ１５１４−ＮＯ）ステップＳ１５１８に進む。
【０２２５】
ステップＳ１５１５で、楕円検出部２０４は、ａｎｇ０が４５より小さいかを判定する。ａｎｇ０が４５より小さい場合（ステップＳ１５１５−ＹＥＳ）ステップＳ１５１６に進み、ａｎｇ０が４５以上の場合（ステップＳ１５１５−ＮＯ）ステップＳ１５１７に進む。
【０２２６】
ステップＳ１５１６で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、２であると判定する。
【０２２７】
ステップＳ１５１７で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、３であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５１６及びＳ１５１７の処理後は図３６に遷移する。
【０２２８】
ステップＳ１５１８で、楕円検出部２０４は、ａｎｇ０が４５より小さいかを判定する。ａｎｇ０が４５より小さい場合（ステップＳ１５１８−ＹＥＳ）ステップＳ１５１９に進み、ａｎｇ０が４５以上の場合（ステップＳ１５１８−ＮＯ）ステップＳ１５２０に進む。
【０２２９】
ステップＳ１５１９で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、６であると判定する。
【０２３０】
ステップＳ１５２０で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、７であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５１９及びＳ１５２０の処理後は図３６に遷移する。
【０２３１】
ステップＳ１５２１で、楕円検出部２０４は、ａｖｅが９０より小さいかを判定する。ａｖｅが９０より小さい場合（ステップＳ１５２１−ＹＥＳ）ステップＳ１５２２に進み、ａｖｅが９０以上の場合（ステップ１５２１−ＮＯ）図３５に示す処理２に進む。
【０２３２】
ステップＳ１５２２で、楕円検出部２０４は、ｘｃ０がｘｃ１より小さいかを判定する。ｘｃ０がｘｃ１より小さい場合（ステップＳ１５２２−ＹＥＳ）ステップＳ１５２３に進み、ｘｃ０がｘｃ１以上の場合（ステップＳ１５２２−ＮＯ）ステップＳ１５２６に進む。
【０２３３】
ステップＳ１５２３で、楕円検出部２０４は、ａｎｇ０が４５より小さいかを判定する。ａｎｇ０が４５より小さい場合（ステップＳ１５２３−ＹＥＳ）ステップＳ１５２４に進み、ａｎｇ０が４５以上の場合（ステップＳ１５２３−ＮＯ）ステップＳ１５２５に進む。
【０２３４】
ステップＳ１５２４で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、６であると判定する。
【０２３５】
ステップＳ１５２５で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、７であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５２４及びＳ１５２５の処理後は図３６に遷移する。
【０２３６】
ステップＳ１５２６で、楕円検出部２０４は、ａｎｇ０が４５より小さいかを判定する。ａｎｇ０が４５より小さい場合（ステップＳ１５２６−ＹＥＳ）ステップＳ１５２７に進み、ａｎｇ０が４５以上の場合（ステップＳ１５２６−ＮＯ）ステップＳ１５２８に進む。
【０２３７】
ステップＳ１５２７で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、２であると判定する。
【０２３８】
ステップＳ１５２８で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、３であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５２７及びＳ１５２８の処理後は図３６に遷移する。
【０２３９】
図３５は、実施例２における最初の方向抽出処理（その３）の一例を示すフローチャートである。図３５に示すステップＳ１５２９で、楕円検出部２０４は、ａｖｅが１３５より小さいかを判定する。ａｖｅが１３５より小さい場合（ステップＳ１５２９−ＹＥＳ）ステップＳ１５２０に進み、ａｖｅが１３５以上の場合（ステップＳ１５２９−ＮＯ）ステップＳ１５２７に進む。
【０２４０】
ステップＳ１５３０で、楕円検出部２０４は、ｘｃ０がｘｃ１より小さいかを判定する。ｘｃ０がｘｃ１より小さい場合（ステップＳ１５３０−ＹＥＳ）ステップＳ１５３１に進み、ｘｃ０がｘｃ１以上の場合（ステップＳ１５３０−ＮＯ）ステップＳ１５３４に進む。
【０２４１】
ステップＳ１５３１で、楕円検出部２０４は、ａｎｇ０が１３５より小さいかを判定する。ａｎｇ０が１３５より小さい場合（ステップＳ１５３１−ＹＥＳ）ステップＳ１５３２に進み、ａｎｇ０が１３５以上の場合（ステップＳ１５３１−ＮＯ）ステップＳ１５３３に進む。
【０２４２】
ステップＳ１５３２で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、０であると判定する。
【０２４３】
ステップＳ１５３３で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、１であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５３２及びＳ１５３３の処理後は図３６に遷移する。
【０２４４】
ステップＳ１５３４で、楕円検出部２０４は、ａｎｇ０が１３５より小さいかを判定する。ａｎｇ０が１３５より小さい場合（ステップＳ１５３４−ＹＥＳ）ステップＳ１５３５に進み、ａｎｇ０が１３５以上の場合（ステップＳ１５３４−ＮＯ）ステップＳ１５３６に進む。
【０２４５】
ステップＳ１５３５で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、４であると判定する。
【０２４６】
ステップＳ１５３６で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、５であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５３５及びＳ１５３６の処理後は図３６に遷移する。
【０２４７】
ステップＳ１５３７で、楕円検出部２０４は、ｙｃ０がｙｃ１より小さいかを判定する。ｙｃ０がｙｃ１より小さい場合（ステップＳ１５３７−ＹＥＳ）ステップＳ１５３８に進み、ｙｃ０がｙｃ１以上の場合（ステップＳ１５３７−ＮＯ）ステップＳ１５４１に進む。
【０２４８】
ステップＳ１５３８で、楕円検出部２０４は、ａｎｇ０が１３５より小さいかを判定する。ａｎｇ０が１３５より小さい場合（ステップＳ１５３８−ＹＥＳ）ステップＳ１５３９に進み、ａｎｇ０が１３５以上の場合（ステップＳ１５３８−ＮＯ）ステップＳ１５４０に進む。
【０２４９】
ステップＳ１５３９で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、０であると判定する。
【０２５０】
ステップＳ１５４０で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、１であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５３９及びＳ１５４０の処理後は図３６に遷移する。
【０２５１】
ステップＳ１５４１で、楕円検出部２０４は、ａｎｇ０が１３５より小さいかを判定する。ａｎｇ０が１３５より小さい場合（ステップＳ１５４１−ＹＥＳ）ステップＳ１５４２に進み、ａｎｇ０が１３５以上の場合（ステップＳ１５４１−ＮＯ）ステップＳ１５４３に進む。
【０２５２】
ステップＳ１５４２で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、４であると判定する。
【０２５３】
ステップＳ１５４３で、楕円検出部２０４は、「ｉｎｉＰｏｓ」は、５であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップＳ１５４２及びＳ１５４３の処理後は図３６に遷移する。
【０２５４】
以上の処理を行うことで、線分連鎖の最初の線分が、楕円のどの部分に相当するかを判定することができる。
【０２５５】
（６−３）最後の方向等抽出処理
図３６は、最後の方向等抽出処理の一例を示すフローチャートである。図３６に示すステップＳ１６０１で、楕円検出部２０４は、次の式により基準角度ｂａｓｅを算出する。
ｂａｓｅ＝ａｎｇ０−（ａｎｇ０を４５で割った余り）
ｂａｓｅは、次の方向に該当するまでの角度を表す。１つの方向に相当するのは４５（３６０／８）度である。ａｎｇ０は、図３３に示すステップＳ１５０２のａｎｇ０である。
【０２５６】
ステップＳ１６０２で、楕円検出部２０４は、次の設定を行う。
ｆｉｎＰｏｓ＝ｉｎｉＰｏｓ
方向数＝１
方向数は、検出された弧に相当する、分割された楕円の一部の数を表す。
【０２５７】
ステップＳ１６０３で、楕円検出部２０４は、ｃｎｔ＝１とする。ステップＳ１６０４で、楕円検出部２０４は、ｃｎｔが線分連鎖［ｉｄｘ］の長さ（要素数）より小さいかを判定する。ｃｎｔが線分連鎖［ｉｄｘ］の長さより小さい場合（ステップＳ１６０４−ＹＥＳ）ステップＳ１６０５に進み、ｃｎｔが線分連鎖［ｉｄｘ］の長さ以上の場合（ステップＳ１６０４−ＮＯ）この処理を終了する。
【０２５８】
ステップＳ１６０５で、楕円検出部２０４は、以下の式により角度差を算出する。
角度差＝線分［ｃｎｔ］の角度−ｂａｓｅ
ステップＳ１６０６で、楕円検出部２０４は、次の条件を満たすかを判定する。
０≦角度差＜４５
この条件を満たす場合（ステップＳ１６０６−ＹＥＳ）ステップＳ１６０７に進み、この条件を満たさない場合（ステップＳ１６０６−ＮＯ）ステップＳ１６０８に進む。この条件を満たす場合は、次の線分を連鎖しても次の方向に到達していないことを表す。この条件を満たさない場合は、次の線分を連鎖したら次の方向に到達することを表す。
【０２５９】
ステップＳ１６０７で、楕円検出部２０４は、ｃｎｔに１を加算する。ステップＳ１６０７の処理後は、ステップＳ１６０４に戻る。
【０２６０】
ステップＳ１６０８で、楕円検出部２０４は、方向数に１を加算する。ステップＳ１６０９で、楕円検出部２０４は、ｆｉｎＰｏｓに１を加算する。ステップＳ１６０８及びＳ１６０９は、順不同である。
【０２６１】
ステップＳ１６１０で、楕円検出部２０４は、ｆｉｎＰｏｓが７より大きいかを判定する。ｆｉｎＰｏｓが７より大きい場合（ステップＳ１６１０−ＹＥＳ）ステップＳ１６１１に進み、ｆｉｎＰｏｓが７以下の場合（ステップＳ１６１０−ＮＯ）ステップＳ１６１２に進む。
【０２６２】
ステップＳ１６１１で、楕円検出部２０４は、ｆｉｎＰｏｓを０に設定する。ステップＳ１６１２で、楕円検出部２０４は、ｂａｓｅに４５を加算する。
【０２６３】
ステップＳ１６１３で、楕円検出部２０４は、ｂａｓｅが１８０以上になるかを判定する。ｂａｓｅが１８０以上である場合（ステップＳ１６１３−ＹＥＳ）ステップＳ１６１４に進み、ｂａｓｅが１８０未満の場合（ステップＳ１６１３−ＮＯ）ステップＳ１６１５に進む。
【０２６４】
ステップＳ１６１４で、楕円検出部２０４は、基準角度のｂａｓｅを０に設定する。ステップＳ１６１５で、楕円検出部２０４は、ｆｉｎＰｏｓが０であるかを判定する。ｆｉｎＰｏｓが０である場合（ステップＳ１６１５−ＹＥＳ）ステップＳ１６１６に進み、ｆｉｎＰｏｓが０でない場合（ステップＳ１６１５−ＮＯ）ステップＳ１６１７に進む。
【０２６５】
ステップＳ１６１６で、楕円検出部２０４は、上端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【０２６６】
ステップＳ１６１７で、楕円検出部２０４は、ｆｉｎＰｏｓが２であるかを判定する。ｆｉｎＰｏｓが２である場合（ステップＳ１６１７−ＹＥＳ）ステップＳ１６１８に進み、ｆｉｎＰｏｓが０でない場合（ステップＳ１６１７−ＮＯ）ステップＳ１６１９に進む。
【０２６７】
ステップＳ１６１８で、楕円検出部２０４は、右端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【０２６８】
ステップＳ１６１９で、楕円検出部２０４は、ｆｉｎＰｏｓが４であるかを判定する。ｆｉｎＰｏｓが４である場合（ステップＳ１６１９−ＹＥＳ）ステップＳ１６２０に進み、ｆｉｎＰｏｓが４でない場合（ステップＳ１６１９−ＮＯ）ステップＳ１６２１に進む。
【０２６９】
ステップＳ１６２０で、楕円検出部２０４は、下端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【０２７０】
ステップＳ１６２１で、楕円検出部２０４は、ｆｉｎＰｏｓが６であるかを判定する。ｆｉｎＰｏｓが６である場合（ステップＳ１６２１−ＹＥＳ）ステップＳ１６２２に進み、ｆｉｎＰｏｓが６でない場合（ステップＳ１６２１−ＮＯ）ステップＳ１６０７に進む。
【０２７１】
ステップＳ１６２２で、楕円検出部２０４は、左端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【０２７２】
以上の処理を行うことで、弧検出部２０３により検出された弧が、分割された楕円のどの位置に相当するかを判定でき、相当すると判定された楕円の一部の数や、楕円の端の座標を求めることができる。
【０２７３】
（７）楕円検出処理
図３７、３８は、実施例２における楕円検出処理の一例を示すフローチャートである。図３７に示すステップＳ１７０１で、楕円検出部２０４は、ｉｄｘ１に０を設定する。
【０２７４】
ステップＳ１７０２で、楕円検出部２０４は、ｉｄｘ１が（楕円の一部数−１）より小さいかを判定する。楕円の一部数は、相当すると判定した楕円の一部の数（方向数）である。ｉｄｘ１が（楕円の一部数−１）より小さい場合（ステップＳ１７０２−ＹＥＳ）ステップＳ１７０３に進む。ｉｄｘ１が（楕円の一部数−１）以上である場合（ステップＳ１７０２−ＮＯ）この処理を終了する。
【０２７５】
ステップＳ１７０３で、楕円検出部２０４は、次の設定を行う。
ｉｄｘ２＝ｉｄｘ１＋１
【０２７６】
ステップＳ１７０４で、楕円検出部２０４は、ｉｄｘ２が楕円の一部数より小さいかを判定する。ｉｄｘ２が楕円の一部数より小さい場合（ステップＳ１７０４−ＹＥＳ）ステプＳ１７０６に進み、ｉｄｘ２が楕円の一部数以上の場合（ステップＳ１７０４−ＮＯ）ステップＳ１７０５に進む。
【０２７７】
ステップＳ１７０５で、楕円検出部２０４は、ｉｄｘ１に１を加算する。ステップＳ１７０５の処理後、ステップＳ１７０２に戻る。
【０２７８】
ステップＳ１７０６で、楕円検出部２０４は、次の設定を行う。
ｅ１＝ｉｄｘ１番目の線分連鎖
ｅ２＝ｉｄｘ２番目の線分連鎖
【０２７９】
ステップＳ１７０７で、楕円検出部２０４は、次の条件を満たすかを判定する。
（ｅ１の方向数＋ｅ２の方向数）≧６
閾値の値（６）は、楕円検出の厳しさの度合いを示し、適宜設定変更可能である。ｅ１とｅ２の方向数の和が閾値以上の場合（ステップＳ１７０７−ＹＥＳ）ステップＳ１７０９に進み、ｅ１とｅ２の方向数の和が閾値未満の場合（ステップＳ１７０７−ＮＯ）ステップＳ１７０８に進む。
【０２８０】
ステップＳ１７０８で、楕円検出部２０４は、ｉｄｘ２に１を加算する。ステップＳ１７０８の処理後にステップＳ１７０４に戻る。
【０２８１】
ステップＳ１７０９で、楕円検出部２０４は、次の条件を満たすかを判定する。
ｅ１の方向数＝＝３  かつ
ｅ２の方向数＝＝３
この条件を満たす場合（ステップＳ１７０９−ＹＥＳ）ステップＳ１７１１に進み、この条件を満たさない場合（ステップＳ１７０９−ＮＯ）ステップＳ１７１０に進む。
【０２８２】
ステップＳ１７１０で、楕円検出部２０４は、処理Ａを行う。処理Ａについては、後述する。
【０２８３】
ステップＳ１７１１で、楕円検出部２０４は、次の条件を満たすかを判定する。
ｅ１のｉｎｉＰｏｓ＝＝０  かつ
ｅ２のｉｎｉＰｏｓ＝＝４又は５
この条件を満たす場合（ステップＳ１７１１−ＹＥＳ）ステップＳ１７１３に進み、この条件を満たさない場合（ステップＳ１７１１−ＮＯ）ステップＳ１７１２に進む。
【０２８４】
ステップＳ１７１２で、楕円検出部２０４は、処理Ｂを行う。処理Ｂについては、後述する。
【０２８５】
ステップＳ１７１３で、楕円検出部２０４は、次の設定を行う。
Ｒ１＝ｅ１を囲む矩形
Ｒ２＝ｅ２を囲む矩形
【０２８６】
ステップＳ１７１４で、楕円検出部２０４は、次の条件を満たすかを判定する。
ｅ１の右端交点Ｙ座標とｅ２の左端交点Ｙ座標の差分＜（Ｒ１，Ｒ２の平均の高さ／３）
Ｒ１，Ｒ２の高さとは、Ｙ方向の矩形の長さをいう。
この条件を満たす場合（ステップＳ１７１４−ＹＥＳ）ステップＳ１７１５に進み、この条件を満たさない場合（ステップＳ１７１４−ＮＯ）ステップＳ１７０８に戻る。
【０２８７】
ステップＳ１７１５で、楕円検出部２０４は、Ｒ１の幅がＲ２の幅より小さいかを判定する。Ｒ１の幅がＲ２の幅より小さい場合（ステップＳ１７１５−ＹＥＳ）ステップＳ１７１６に進み、Ｒ１の幅がＲ２の幅以上の場合（ステップＳ１７１５−ＮＯ）ステップＳ１７１７に進む。
【０２８８】
ステップＳ１７１６で、楕円検出部２０４は、（Ｒ１の幅×２）がＲ２の幅より大きいかを判定する。（Ｒ１の幅×２）がＲ２の幅よりも大きい場合（ステップＳ１７１６−ＹＥＳ）図３９に示す処理Ｃに進み、（Ｒ１の幅×２）がＲ２の幅以下の場合（ステップＳ１７１６−ＮＯ）ステップＳ１７０８に戻る。
【０２８９】
ステップＳ１７１７で、楕円検出部２０４は、Ｒ１の幅が（Ｒ２の幅×２）より小さいかを判定する。Ｒ１の幅が（Ｒ２の幅×２）より小さい場合（ステップＳ１７１７−ＹＥＳ）処理Ｃに進み、Ｒ１の幅が（Ｒ２の幅×２）以上の場合（ステップＳ１７１７−ＮＯ）ステップＳ１７０８に戻る。
【０２９０】
図３８は、実施例２における楕円検出処理（その２）の一例を示すフローチャートである。図３８に示すステップＳ１７１８で、楕円検出部２０４は、次の設定を行う。
ｘ１＝Ｒ１の左辺のＸ座標
ｘ２＝Ｒ２の右辺のＸ座標
【０２９１】
ステップＳ１７１９で、楕円検出部２０４は、次の条件を満たすかを判定する。
（ｘ１−ｘ２）≧０
この条件を満たす場合（ステップＳ１７１９−ＹＥＳ）ステップＳ１７２１に進み、この条件を満たさない場合（ステップＳ１７１９−ＮＯ）ステップＳ１７２０に進む。
【０２９２】
ステップＳ１７２０で、楕円検出部２０４は、次の条件を満たすかを判定する。
（ｘ２−ｘ１）＜（Ｒ１幅＋Ｒ２幅）／４
この条件を満たす場合（ステップＳ１７２０−ＹＥＳ）ステップＳ１７２２に進み、この条件を満たさない場合（ステップＳ１７２０−ＮＯ）ステップＳ１７０８に戻る。図３８に示す「Ｄ」は、図３７に示す「Ｄ」に遷移することを表し、つまり、ステップＳ１７０８に戻ることを表す。
【０２９３】
ステップＳ１７２１で、楕円検出部２０４は、次の条件を満たすかを判定する。
（ｘ１−ｘ２）＜（Ｒ１幅＋Ｒ２幅）／２
この条件を満たす場合（ステップＳ１７２１−ＹＥＳ）ステップＳ１７２２に進み、この条件を満たさない場合（ステップＳ１７２１−ＮＯ）ステップＳ１７０８に戻る。
【０２９４】
ステップＳ１７２２で、楕円検出部２０４は、次の式によりＹ１を算出する。
Ｙ１＝ｅ１右端交点Ｙ座標−Ｒ１上辺Ｙ座標
ステップＳ１７２３で、楕円検出部２０４は、ｅ２のｉｎｉＰｏｓが４であるかを判定する。ｅ２のｉｎｉＰｏｓが４である場合（ステップＳ１７２３−ＹＥＳ）ステップＳ１７２４に進み、ｅ２のｉｎｉＰｏｓが４でない場合（ステップＳ１７２３−ＮＯ）ステップＳ１７２５に進む。
【０２９５】
ステップＳ１７２４で、楕円検出部２０４は、次の式によりＹ２を算出する。
Ｙ２＝Ｒ２下辺Ｙ座標−ｅ２左端交点Ｙ座標
【０２９６】
ステップＳ１７２５で、楕円検出部２０４は、次の式によりＹ２を算出する。
Ｙ２＝ｅ２左端交点Ｙ座標−Ｒ２上辺Ｙ座標
【０２９７】
図３９は、ｅ２のｉｎｉＰｏｓの違いによる図形を説明するための図である。図３９（Ａ）は、ｅ２のｉｎｉＰｏｓが４である場合の例を示す。この場合、ステップＳ１７２３の判定でＹＥＳとなり、ステップＳ１７２４の処理がなされる。
【０２９８】
図３９（Ｂ）は、ｅ２のｉｎｉＰｏｓが５である場合の例を示す。この場合、ステップＳ１７２３の判定でＮＯとなり、ステップＳ１７２５の処理がなされる。
【０２９９】
ステップＳ１７２６で、楕円検出部２０４は、Ｙ１がＹ２より小さいかを判定する。Ｙ１がＹ２より小さい場合（ステップＳ１７２６−ＹＥＳ）ステップＳ１７２８に進み、Ｙ１がＹ２以上の場合（ステップＳ１７２６−ＮＯ）ステップＳ１７２７に進む。
【０３００】
ステップＳ１７２７で、楕円検出部２０４は、Ｙ１が（Ｙ２×２）より小さいかを判定する。Ｙ１が（Ｙ２×２）より小さい場合（ステップＳ１７２７−ＹＥＳ）ステップＳ１７２９に進み、Ｙ１が（Ｙ２×２）以上の場合（ステップＳ１７２７−ＮＯ）ステップＳ１７０８に戻る。
【０３０１】
ステップＳ１７２８で、楕円検出部２０４は、（Ｙ１×２）がＹ２より大きいかを判定する。（Ｙ１×２）がＹ２より大きい場合（ステップＳ１７２８−ＹＥＳ）ステップＳ１７２９に進み、（Ｙ１×２）がＹ２以下の場合（ステップＳ１７２８−ＮＯ）ステップＳ１７０８に戻る。
【０３０２】
ステップＳ１７２９で、楕円検出部２０４は、ｅ１とｅ２とで楕円であると検出する。以上の処理を行うことで、楕円一部が欠けている場合でも、楕円とみなして検出することができる。
【０３０３】
次に、ステップＳ１７１０の処理Ａについて説明する。ステップＳ１７０９の判定でＮＯということは、ｅ１の方向数とｅ２の方向数とが同じではなく、ｅ１とｅ２とを囲むそれぞれの矩形の大きさが異なる。よって、楕円検出部２０４は、ｅ１とｅ２とを囲むそれぞれの矩形の大きさを考慮して、これらの矩形が楕円と判断してもよいほど近い位置にあるかを判定すればよい。判定の基本的な処理はステップＳ１７１１以降に示す処理と同様である。
【０３０４】
例えば、図３９（Ａ）に示すＲ１に線分が４つ含まれる場合、Ｒ１の高さは、矩形に含まれる線分が一つ増えるためＲ２の高さよりも大きくなりやすい。そこで、楕円検出部２０４は、図３８に示すステップＳ１７２６のＹ１に係数（例えば３／４）を乗算することで、Ｒ１、Ｒ２の矩形の大きさを考慮して楕円検出処理を行えばよい。
【０３０５】
次に、ステップＳ１７１２の処理Ｂについて説明する。図４０は、ステップＳ１７１２の処理Ｂの一例を説明するための図である。処理Ｂでは、ｅ１，ｅ２のｉｎｉＰｏｓ値に応じてそれぞれ図３７、３８で説明したような処理をしてもよいが、図４０に示すように、ｅ１，ｅ２を回転／左右反転などの処理をして、図３７，３８で説明した処理を行うようにしてもよい。
【０３０６】
図４０（Ａ）は、元の線分連鎖を示す。図４０（Ｂ）は、元の線分連鎖を４５度回転させた例を示す。図４０（Ｃ）は、元の線分連鎖を９０度回転させた例を示す。図４０（Ｂ）や図４０（Ｃ）に示すように、元の線分連鎖を回転させた場合、その後の処理のために、各線分の始点、終点座標と角度変化量を変換する必要がある。楕円の一部に相当する方向については、回転に応じて４５度で１ずつ増加させればよい（７を超えたら０に戻る）。座標の変換については、例えば９０度単位の回転に限定すれば、Ｘ−Ｙ座標の入れ替えですみ、４５度単位でも角度が固定のため簡易な処理ですむ。よって、この変換処理は、大きな処理負荷にはならない。
【０３０７】
以上、実施例２によれば、楕円の一部が欠けている場合でも楕円とみなして楕円を検出することができる。
【０３０８】
［変形例］
図４１は、実施例１、２における弧検出装置１０を含む携帯端末装置３００のハードウェア構成の一例を示す図である。図４１に示す携帯端末装置３００は、アンテナ３０１、無線部３０２、ベースバンド処理部３０３、制御部３０４、出力部３０５、入力部３０６、メモリ３０７、電源３０８、カメラ３０９を有する。
【０３０９】
アンテナ３０１は、送信アンプで増幅された無線信号を送信し、また、基地局から無線信号を受信する。無線部３０２は、ベースバンド処理部３０３で拡散された送信信号をＤ／Ａ変換し、直交変調により高周波信号に変換し、その信号を電力増幅器により増幅する。無線部３０２は、受信した無線信号を増幅し、その信号をＡ／Ｄ変換してベースバンド処理部３０３に伝送する。
【０３１０】
ベースバンド処理部３０３は、送信データの誤り訂正符号の追加、データ変調、拡散変調、受信信号の逆拡散、受信環境の判定、各チャネル信号の閾値判定、誤り訂正復号などのベースバンド処理を行う。
【０３１１】
制御部３０４は、制御信号の送受信などの無線制御を行う。また、制御部３０４は、各部を制御し、各種処理を実行する。出力部３０５は、例えばＬＣＤ（Liquid Crystal Display）に対し、制御部３０４からの指示に基づき、データを出力する。入力部３０６は、例えばマイクやキーボードなどからデータを受け付ける。
【０３１２】
メモリ３０７は、例えばＲＯＭ（Read Only Memory）やＲＡＭ（Random Access Memory）などである。メモリ３０７は、各種データや携帯端末装置３００で実行されるプログラムを格納する。電源３０８は、携帯端末装置３００の電源を制御する。カメラ３０９は、撮像素子を有し、撮像画像を制御部３０４に出力する。
【０３１３】
なお、実施例１、２における制御部１０２、検出部１０３は、例えば制御部３０４やワークメモリとしてのメモリ３０７により実現され、入力部１０１は、カメラ３０９により、出力部１０４は、出力部３０５によりそれぞれ実現されうる。
【０３１４】
図４２は、実施例１、２における弧検出装置１０を含む画像処理装置４００のハードウェア構成の一例を示す図である。図４２に示す画像処理装置４００は、ＣＰＵ４０１、記憶装置４０２、メモリ４０３、読み取り装置４０４、通信インタフェース４０６、入出力装置４０７を含む。
【０３１５】
ＣＰＵ４０１は、各装置の制御やデータの演算、加工を行う。ＣＰＵ４０１は、メモリ４０３を利用して前述した弧検出処理を実行するためのプログラムを実行する。
【０３１６】
記憶装置４０２は、ＨＤＤ（Hard Disk Drive）などであり、アプリケーションソフトウェアなどに関連するデータを記憶する記憶装置である。記憶装置４０２は、例えば弧検出プログラムを格納する。なお、記憶装置４０２は、外部記録装置であってもよい。
【０３１７】
メモリ４０３は、例えばＲＯＭ（Read Only Memory）やＲＡＭ（Random Access Memory）などである。メモリ４０３は、例えばＣＰＵ４０１が実行する基本ソフトウェアであるＯＳやアプリケーションソフトウェアなどのプログラムやデータを記憶又は一時保存する記憶装置である。
【０３１８】
読み取り装置４０４は、ＣＰＵ４０１の指示に従って可搬型記録媒体４０５にアクセスする。可搬性記録媒体４０５は、例えば、半導体デバイス（ＰＣカード等）、磁気的作用により情報が入出力される媒体、光学的作用により情報が入出力される媒体を含むものとする。
【０３１９】
通信インタフェース４０６は、ＣＰＵ４０１の指示に従って、ネットワークを介してデータを送受信する。入出力装置４０７は、前述した各実施例では、カメラ、表示装置、ユーザからの指示を受け付けるデバイス等に相当する。
【０３２０】
なお、各実施例における構成で、制御部１０２、検出部１０３は、例えばＣＰＵ４０１やワークメモリとしてのメモリ４０３により実現され、入力部１０１、出力部１０４は、例えば入出力装置４０７により実現されうる。この画像処理装置４００は、デジタルカメラなどにも適用することができる。
【０３２１】
各実施例に係わる弧検出プログラムは、例えば、下記の形態で提供される。
・記憶装置４０２に予めインストールされている。
・可搬型記録媒体４０５により提供される。
・プログラムサーバ４１０からダウンロードする。
上記構成の携帯端末装置３００や画像処理装置４００で弧検出プログラムを実行することにより、各実施例に係わる装置が実現される。
【０３２２】
前述した各実施例における弧検出処理は、例えば、撮像画像内の皿を楕円とみなして検出し、撮影モードを自動で料理モードに変更するなどの機能に用いることができる。また、各実施例における弧検出処理は、皿の一部が料理や画面サイズの影響で欠けていた場合でも、皿を楕円とみなして検出することができる。よって、各実施例における弧検出処理を行う携帯端末装置やデジタルカメラの撮像部は、楕円の検出結果に基づいて、撮影モードを自動的に切り替えることができる。
【０３２３】
また、各実施例における弧検出処理は、目を楕円とみなして検出したりすることもできる。この場合、目の部分を拡大して前述した処理を行うようにすればよい。また、各実施例における弧検出処理は、外にある撮像装置のレンズについた雨粒を楕円とみなして検出し、この撮像装置を自動で電源ＯＦＦにするなどの場合にも適用できる。
【０３２４】
以上、各実施例について詳述したが、特定の実施例に限定されるものではなく、特許請求の範囲に記載された範囲内において、上記変形例以外にも種々の変形及び変更が可能である。
【０３２５】
なお、以上の実施例に関し、さらに以下の付記を開示する。
（付記１）
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
（付記２）
前記判定部は、
前記２つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える付記１記載の弧検出装置。
（付記３）
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する付記２記載の弧検出装置。
（付記４）
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える付記１乃至３何れか一項に記載の弧検出装置。
（付記５）
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす付記４記載の弧検出装置。
（付記６）
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する付記４記載の弧検出装置。
（付記７）
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定し、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
（付記８）
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、２つの線分のそれぞれの位置及び基準に対する角度に基づき、前記２つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた２つの線分に基づき、前記複数の線分のうち、該２つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
（付記９）
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部と、
前記楕円検出部による検出結果に応じて撮像モードを制御する撮像部と、
をさらに備える付記８記載の携帯端末装置。
【符号の説明】
【０３２６】
１０  弧検出装置
１０１  入力部
１０２  制御部
１０３  検出部
１０６  出力部
２０１  線分検出部
２０２  判定部
２０３  弧検出部
２０４  楕円検出部
【図１】
0005682282.tif 000002
【図２】
0005682282.tif 000003
【図３】
0005682282.tif 000004
【図４】
0005682282.tif 000005
【図５】
0005682282.tif 000006
【図６】
0005682282.tif 000007
【図７】
0005682282.tif 000008
【図８】
0005682282.tif 000009
【図９】
0005682282.tif 000010
【図１０】
0005682282.tif 000011
【図１１】
0005682282.tif 000012
【図１２】
0005682282.tif 000013
【図１３】
0005682282.tif 000014
【図１４】
0005682282.tif 000015
【図１５】
0005682282.tif 000016
【図１６】
0005682282.tif 000017
【図１７】
0005682282.tif 000018
【図１８】
0005682282.tif 000019
【図１９】
0005682282.tif 000020
【図２０】
0005682282.tif 000021
【図２１】
0005682282.tif 000022
【図２２】
0005682282.tif 000023
【図２３】
0005682282.tif 000024
【図２４】
0005682282.tif 000025
【図２５】
0005682282.tif 000026
【図２６】
0005682282.tif 000027
【図２７】
0005682282.tif 000028
【図２８】
0005682282.tif 000029
【図２９】
0005682282.tif 000030
【図３０】
0005682282.tif 000031
【図３１】
0005682282.tif 000032
【図３２】
0005682282.tif 000033
【図３３】
0005682282.tif 000034
【図３４】
0005682282.tif 000035
【図３５】
0005682282.tif 000036
【図３６】
0005682282.tif 000037
【図３７】
0005682282.tif 000038
【図３８】
0005682282.tif 000039
【図３９】
0005682282.tif 000040
【図４０】
0005682282.tif 000041
【図４１】
0005682282.tif 000042
【図４２】
0005682282.tif 000043