(57)【特許請求の範囲】
【請求項１】
入力した画像データをＭ×Ｎ画素（Ｍ、Ｎは正の整数）の矩形ブロック単位に走査し、
前記走査したブロックから所定の条件を満たすブロックを検出し、
前記検出されたブロックの中で隣接して連結しているブロックにより構成される領域を検出し、
前記検出された連結領域の中で当該領域を構成するブロック数が所定の範囲内の領域を選択し、該選択した領域を囲む領域を二次元コード領域として検出し、前記入力画像から二次元コードの画像を抽出することを特徴とする、二次元コード抽出方法。
【請求項２】
請求項１記載の二次元コード抽出方法において、
前記ブロックの検出は、ブロック内の白画素と黒画素の比率が所定の範囲内にあるブロックを、二次元コードを構成するブロックとして検出することを特徴とする二次元コード抽出方法。
【請求項３】
請求項１記載の二次元コード抽出方法において、
前記ブロックの検出は、ブロック内の総画素数に対するブロック内の水平ラインおよび／または垂直ライン内の画素値の変化点の個数の割合が所定の範囲内になるブロックを、二次元コードを構成するブロックとして検出することを特徴と
する二次元コード抽出方法。
【請求項４】
請求項１記載の二次元コード抽出方法において、
前記ブロックの検出は、ブロック内の各ラインに含まれる黒画素の水平方向の射影または／および垂直方向の射影の変化の度合いが所定の範囲内になるブロックを検出することを特徴とする二次元コード抽出方法。
【請求項５】
請求項１記載の二次元コード抽出方法において、
前記検出された二次元コードの領域内における任意の位置から、上下方向および左右方向に所定の大きさの矩形ブロック単位に走査し、
走査した矩形内の黒画素数が所定の値以下になる位置を各方向について検出し、
検出位置を囲む矩形領域を二次元コードとして抽出することを特徴とする二次元コード抽出方法。
【請求項６】
請求項１記載の二次元コード抽出方法において、
前記走査したブロック内に存在する黒画素同士の平均距離を求め、
前記求められた黒画素間平均距離の値が所定値以上の場合に、当該ブロックを二次元コードを構成するブロックとして抽出することを特徴とする、二次元コード抽出方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、文書や図表とともに二次元コードが印刷された紙面をスキャナ等の画像入力装置により読み取った画像データから、二次元コードの画像を自動的に抽出する二次元コード抽出方法に関する。
【０００２】
【従来の技術】
近年、従来のバーコードよりも多くの情報を埋め込むことができる二次元コードの開発が進み、実用化され始めている。二次元コードを利用することにより、文書や画像データ、音声データなどのあらゆる種類のバイナリデータを二次元コードとして紙面に印刷することが可能になった。
【０００３】
二次元コードを印刷した紙は、ファクシミリで伝送したり印刷物として配布する。受け取り側では、紙面の二次元コードをイメージスキャナにより画像データとして読み取って、各二次元コードの復元に対応したソフトウェアやハードウェアにより元のデータに復元することができる。
【０００４】
二次元コードの中には一般的なイメージスキャナでの読み取りを可能にするものもあり、専用の読み取り装置が無くても手持ちのスキャナにより読み取って元のデータを復元することができるため、読み取り手段の汎用性が高いというメリットがある。
【０００５】
【発明が解決しようとする課題】
二次元コードだけを紙面に印刷するのではなく、文書や図表とともに任意の位置に任意の大きさの二次元コードを紙面に印刷した場合、汎用のイメージスキャナを使って二次元コード部分の読み取りを行うと二次元コードに加えて文字や図表の一部も画像データとして取り込まれる可能性が非常に高い。
【０００６】
このように二次元コード以外の画像が入っていると、二次コード復元ソフトウェアやハードウェアで正常に復元することができないため、イメージスキャナで読み取った画像データから二次元コード部分だけを抽出しなければならないという課題があった、
【０００７】
【課題を解決するための手段】
そして、この目的は、入力した画像データをＭ×Ｎ画素（Ｍ、Ｎは正の整数）の矩形のブロック単位に走査し、走査したブロックから所定の条件を満たすブロックを検出し、検出されたブロックの位置に基づいて二次元コードの位置を検出して入力画像から二次元コードの画像を抽出する二次元コード抽出方法により達成される。
【０００８】
また、ブロック検出は、ブロック内の白画素／背景色と黒画素／文字色の比率が所定の範囲内になるブロックを検出するようにしてもよい。
【０００９】
また、ブロック内の総画素数に対するブロック内の水平ラインおよび／または垂直ライン内の画素値の変化点の個数の割合が所定の範囲内になるブロックを検出する、ブロック内の黒画素の連結の仕方に基づいてブロックを検出する、あるいはブロック内の各ラインに含まれる黒画素の水平方向の射影または／および垂直方向の射影の変化の度合いが所定の範囲内になるブロックを検出するようにしてもよいし、これらを組み合わせてブロックを検出してもよい。
【００１０】
一方、二次元コードの検出の際には、検出された連結領域の中でその領域を構成するブロック数が最大の領域を選択し、，該領域を囲む矩形領域を二次元コード領域として検出するようにしてもよい。
【００１１】
更に、連結領域の中で領域を構成するブロック数が所定の範囲内の領域を選択し、選択されたそれぞれを囲む矩形領域を二次元コード領域として検出するようにしてもよい。
【００１２】
また、二次元コード抽出に際して，二次元コード領域内における任意の位置から垂直上下方向および水平左右方向に所定の大きさの矩形ブロック単位に走査し、走査した矩形内の黒画素数が所定の値以下になる位置を各方向について検出して検出位置を囲む矩形領域を二次元コードとして抽出するようにしてもよい。
【００１３】
また更に、二次元コード領域の周囲に所定幅の空白を付与して抽出するようにしてもよい。
【００１４】
一方、二次元コード抽出にあたって二次元コードの傾きを検出し、傾きを補正しながら二次元コード画像を抽出するようにしてもよい。
【００１５】
その際に、二次元コードの上下端および／または左右端それぞれの境界上における複数箇所の座標値を直線近似して、二次元コードの傾き角度を検出するようにすればよい。
【００１６】
また、入力画像の読取方向を検出して正立像に補正することによって、入力画像の向きを正しく補正することが可能となる。
【００１７】
【発明の実施の形態】
以下、図面を用いて本発明の実施形態を説明する。
【００１８】
一般的に、二次元コードはバイナリデータを特定のアルゴリズムにより画素パターン変換したものであり、文書や図等と異なり画像としての見た目の意味を持たない。一方、画像レベルで見ると、文書や図表を構成する画素のパターンと二次元コードを構成する画素パターンの特徴は異なっている。この相違は見た目にも明らかであり、文書・図表と二次元コードが混在している画像から二次元コード部分を目視により容易に識別できる。
【００１９】
図１はイメージスキャナで読み取った、二次元コードと文書や図表が混在する文書画像を表しており、横Ｍ画素、縦Ｎ画素（いずれも正の整数、Ｍ＝Ｎであってもよい）のブロック毎に読み取られた画像を走査した例が図示されている。図中、走査された画像中のブロックは破線で囲まれた矩形で図示されている。また、実線で囲まれた矩形は、後に詳細を説明する、本実施形態により抽出されたブロック（特に二次元コードを構成すると判別されたブロック）を示している。なお、図１において二次元コードは画像の右下の矩形の領域に相当し、また、検出されたブロック以外の文書や図表などは、特に図中には明示していない。
【００２０】
なお、以降の説明では文字や図表および二次元コードを構成する画素を「黒画素」、その背景となる画素を「白画素」とする。
【００２１】
本実施形態では、文書・図表と二次元コードの画素パターンが相違する点に着目した。まず、画像をブロック単位に走査してブロックごとに二次元コード（あるいは二次元コードを構成するブロックと推測される部分）か否かを検出し、二次元コードの存在確率が高い部分を探し出す
ブロックが二次元コードの一部か否かを判断するためには、ブロック内の黒画素分布を求める。これは、二次元コード部分と文字領域とで相違することを利用したものである。
（１）ブロック内の黒画素率により識別
この方法では、二次元コードの黒画素率がブロック単位でみるとほぼ一定であることを利用する。この際に、ノイズやスキャナの特性による変動を考慮し、二次元コードと判断するべきブロック内の黒画素率範囲を予め定めておく。この範囲は、あらかじめ二次元コードを走査して、その結果に基づいて設定するようにしてもよい。走査したブロックの黒画素率がこの設定した黒画素率の範囲内にあれば、そのブロックが二次元コードを構成するブロックであると判断する。二次元コードを構成していないブロックについては、黒画素率が二次元コードを構成するブロックの範囲には入らないため、上記の方法を用いることにより、二次元コード以外のブロックの多くを取り除くことができる。
（２）白画素と黒画素との変化点の割合により識別
この方法では、二次元コードの画素の変化パターンがブロック単位で見るとほぼ一様であることを利用する。ブロック内を水平または垂直に１ライン単位に走査し、各ライン内の画素の変化点、すなわち黒画素から白画素、または白画素から黒画素に変化した回数を計数し、ブロック全ラインについて求めた変化点の総数をブロックの総画素数で割った値を「変化点の割合」とする。二次元コードブロックの変化点の割合を予め調べておき、ノイズやスキャナ特性による変動を考慮して二次元コードと判断する変化点の割合の範囲を定める。
【００２２】
走査したブロックの変化点の割合が、この範囲内にあれば二次元コードを構成するブロックと判断する。これにより、二次元コード以外のブロックの多くが取り除かれる。
（３）ブロック内の黒画素の連結の仕方で識別
二次元コード内の黒画素はブロック内でほぼ一様に分布するのに対し、文字を含むブロックでは黒画素により文字が構成されるため、黒画素が局所的にかたまって存在している。この方法では、上記した画像の特徴を二次元コード検出に利用する。
（４）ブロック内の黒画素の射影の変動から識別
変化点の場合と同様に、二次元コード内の画素分布がほぼ一様である。ブロックを水平または垂直に１ライン単位に走査し、各ラインに含まれる黒画素数を計数することで該ブロックの射影を得る。二次元コードのブロックの場合には、画素分布がほぼ一様であることからライン間の射影の変化が小さく、文書や図表の場合には、黒画素分布が一様でないことからライン間で射影の変化が大きくなる。
【００２３】
従ってあらかじめ二次元コードと判断する射影の変動の範囲を定めておき、走査したブロックの射影の変動がこの範囲内であれば二次元コードのブロックと判断する。これにより、二次元コード以外のブロックの多くを取り除くことができる。
【００２４】
二次元コードブロックを検出する際に、上記（１）〜（４）の中から２つ以上の方法を組み合わせることで、二次元コードブロックの検出精度を大幅に向上させることができる。
【００２５】
なお、上記の黒画素分布を利用して二次元コードを構成するブロックを検出したとしても、二次元コードとして検出されたブロックの中には、二次元コード以外の画像が含まれる可能性がある。これは、一つのブロック単位でみた場合、そのブロックが二次元コードではないにもかかわらず、上記の黒画素分布の条件を満たしてしまうことがあるためである。しかし、これらの二次元コードを構成していない、言わば誤検出されたブロックは、自分自身の周辺のブロックが二次元コードとして検出される条件を満たしていない可能性が高いと考えられる。そのため、このようなブロックに関しては、二次元コードとして検出されたブロックが他のブロックから孤立して存在したり（図１Ａ）、数個程度のブロックが隣接して検出される（図１Ｂ、Ｃ）に過ぎない。
【００２６】
一方、二次元コード領域内においては、二次元コードとして検出されるブロックの数がは二次元コード領域外に比べて多くなるため、検出されたブロックが図１のＤのように多く隣接して繋がりあっている。
【００２７】
そこで、二次元コードとして検出されたブロックのうち、隣接して連結するブロックの個数が最大となる領域を検出し、その領域の上下左右に所定の幅を持たせた矩形で囲み、この領域を検出することができる。
【００２８】
ここで、上記した所定の幅を最大ブロックの幅とすることで、常に二次元コード全体を含んだ領域が検出される。
【００２９】
また、連結するブロックが所定の個数以上の領域を選択することで、同一画像内に複数個の二次元コードが存在する場合でも抽出することが可能となる。
【００３０】
さらに、以下の方法により、より正確に二次元コードの領域を検出することができる。
【００３１】
図２は、前述した方法により二次元コードとして検出された、隣接ブロックの個数が最大となる領域を拡大して示した図である。図２において、一番外側の実線で示した矩形内（矩形領域１）が検出する二次元コードの領域、その内側の矩形（矩形領域２）が二次元コードとして検出されたブロックに外接する矩形領域である。また、一番外側の破線と矩形領域１の間の領域は、二次元コードと文字や図表を隔てるために設けられた、全ての画素が白画素の空白領域である。
【００３２】
まず、矩形領域２内に、基準位置を設定する。図２では基準位置を丸印で示しており、検出された領域の中心に設定された例が図示される。この基準位置を中心として画像に対して左右の方向、上下方向に向かって二次元コードの境界を検出する処理を行う。二次元コードの境界から外側には、所定の幅の空白領域が付与されるのが一般的である。従って、検出基準位置から二次元コードの縁に向かってブロック単位に走査して行き、走査したブロック内の全画素が白画素になった時点で上記した空白領域に達したことが判り、このブロックの基準位置側の辺が二次元コードの境界ということになる。
【００３３】
ここで、矩形領域２の内側は二次元コード領域とみなせるため、二次元コードの境界の検出は、図２のＡ〜Ｄのように矩形領域２の外側から開始すればよい。各検出開始位置Ａ〜Ｄから二次元コードの境界方向に向かってブロック単位に上記の検出を行えば、その内側の全画素が白画素になるブロックＡ’〜Ｂ’が検出される。そして、Ａ’〜Ｂ’の検出基準位置側（すなわち二次元コード側）の辺を通る矩形が二次元コードの矩形領域として検出される。
【００３４】
上記のようにして検出した二次元コードを抽出する際に、二次元コードを復元するソフトウェアやハードウェアが必要とする所定の幅の白画素を二次元コードの周囲に付与することで、正しく復元できる二次元コードの画像にすることができる。
【００３５】
ハンドヘルド型のイメージスキャナにより紙面上の二次元コード部分の読み取りを行った場合、手動でスキャナを操作するためスキャナが斜めに動き読み取った画像に傾が生じる場合が考えられる。
【００３６】
そこで、二次元コードを抽出する際に同時に二次元コードの傾き角度も検出し、二次元コード抽出時に傾きを補正しながら抽出を行うことで、傾きのない二次元コードを抽出することができる。
【００３７】
二次元コードが矩形である場合には、二次元コード上下の辺、すなわち二次元コードの境界線が平行であることから、二次元コードを検出する際に上下の境界線上の点を複数箇所検出し、画像内におけるそれらの座標値からこれらの点を直線近似することで境界線の傾きを求め、それを二次元コードの傾き角度とすることができる。左右の辺についても互いに平行であるため、同様にして傾き角度を検出することができ、上下左右から傾きを検出することで傾き角度の検出精度が高まる。
【００３８】
手動操作型のハンドヘルドスキャナにより読み取る場合、ハンドヘルドスキャナは上下左右いずれの方向にもスキャンできることから、読み取った画像が回転したり鏡像反転して入力される場合がある。二次元コードの検出処理を始める前に読み取り方向を検出して正立像に補正しておいたり、二次元コードを検出した後抽出する際に正立像になるように補正しながら抽出することで、常に正しい向きの二次元コードを抽出することができる。
【００３９】
以下、図面に基づいて本発明の実施例について詳細に説明する。
【００４０】
図３は本発明の全体の処理フローである。まず、入力画像をブロック単位に走査して、上記した（１）〜（４）の方法を用いて、所定の条件を満たすブロックを検出する（Ｓ１０１）。次に、検出されたブロックが連結している領域を検出する（Ｓ１０２）。続いて、Ｓ１０２により検出された領域に基づいて、二次元コードの領域を検出する（Ｓ１０３）。そして、検出した二次元コード領域から二次元コード画像を抽出する（Ｓ１０４）。最後に、二次元コードの傾き角度を検出し、必要ならば傾き補正を行なう（Ｓ１０５）。
【００４１】
図４は、入力画像から検出したブロックの情報を格納するためのブロック情報テーブルの構成を示す図である。ブロック番号は二次元コードの一部として検出されたブロックに、検出した順番につける一連番号である。検出されたブロックの最後を示すために、テーブル最後にＥＯＢ（End Of Block table）を格納する。
【００４２】
検出されたブロックごとに、ブロック左上のＸ座標とＹ座標、そのブロックに結合するブロック数、結合するブロックにより構成される領域の一連番号が格納される。検出されたｉ番目のブロックの、ブロック情報テーブルの各項目の値の表記は、Ｘ座標をＸｉ、Ｙ座標をＹｉ、結合ブロック数をＣｉ、領域番号をＲｉで表すこととする。
【００４３】
以下の実施例では、本ブロック情報テーブルを使用して二次元コードの検出を行なう。
【００４４】
図５は二次元コードのブロックを検出する処理フローを示す図であり、図３のS101の処理に対応する。図中の記号は、ｘとｙは走査するブロック左上のそれぞれX 座標とY 座標、M とN はそれぞれブロックの横画素数と縦画素数を表す。また、WIDTH とHEIGHTは、それぞれ入力画像の横画素数と縦画素数を表す。ｉは検出したブロックの番号を示すための変数である。
【００４５】
まず初期設定として、ｘ＝０、ｙ＝０すなわち入力画像の右上の原点をブロックの左上の座標に設定し、同時に最初のブロックを示すようｉ＝１に設定する（S102）。
【００４６】
S202では、走査するブロックを左上の座標を（ｘ、ｙ）とする幅Ｍ画素、高さＮ画素の矩形領域に設定し、このブロックが所定の条件、すなわち黒画素率や変化点の個数、黒画素の連結状態が所定の値であるか否かを識別する（S203）。S203において、該ブロックが所定の条件を満たさないと判断した場合には処理をS206に移し、条件を満たすと判断した場合には処理をS204に進める。
【００４７】
S204では、ブロック情報テーブルのｉ番目の項目を選択し、Xiにｘ、Yiにｙをそれぞれ格納し、次に検出されるブロックを示すようにブロック番号ｉに１を加算する（S205）。
【００４８】
S206では、ｘにＭを加えることで、次に走査するブロック左上の座標をX 軸方向にＭ画素分移動させる。S207では、ｘ＋ＭがWIDTH 以上か否か、すなわちｘを左上のX 座標とする幅M 画素のブロックの右端が、入力画像の幅を超えていないか否かをチェックする。ｘ＋M がWIDTH 未満の場合にはS ２０２に処理を戻す。ｘ＋M がWIDTH 以上の場合には、S208でｘ＝０すなわち走査するブロックのX 座標を入力画像の左端に設定する。
【００４９】
S209では、ｙにN を加えることで、次に走査するブロック左上の座標をY 軸方向にN 画素分移動させる。S210では、ｘ＋Y がHEIGHT以上か否か、すなわちｙを左上のY 座標とする高さN 画素のブロックの下端が、入力画像の高さを超えていないか否かをチェックする。ｙ＋N がHEIGHT以上の場合にはS211に処理を移す。S211ではブロック情報テーブルのｉ番目のブロック番号にEOB を格納して処理を終了する。
【００５０】
一方、S210においてｙ＋N がHEIGHT未満の場合にはS202に処理を戻す。
【００５１】
S202からS210までを繰り返し行なうことにより、入力画像全体をブロック単位に走査して、図７の太線で囲ったブロック１〜２６のように、二次元コードと識別したブロックを検出し、それら各ブロックのX 座標およびY 座標が図８のブロック情報テーブル１〜２６に示したように検出される。
【００５２】
なお、図７はブロックの幅M=３２画素、高さ＝３２画素の場合の例である。
図６は、図３のS101により検出したブロックが連結して構成する領域を検出する処理フローを示す図であり、図３のS102の処理に対応する。
【００５３】
図中の記号は、ｉはブロック情報テーブル内におけるブロック番号を示すための変数、ｋは検出した領域の番号を示すための変数である。
【００５４】
まず初期設定として、ブロック情報テーブル（図４）の先頭からEOB までの結合ブロック数と領域番号を全て０でクリアしておく（S301）。
【００５５】
S30 ２ではブロック番号ｉ＝１すなわちブロック情報テーブルの先頭を指し示すように設定し、領域番号をｋ＝１すなわち最初の領域を示す値を設定する。
【００５６】
S303では、ｉ番目のブロックテーブルの領域番号Riが０か否か、すなわちｉ番目のブロックが既に何らかの領域に属しているか否かをチェックし、０ならば領域に属していないと判断して処理をS304に移し、０でなければ既に領域に属していると判断してS307に処理を移す。
【００５７】
S304では、例えば「境界追跡法」などの方法によりブロックｉを始点とするブロックにより構成される領域を検出し、該検出した領域を構成するブロックの個数P を求める。なお、境界追跡法は一般的に知られている方法であり、例えば「画像処理」（尾崎他著、共立出版、1993、p187〜188 ）や「画像処理工学」（谷口・編、共立出版、1996、p116〜118 ）に記載されている。
【００５８】
S305では、ブロック情報テーブルを参照し、S301で検出した領域に含まれる全てのブロック数CiにP 、領域番号Riにｋを設定する。
【００５９】
S306では、領域番号ｋに１を加える。
【００６０】
S307では、次のブロック情報テーブルの項目を参照するためにｉに１を加える。
【００６１】
S308では、ｉ番目のブロック情報テーブルのブロック番号欄がEOB か否か、すなわちS101で検出した全てのブロックについて処理を終えたか否かチェックする。ブロック番号がEOB でない場合には、処理をS303に戻し、ブロック番号がEOB である場合には全処理を終えたと判断して修了する。
【００６２】
S303からS308までの処理を繰り返し行なうことで、図７の領域１〜４のように二次元コードと識別されたブロックが連結して構成する領域が検出され、図８のブロック情報テーブルのように各ブロックについて結合ブロック数と領域番号が求まる。例えば、ブロック６の場合には、結合するブロック数が２０個の領域に所属し、領域番号が３となる。
【００６３】
図９は二次元コード領域を検出する処理の第一の実施例を示す処理フローであり、図３のS103の処理に対応する。
【００６４】
S401では、ブロック情報テーブルを参照し、結合ブロック数の最大値を検出してRmaxとする。図８の例では、Rmax=20 となる。
【００６５】
S402では、結合ブロック数がRmaxに一致するブロックの中で、X 座標およびY 座標の最小値（Xmin、Ymin）と最大値（Xmax、Ymax）を求める。図８の例では、座標の最小値（Xmin、Ymin）としてブロック６の座標（X6、Y6）＝（192 、352 ）、座標の最大値（Xmax、Ymax）としてブロック２６の座標（X26 、Y26 ）＝（352 、448 ）が検出される。
【００６６】
S403では、左上角の座標を（Xmin-M、Ymin-N）、右下角の座標を（Xmax+2×M 、Ymax+2×N ）とする矩形領域を二次元コード領域として決定する。図７の例では、図１０A の領域３から一ブロック分離れた矩形領域C が二次元コード領域として検出される。
【００６７】
本方法では、実際の二次元コードである図１０B に対して、大きめの領域が二次元コードとして検出されることになる。
【００６８】
図１１は、二次元コード領域を検出する処理の第二の実施例を示す処理フローあり、図３のS103の処理に対応する。
【００６９】
S501では、ブロック情報テーブルを参照し、結合ブロック数の最大値を検出してRmaxとする。図８の例では、Rmax=20 となる。
【００７０】
S502では、結合ブロック数がRmaxの領域の中心を二次元コード領域検出の基準位置に決定する。図８の例では、図１０のように結合ブロック数が最大の領域として領域３（図１０A ）が選択され、その中心として図１２D が決定される。ここでの中心位置は、領域３に外接する矩形領域の中心で良い。
【００７１】
S503では、S502で決定した検出基準位置から、上下および左右の方向に矩形のブロック単位に走査し、該ブロック内の黒画素の個数がQ 個以下になる位置を検出する。Q は０にしても良いが、ノイズなどの影響を考慮してある程度の個数を設定しておいても良い。
【００７２】
図１２は、図１０の領域３部分を拡大した図である。この例では、それぞれ左側でＡ、右側でＢ、上側でＣ、下側でＤの位置が検出される。Q=０に設定し、ノイズがない場合には、検出したＡ付近は図１２下図のようになり、Ａ’の位置すなわちブロックの基準位置側を検出した位置に決定すればよい。
【００７３】
S50 ４では、S503で検出した上下左右の四点から、検出基準位置と反対方向に所定の画素数分はなれるように矩形を二次元コードの領域として決定する。図１２では、Ａ〜Ｄの各検出位置からＥ画素分空けた位置を通るように設定した矩形（一番外側の矩形）が二次元コード領域となる。
【００７４】
以上、二次元コード領域を検出する第一および第二の実施例では、二次元コードが傾いている場合でも、二次元コード全体を含む領域を検出することができる。更に、検出した二次元コードの傾きを検出し、傾きを補正することでより正しく二次元コードを復元できる。
【００７５】
図１３は、二次元コードの傾き補正の処理フローであり、図３のS105の処理に対応する。
【００７６】
S601では、二次元コード内の検出基準位置から、上下左右に所定の間隔でブロック単位に走査し、ブロック内の黒画素がQ 個以下になる位置を検出する。ここでの検出方法はS503と同様である。S601の処理により、二次元コード各辺における境界線上の位置が検出される。
【００７７】
図１２の二次元コード領域の例では、図１４のように、二次元コード上側の境界線上にA1〜A7、下側の境界線上にB1〜B7、左側の境界線上にC1〜C5、右側の境界線上にD1〜D5の位置がそれぞれ検出される。
【００７８】
S602〜S605では、上側、下側、左側、右側の検出位置を直線近似し、それぞれの傾き角度ａ１〜ａ４を求める。図１４の例では、上側についてはA1〜A7を通る近似直線A の傾きａ１を算出する。下側、左側、右側に関しても同様にして傾き角度を算出する。
【００７９】
S606では、上側と下側の傾き角度に対して左側と右側の傾き角度が直行することを利用し、ａ１〜ａ４の平均の傾きを計算して二次元コードの傾き角度θを次式により決定する。
【００８０】
θ＝（ａ１＋ａ２＋（ａ３−９０）＋（ａ４−９０））÷４
S607では、θを所定の値θmin と比較し、θがθmin より大きい場合にはS608で傾き補正処理を行って終了し、θがθmin 以下の場合には傾き補正を行なわずに処理を終了する。これにより、傾き角度が小さく、傾き補正の必要のない場合には回転処理を行なわないことで、処理時間を短縮できる。
【００８１】
読取方向を検出して正立像に自動補正する方法には、公知例として「画像状態検出装置及びそれを利用した文書画像補正装置」（特許公開平成１１年第３１６７９８号）がある。
【００８２】
図３のS101の処理を行う前に、この補正処理を行って入力画像を正立像に補正しておくことにより、S101以降の処理はこの正立像に補正した画像に対して行われるため、回転や鏡像反転が補正された二次元コードが抽出される。
図１５は、二次元コードを構成するブロックを検出するためのその他の方法を説明するための図面であり、８×８画素のブロックにおいて着目画素に対する黒画素間距離の求め方を説明するための図である。ここで、図示左上の画素をX1、1 とし、X1、1 の右側の画素をX2、1 、X1、1 の下側の画素をX2、1 のように添え字を変えて各画素を表す。
【００８３】
まず、図５の黒画素X4、4 に着目し、X4、4 に対して上下左右それぞれの方向で最も近い黒画素がX4、3 、X4、8 、X1、4 、X6、4 であった場合、X4、4 についての黒画素間の距離D4、4 は次式で算出する
0004419269.tif 000002
なお、上下左右のうち、黒画素が存在しない方向があった場合や、着目画素がブロック外縁にあり画素が存在しない方向がある場合には、該方向に相当する項はゼロとする。例えば、X1、4 を含めX4、4 の左側が全て白画素であった場合には、X4、4 についての黒画素間の距離は次式のようになる。
【００８４】
0004419269.tif 000003
一般に、着目した黒画素についての黒画素間隔は次式により算出する。
【００８５】
0004419269.tif 000004
式（３）の第一項から第四項は、それぞれ上下左右にa 画素、b 画素、c 画素、d 画素離れた黒画素との距離を求めることを意味するため、着目画素Xi、j についての黒画素間隔はa + b + c + d と表せる。
【００８６】
ブロック内の全ての黒画素についての黒画素間の平均距離D は、ブロック内の黒画素数をN として、次式により算出することができる。
【００８７】
D = ( ΣΣDi、j ) / N   ・・・（４））
ここで、最初のΣはDi、j をi=1 からN までの加算すること、２個目のΣはDi、j をj=1 からN まで加算することを示す。
図１６は、文字ブロック（A ）と二次元コードブロック（B ）それぞれにおける黒画素分布の例である。一般的に、文字ブロックでは黒画素が局所的に集まって存在し、二次元コードブロックでは黒画素が比較的ばらばらな位置に存在している。
【００８８】
図１７は、図１６に図示される文字ブロックと二次元コードブロックについて、前述した画素間の距離を算出した例である。太線にて描かれた小さい矩形は黒画素を表し、矩形内の数値は黒画素について式（１）により黒画素間を算出した値である。
【００８９】
図１６の例では、文字ブロック（A ）の黒画素間の合計は63、ブロック内の黒画素数は24個なので平均黒画素間はD ＝ 2.6（63÷24）となる。一方、二次元コードブロック（B ）の黒画素間の合計は131 、ブロック内の黒画素数は27なので平均黒画素間はD ＝ 4.9（131 ÷27）となる。二次元コードブロックの平均黒画素間のほうが文字ブロックよりも大きい。
【００９０】
平均黒画素間D は、式（３）からも明らかなように黒画素同士の間隔が大きいほど値が大きくなる。  図１６に示したように、二次元コードブロック（A ）内の黒画素は、文字ブロック（B ）に比較してばらばらな位置に存在しているため、各黒画素の間隔が文字ブロックよりも大きくなり、従って、二次元コードブロックの平均黒画素間D も文字ブロックよりも大きな値になる。この黒画素間隔の違いを利用してブロックが文字の一部なのか二次元コードの一部なのかを識別する。
【００９１】
文字ブロックと二次元コードを識別する黒画素間の閾値Dth は次のように決める。まず、文字のみを含む複数個の文書画像をブロックに分割し、全てのブロックについて求めた平均黒画素間の平均D1を求める。次に、複数個の二次元コード画像をブロック分割し、文字ブロックの場合と同様に全ブロックの平均黒画素間の平均D2を求める。こうして求めたD1、D2はそれぞれ文字および二次元コードブロックの平均的な平均黒画素間を表すと考えられるので、D1とD2の中点を閾値Dth に決定する。
【００９２】
ブロックの平均黒画素間がDth 未満ならば文字ブロック、Dth 以上ならば二次元コードブロックと識別することができる。
【００９３】
【発明の効果】
以上説明したように、本発明の二次元コード抽出方法によれば、二次元コードと文字や図表が混在する画像データの中から二次元コードだけを自動的に抽出することができる。このため、二次元コードを文書・図表と共に印刷した紙面において、イメージスキャナにより二次元コードを含むように読み取りを行なうと、読み取った画像から二次元コードが自動抽出されるため、元のデータに正確に復元することができ、二次元コードの読み取りやすさの向上に寄与するところが大きい。
【図面の簡単な説明】
【図１】イメージスキャナで読み取られた二次元コードと文書／図表が混在する文書画像を模式的に図示した図面であり、Ｍ×Ｎのブロック単位で走査された状態を示す。
【図２】図１で二次元コードとして検出されたブロックを拡大した図。
【図３】本発明の一実施形態による二次元コード検出手順を説明したフローチャート。
【図４】ブロック情報テーブルを示した図面。
【図５】二次元コードブロックの検出処理手順を示すフローチャート。
【図６】隣接ブロックにより構成される領域の検出処理手順を示すフローチャート。
【図７】二次元コード抽出を説明する図面。
【図８】ブロック情報テーブルの例を示す図。
【図９】二次元コード領域の検出処理を示すフローチャート。
【図１０】検出された二次元コード領域の様子を示す図。
【図１１】二次元コード良医の検出処理を示すフローチャート。
【図１２】図１０で検出された二次元コード領域を拡大した図面。
【図１３】二次元コードの傾き検出とその補正処理を示すフローチャート。
【図１４】傾いた二次元コードの様子を示す図。
【図１５】二次元コード領域検出を説明する図。
【図１６】文字ブロックと二次元コードブロックの黒画素分布を示す図。
【図１７】図１６に図示された文字ブロックと二次元コードブロックとの黒画素間距離を算出した結果を示す図。
【図１】
0004419269.tif 000005
【図２】
0004419269.tif 000006
【図３】
0004419269.tif 000007
【図４】
0004419269.tif 000008
【図５】
0004419269.tif 000009
【図６】
0004419269.tif 000010
【図７】
0004419269.tif 000011
【図８】
0004419269.tif 000012
【図９】
0004419269.tif 000013
【図１０】
0004419269.tif 000014
【図１１】
0004419269.tif 000015
【図１２】
0004419269.tif 000016
【図１３】
0004419269.tif 000017
【図１４】
0004419269.tif 000018
【図１５】
0004419269.tif 000019
【図１６】
0004419269.tif 000020
【図１７】
0004419269.tif 000021