以下、図面を参照しながら本発明に係る光学的情報読取装置について説明する。本実施の形態では、光学的情報読取装置の一例として、第1の実施の形態ではバーコードスキャナ100を、第2の実施の形態ではコードスキャナ200を説明する。
<第1の実施の形態>
図1は、第1の実施の形態に係るバーコードスキャナ100の構成例を示すブロック図である。図1に示すように、バーコードスキャナ100は、光信号を入力してアナログの電気信号に変換する信号変換部110と、信号変換部110で変換された電気信号を増幅する増幅部120と、増幅部120で増幅された電気信号のうち所定周波数以下の低域成分の信号だけを通過させて出力するローパスフィルタ130と、ローパスフィルタ130から出力された出力信号に応じて増幅部120における増幅の利得を制御する自動利得制御(AGC)部140と、劣化した出力信号に対してバーコードの白と黒の変曲点を予測する2値化予測部150とからなる。
信号変換部110に入力する光信号は、バーコードスキャナ100が不図示のLEDやレーザビーム発生器等の発光源からバーコードに向けて照射した光の反射光の強度を示す信号である。信号変換部110は、光電変換素子111及び電流/電圧変換部(以下、I/V変換部112という)を備える。光電変換素子111は、光信号を受光して電流信号に変換するフォトダイオード(PD)から構成される。I/V変換部112は、電流信号を電圧信号に変換する。
増幅部120は、前置増幅部121及び可変利得増幅器(以下、AGCアンプ122という)を備える。前置増幅部121は、小さい電圧信号を増幅するために用いる。AGCアンプ122は、出力信号レベルをフィードバックすることで、利得が入力信号レベルに対して適切な範囲になるよう調整する。AGCアンプ122の利得は、自動利得制御部140によって生成される制御信号Scに応じて変化する。
自動利得制御部140は、ローパスフィルタ130の出力部から分岐してAGCアンプ122に帰還する閉ループ型の制御系であり、ピーク値検出器141、比較器142及び基準レベル設定回路143を備えている。
ピーク値検出器141は、ローパスフィルタ130の出力信号の振幅のピーク電圧(ピーク値Vp)を検出して保持する。基準レベル設定回路143は、基準となる電圧値(以下、基準電圧値Vsという)を設定する。比較器142は、基準レベル設定回路143によって設定された基準電圧値Vsと、ピーク値検出器141により保持したピーク値Vpとを比較し、その比較結果に応じた制御信号Scを出力してAGCアンプ122の利得を制御する。
この場合の比較器142は差動増幅器の機能を持ち、ピーク値Vpと基準電圧値Vsとの差に応じた制御信号Scを出力し、それをAGCアンプ122の制御端子に入力させる。制御信号Scは、Vp>Vsのときは正、Vp=Vsのときは0、Vp<Vsのときは負となる。AGCアンプ122ではこの制御信号Scと反比例するように増幅の利得を可変する。すなわち、出力信号の振幅が小さくなると、ピーク値Vpが基準電圧値Vsより小さくなるので制御信号Scが負になり、AGCアンプ122の利得が大きくなる。逆に、出力信号の振幅が大きくなると、ピーク値Vpが基準電圧値Vsより大きくなるので制御信号Scが正になり、AGCアンプ122の利得が小さくなる。それによって、出力信号の平均的な振幅を略一定にする。
2値化予測部150は、ローパスフィルタ130から出力された出力信号を入力し、この出力信号が劣化している場合には、バーコードの白と黒の変曲点を予測してデジタルの2値化信号を生成する。この2値化信号は、後段の不図示の復号化回路によりデコードされてバーコード記号として読み取られる。
図2は、2値化予測部150の構成例を示すブロック図である。図2に示すように、2値化予測部150は、アナログ用の第1のメモリ(以下、第1のメモリ151という)、アナログ用の第2のメモリ(以下、第2のメモリ152という)、微分処理部153、変曲点検出部154、線形補完部155、BBD計算部156、デジタル用の第1のメモリ(以下、第1のメモリ157という)、デジタル用の第2のメモリ(以下、第2のメモリ158という)及びCPU159を備えている。
図2に示す2値化予測部150は、第1のメモリ151と第2のメモリ152を切り替える。また、2値化予測部150は、第1のメモリ157と第2のメモリ158を切り替える。これは、バーコードを読み取る処理と演算する処理とを並列に行ってスループットを向上させるためである。
微分処理部153は、第1のメモリ151又は第2のメモリ152に保存された図9の(A)に示すアナログデータを一階微分して、図9の(B)に示す一階微分した信号波形を求める。また、微分処理部153は、第1のメモリ151又は第2のメモリ152に保存されたアナログデータを二階微分して、図9の(C)に示す二階微分した信号波形を求める。
変曲点検出部154は、一階微分した信号波形と二階微分した信号波形から変曲点を検出する。線形補完部155は、二階微分の値を線形補完する。これにより、変曲点の位置をより正確に読み取ることができる。
BBD計算部156は、図9の(B)に示す一階微分の絶対値が特定のスライスラインL1,L2より大きく(例えば、図9の(B)では、一階微分の値が、スライスラインL1よりも上方にある箇所、及び、スライスラインL2よりも下方にある箇所)、かつ、図9の(C)に示す二階微分の値がゼロのラインとクロスしている点を変曲点として検出する。BBD計算部156は、変曲点の向き(変化量)を符号として図10に示すテーブルTB1のIO[Ad]に保存する。また、BBD計算部156は、変曲点間の幅長を2値化バーコードデータ(以下適宜、BBDという)として図10に示すテーブルTB1のBBD[Ad]に保存する。このテーブルTB1は、第1のメモリ157又は第2のメモリ158に保存される。なお、変曲点検出部154、線形補完部155及びBBD計算部156は、2値化コード記号データ計算部の一例である。CPU159は演算部の一例であり、第1のメモリ157又は第2のメモリ158に保存されたテーブルTB1を参照して2値化信号を生成する。
図3は、バーコードの一例を示す図である。図3の(A)に示すように、バーコードBC1は、幅長の異なる複数の黒色のバーが白い紙などの媒体に印字されている。この例では、バーコードBC1は、スタートマージンSM、エンドマージンEM、1値幅バーSBr1,SBr2及び多値(2値も含む)幅バーLBr1,LBr2を有している。
スタートマージンSM及びエンドマージンEMの濃淡のレベル情報は、白色のみである。1値幅バーSBr1,SBr2及び多値幅バーLBr1,LBr2の濃淡のレベル情報は、白色及び黒色である。すなわち、1値幅バーは、黒色の1値幅バーSBr1と白色の1値幅バーSBr2から構成される。多値幅バーは、黒色の多値幅バーLBr1と白色の多値幅バーLBr2から構成される。バーコードBC1は、スタートマージンSMで始まり、1値幅バーSBr1,SBr2及び多値幅バーLBr1,LBr2の様々な組み合わせで構成され、エンドマージンEMで終了する。
図3の(B)に示すように、バーコードBC2は、図3の(A)に示したバーコードBC1と同一の構成である。すなわち、バーコードBC2は、スタートマージンSM、エンドマージンEM、1値幅バーSBr1,SBr2及び多値幅バーLBr1,LBr2を有している。バーコードBC2は、媒体に印字された1値幅バーSBr1及び多値幅バーLBr1の画像が背景色と同色化した状態を示している。このようなバーコードBC2の同色化は、例えば印字対象の材質や印字の劣化に依存する。印字対象の材質が例えば緑色のプリント基板であり、このプリント基板の表面にレーザマーカでバーコードを印字する場合には、白色の背景に黒色のバーコードを印字する場合に比べて同色化を招きやすい。このように、バーコードは、印字対象の材質や印字の劣化により、様々な印字状態となる。
図4の(A)は、バーコードBC1の読み取り例を示す図である。図4の(A)に示すように、バーコードBC1が同色化していない場合、出力信号の波形からバーコードBC1の白黒の変曲点を求めて、変曲点の幅情報に対して適合するバーコードを探すことでバーコードB1を読み取ることができる。すなわち、スタートマージンSM、エンドマージンEM、1値幅バーSBr1,SBr2及び多値幅バーLBr1,LBr2にバーコードBC1を分類できる。
変曲点の求め方としては、出力信号の変化量の絶対値が一定値より大きい極大値を検出する必要がある。これにより、ノイズなどによって発生する変化量の少ない変曲点を検出することを防止できる。
図4の(B)は、バーコードBC2の読み取り例を示す図である。図4の(B)に示すように、同色化したバーコードBC2の場合、幅長の狭い1値幅バーSBr1,SBr2が白色か黒色であるかの判別が難しい。この場合、図2に示した2値化予測部150は、変曲点間の信号の強度を示すレベル情報を追加することにより、バーコードBC2の1値幅バーSBr1,SBr2を白色と黒色の中間色である灰色(グレー)のバーBr3として判別する。
2値化予測部150は、変曲点間の信号の強度を示すレベル情報に基づいて、バーコードBC2の2値化バーコードデータを白色(第1の色情報)、黒色(第2の色情報)及び灰色(第3の色情報)の3値に分類して、この灰色のバーBr3を、黒色の1値幅バーSBr1と白色の1値幅バーSBr2の集合として判別する。2値化予測部150は、この灰色を示すバーBr3をバーコードBC2の特徴(配列パターン)に照らし合わせて、黒色の1値幅バーSBr1と白色の1値幅バーSBr2を予測して分割する。例えば、2値化予測部150は、灰色のバーBr3の2値化バーコードデータを最小幅の2値化バーコードデータで除算して該灰色のバーBr3を分割する。
この例で、2値化予測部150は、図4の(B)に示す灰色のバーBr3aの幅長を求め、例えば黒色の1値幅バーSBr1の幅長で該バーBr3aの幅長を除算する。これにより、灰色のバーBr3aの中に含まれる黒色の1値幅バーSBr1又は白色の1値幅バーSBr2の個数が分かる。この例では、バーBr3aに含まれる1値幅バーSBr1,SBr2の個数は4個である。2値化予測部150は、1値幅バーの個数を算出後、バーコードBC2の黒色と白色の配列パターンから、灰色のバーBr3aを黒色の1値幅バーSBr1と白色の1値幅バーSBr2に分割する。このバーコードBC2の配列パターンは、黒色の後には白色が続き、また、白色の後には黒色のバーが続くように構成される。すなわち、白色と黒色のバーが交互に配列されなければ、バーコードとして成立しない。
この例では、図4の(B)に示すバーBr3aは、黒色の多値幅バーLBr1と白色の多値幅バーLBr2に挟まれているので、バーBr3aの配列パターンは、紙面向かって左から、白色の1値幅バーSBr2→黒色の1値幅バーSBr1→白色の1値幅バーSBr2→黒色の1値幅バーSBr1となる。これにより、バーコードBC2のように同色化した場合であっても、黒色の1値幅バーSBr1と白色の1値幅バーSBr2を判別できるようになる。
続いて、図1に示したバーコードスキャナ100のローパスフィルタ130から出力される出力信号の波形とバーコードの関係について説明する。図5の(A)に示す出力信号の波形は、図5の(C)に示すバーコードBC1を読み取って出力された出力信号の波形である。図5の(A)の縦軸には信号レベルを設定し、横軸には画素位置を設定している。図5の(A)に示す出力信号は、該出力信号の全ての変曲点Iが検出されている。この変曲点Iに基づく幅情報のみから得た2値化結果から、図5の(B)に示すバーコードBC3を生成することができる。このバーコードBC3は、読み取った図5の(C)のバーコードBC1と同一である。
図6の(A)に示す出力信号の波形は、背景色と同色化した図6の(C)のバーコードBC2を読み取って出力された出力信号の波形である。図6の(A)の縦軸には信号レベルを設定し、横軸には画素位置を設定している。図6の(A)に示す出力信号は、該出力信号の一部の変曲点Iのみが検出されている。この例で、黒色の1値幅バーSBr1と白色の1値幅バーSBr2を判別するための変曲点は検出されていない。
このとき、図2に示した2値化予測部150は、変曲点間の信号の強度を示すレベル情報を追加することにより、バーコードBC2の1値幅バーSBr1,SBr2を白色と黒色の中間色である灰色のバーBr3として判別する。
2値化予測部150は、変曲点Iに基づく幅情報と変曲点間の信号の強度を示すレベル情報から、バーコードBC2を白色、黒色及び灰色の3値に分類する。そして、この灰色のバーBr3を、黒色の1値幅バーSBr1と白色の1値幅バーSBr2の集合として判別する。2値化予測部150は、灰色を示すバーBr3をバーコードBC2の配列パターンに照らし合わせて、黒色の1値幅バーSBr1と白色の1値幅バーSBr2を予測して分割する。これにより、背景色と同色化した図6の(C)のバーコードBC2を読み取った場合であっても、正確に読み取ることができる。
続いて、本発明に係るバーコードスキャナ100と従来のバーコードスキャナで読み取ったバーコードの読取深度の比較結果について説明する。ここで、読取深度とは、バーコードスキャナでバーコードを読むことができる最小距離と最大距離の差である。図7に示す縦軸には、バーコードの一例として、JAN(Japanese Article Number)のモジュール幅が0.33mmのバーコードと、code39の細バーの寸法が0.25mmのバーコードを設定し、横軸には読取深度(mm)を設定している。
図7に示すJANのバーコードにおいて、従来のバーコードスキャナでは、読み取り最小距離が約60mmで、読み取り最大距離が約120mmであり、読取深度は約60mmである。本発明に係るバーコードスキャナ100では、読み取り最小距離が約60mmで、読み取り最大距離が約200mmであり、読取深度は約140mmである。従って、本発明に係るバーコードスキャナ100は、従来のバーコードスキャナに比べて読取深度が約80mm向上している。
図7に示すcode39のバーコードにおいて、従来のバーコードスキャナでは、読み取り最小距離が約60mmで、読み取り最大距離が約138mmであり、読取深度は約78mmである。本発明に係るバーコードスキャナ100では、読み取り最小距離が約60mmで、読み取り最大距離が約238mmであり、読取深度は約178mmである。従って、本発明に係るバーコードスキャナ100は、従来のバーコードスキャナに比べて読取深度が約100mm向上している。
続いて、図1に示したバーコードスキャナ100の動作を詳細に説明する。図8は、バーコードスキャナ100の動作例を示すフローチャートである。この例では、図3の(B)に示したような、例えば印字対象の材質や印字の劣化によって、媒体に印字された1値幅バーSBr1及び多値幅バーLBr1の画像が背景色と同色化したバーコードBC2を読み取る場合について説明する。
図8に示すステップST1で、バーコードスキャナ100は、バーコードのラインデータを取り込んで変曲点を検出する。例えば、バーコードスキャナ100のエリアセンサーとして機能する図1の光電変換素子111は、不図示のLEDによりバーコードに照射されて反射された光信号を受光して電流信号に変換してI/V変換部112に出力する。I/V変換部112は、この電流信号を電圧信号に変換する。この電圧信号は、増幅部120により所定の電圧に増幅されてローパスフィルタ130を経て2値化予測部150に出力される。なお、光電変換素子111で受光したエリアデータから特定のラインデータのみを抜き出して該ラインデータを加算することにより、図9の(A)に示すノイズの少ないラインデータを得ることができる。
図9の(A)は、図3の(B)に示したような背景色と同色化したバーコードBC2を読み取った場合のラインデータの信号波形を示す図である。図9の(B)は、図9の(A)の信号波形を一階微分した信号波形を示す図である。図9の(C)は、図9の(A)の信号波形を二階微分した信号波形を示す図である。図9の(A),図9の(B)及び図9の(C)に示す縦軸には信号のレベルを設定し、横軸には画素位置を設定している。
2値化予測部150は、図9の(A)に示す信号波形の変曲点を検出する場合に、図9の(B)に示す一階微分の絶対値が特定のスライスラインL1,L2より大きく、かつ、図9の(C)に示す二階微分の値がゼロのラインとクロスしている点を変曲点として検出する。変曲点の検出の際に、二階微分の値を線形補完部155によって線形補完することで、変曲点の位置をより正確に読み取ることができる。スライスレベルは、ノイズとの区別をするために必要で、このスライスレベルを超えない変曲点(図9の(B)では、スライスラインL1とスライスラインL2との間にある変曲点)はノイズとして扱う。
2値化予測部150は、変曲点間の幅長を2値化バーコードデータとして図10に示すテーブルTB1のBBD[Ad]に保存する。2値化予測部150は、図9の(A)の変曲点の向き(変化量)を示す1次微分値が正(図9の(B)の信号波形が上に凸)の場合にはプラス(+)として図10に示すテーブルTB1のIO[Ad]に保存する。また、変曲点の向きを示す1次微分値が負(図9の(B)の信号波形が下に凸)の場合にはマイナス(−)として図10に示すテーブルTB1のIO[Ad]に保存する。
図10は、2値化バーコードデータBBD[Ad]と変曲点の向きを示すIO[Ad]を有するテーブルTB1の構成例を示す図である。図10に示すテーブルTB1は、アドレス「Ad」、BBD[Ad]及びIO[Ad]から構成されている。アドレス「Ad」は、BBDを参照するためのアドレスである。BBD[Ad]には、変曲点間の幅長を示す2値化バーコードデータが保存される。IO[Ad]には、変曲点の向き(変化量)を示す1次微分値(+−符号)が保存される。
この例で、図10に示すテーブルTB1には、図9の(A)に示した信号波形のBBD及び変曲点の向きが保存されている。例えば、スタートマージンSMを示すアドレス「Ad」の「0」には、BBD[Ad]に「1282」、IO[Ad]に「−」が保存されている。また、最初の2値化バーコードデータを示すBBD[1]に「15」、IO[1]に「−」が保存されている。
続いて、図8に示したフローチャートのステップST2の処理について説明する。図8に示すステップST2で、2値化予測部150は、変曲点間のレベルを計算する。図11は、図9の(A)のラインデータ(アナログデータ)におけるBBDごとのアナログ信号のレベルを示す図である。図11に示すアドレス「Ad」の「0」〜「20」は、図10のテーブルTB1のアドレス「Ad」の「0」〜「20」に相当する。例えば、図11によれば、テーブルTB1のBBD[1]のアナログ信号のレベルは、約35〜約47の間で変位している。
図12の(A)は、変曲点の向き(変化量)を示すIO[Ad],IO[Ad−1]から、2値化バーコードデータの信号の強度を示すレベル情報POW[Ad]を求める条件を示す図である。図12の(A)に示すCASE「A」は、変曲点の向きを示す1次微分値が、両方プラス(+)又は両方マイナス(−)の場合である。この場合、変曲点の向きを示す1次微分値が同じ符号であるため、BBD[Ad]は、灰色を示す2値化バーコードデータである。CASE「A」では、灰色を示す2値化バーコードデータであるため、抽出したアナログデータの中で最も変化が少ない2点の中間値を、図12の(B)のテーブルTB2のレベル情報POW[Ad]に設定する。
CASE「B」は、変曲点の向きを示す1次微分値が、IO[Ad−1]がマイナス(−)で、IO[Ad]がプラス(+)の場合である。この場合、変曲点の向きを示す1次微分値がマイナスからプラスに変位するため、BBD[Ad]は、黒色を示す2値化バーコードデータである。CASE「B」では、反射光の強度の低い黒色を示す2値化バーコードデータであるため、抽出したアナログデータの中で最小値を、図12の(B)のテーブルTB2のレベル情報POW[Ad]とする。
CASE「C」は、変曲点の向きを示す1次微分値が、IO[Ad−1]がプラス(+)で、IO[Ad]がマイナス(−)であると判定した場合である。この場合、変曲点の向きを示す1次微分値がプラスからマイナスに変位するため、BBD[Ad]は、白色を示す2値化バーコードデータである。CASE「C」では、反射光の強度の高い白色を示す2値化バーコードデータであるため、抽出したアナログデータの中で最大値を、図12の(B)のテーブルTB2のレベル情報POW[Ad]とする。
図13は、2値化バーコードデータの信号の強度を示すレベル情報POW[Ad]を計算する例を示すフローチャートであり、図8のステップST2の処理内容を詳細に説明するためのものである。図13に示すステップST200で、2値化予測部150は、図12の(B)のテーブルTB2のアドレス「Ad」に「0」を設定して初期化する。続いてステップST201に移行する。
ステップST201で、2値化予測部150は、テーブルTB1のアドレス「Ad」に設定されたアドレスの2値化バーコードデータ(BBD)の幅に属するアナログデータを抽出する。2値化予測部150は、例えばアドレス「Ad」が「0」に属する図11のアナログデータを抽出する。続いてステップST202に移行する。
ステップST202で、2値化予測部150は、変曲点の向き(変化量)を示すテーブルTB1のIO[Ad],IO[Ad−1]を参照し、変曲点の向き(変化量)を示すIO[Ad]とIO[Ad−1]が等しいか否かを判定する。図12の(A)に示すように、変曲点の向きを示す1次微分値が、両方プラス(+)又は両方マイナス(−)の場合(図12の(A)のCASE「A」に該当する場合)、IO[Ad]とIO[Ad−1]が等しいと判定してステップST203に移行する。
ステップST203で、2値化予測部150は、上述のステップST201で抽出したアナログデータの中で最も変化量の少ない2点の値を検出してステップST204に移行する。
ステップST204で、2値化予測部150は、上述のステップST203で検出した最も変化量の少ない2点の値から中間値を求め、図12の(B)に示すテーブルTB2のPOW[Ad]に該中間値を、変曲点間の信号の強度を示すレベル情報として設定する。例えば、このテーブルTB2のPOW[5]に中間値「35」を、変曲点間の信号の強度を示すレベル情報として設定する。続いてステップST208に移行する。
上述のステップST202で、変曲点の向き(変化量)を示すIO[Ad]とIO[Ad−1]が等しくない場合、ステップST205に移行する。
ステップST205で、2値化予測部150は、変曲点の向きを示すIO[Ad]がプラス(+)であるか否かを判定する。図12の(A)に示すように、変曲点の向きを示す1次微分値が、IO[Ad−1]がマイナス(−)で、IO[Ad]がプラス(+)の場合(図12の(A)のCASE「B」に該当する場合)、ステップST206に移行する。
ステップST206で、2値化予測部150は、上述のステップST201で抽出したアナログデータの中で最小値を検出して、図12の(B)に示すテーブルTB2のPOW[Ad]に該最小値を、変曲点間の信号の強度を示すレベル情報として設定する。例えば、このテーブルTB2のPOW[2]に最小値「31」を、変曲点間の信号の強度を示すレベル情報として設定する。続いてステップST208に移行する。
上述のステップST205で、2値化予測部150は、変曲点の向きを示すIO[Ad]がプラス(+)でない、すなわち図12の(A)に示すように、変曲点の向きを示す1次微分値が、IO[Ad−1]がプラス(+)で、IO[Ad]がマイナス(−)であると判定した場合(図12の(A)のCASE「C」に該当する場合)、ステップST207に移行する。
ステップST207で、2値化予測部150は、上述のステップST201で抽出したアナログデータの中で最大値を検出して、図12の(B)に示すテーブルTB2のPOW[Ad]に該最大値を、変曲点間の信号の強度を示すレベル情報として設定する。例えば、このテーブルTB2のPOW[3]に最大値「35」を、変曲点間の信号の強度を示すレベル情報として設定する。続いてステップST208に移行する。
ステップST208で、2値化予測部150は、図10に示したテーブルTB1のBBDのアドレス「Ad」を現在のアドレスから次のアドレスに変更してステップST209に移行する。
ステップST209で、2値化予測部150は、図10に示したテーブルTB1における次のアドレスのBBDが存在するか否かを判定する。次のアドレスのBBDが存在すると判定した場合、ステップSTST201に戻り、次のアドレスのBBDが存在しないと判定した場合、図8に示したフローチャートのステップST3に移行する。このようにして、変曲点間のレベル計算を行う。なお、図12の(B)のテーブルTB2には、説明の理解を容易にするために、変曲点の向きを示すIO[Ad]とIO[Ad−1]の関係を表したCASE「A」〜CASE「C」を記載している。
続いて、図8に示したフローチャートのステップST3の処理について説明する。図8に示すステップST3で、2値化予測部150は、マージン計算及び切り出し処理を行う。図14の(A)に示すテーブルTB3のBBD[Ad]、IO[Ad]を参照して、スタートマージン及びエンドマージンを検出して該マージンを切り出す。
この例では、スタートマージンとして決定する条件として、IO[Ad]がマイナスであり、かつ、BBD[Ad]が所定範囲における2値化バーコードデータの最小値の所定倍(例えば6倍)よりも大きいことを満たす場合とする。
また、エンドマージンとして決定する条件として、BBD[Ad]が所定範囲における2値化バーコードデータの最小値の所定倍(例えば12倍)よりも大きいか、又は、BBDのデータが有効な範囲の最後を満たす場合とする。
図15は、マージン計算及び切り出し処理を行う処理の一例を示すフローチャートであり、図8のステップST3の処理内容を詳細に説明するためのものである。
図15に示すステップST300で、2値化予測部150は、図14の(A)に示すテーブルTB3のBBD[Ad]のアドレス「Ad」に「0」を設定して初期化する。続いてステップST301に移行する。
ステップST301で、2値化予測部150は、図14の(A)に示すテーブルTB3を参照して、変曲点の向きを示すIO[Ad]がマイナス(−)であるか否かを判定する。IO[Ad]がマイナス(−)であると判定した場合、ステップST302に移行する。
ステップST302で、2値化予測部150は、テーブルTB3のBBD[Ad+1]からBBD[Ad+12]までの間で、2値化バーコードデータの最小値を検出してステップST303に移行する。
ステップST303で、2値化予測部150は、上述のステップST302で求めたBBDの最小値を所定倍した値とBBD[Ad]の2値化バーコードデータとを比較して、BBD[Ad]の2値化バーコードデータが大きければ、ステップST304に移行する。なお、この例では、BBDの最小値を6倍している。
ステップST304で、2値化予測部150は、図14の(A)のテーブルTB3のBBD[0]にスタートマージンを示す情報を設定する。例えば、図14の(B)のテーブルTB4に示すように、BBD[−]にスタートマージンを示す「st_margin」を設定する。スタートマージンを示す「st_margin」を設定後、図14の(B)のテーブルTB4に示すように、BBD[Ad]のアドレスをシフトさせる。例えば、図14の(B)のBBD[0]には、最初の2値化バーコードデータを示す「15」を設定する。続いてステップST305に移行する。
ステップST305で、2値化予測部150は、図14の(A)のテーブルTB3のBBDのアドレス「Ad」を現在のアドレスから次のアドレスに変更してステップST306に移行する。
ステップST306で、2値化予測部150は、図14の(A)のテーブルTB3における次のアドレスのBBDが存在するか否かを判定する。次のアドレスのBBDが存在しないと判定した場合、ステップST307に移行する。
ステップST307で、2値化予測部150は、テーブルTB3の現在のアドレスが示すBBD[Ad]にエンドマージンを示す「ed_margin」を設定してステップST311に移行する。
上述のステップST306で、2値化予測部150は、図14の(A)のテーブルTB3における次のアドレスのBBDが存在すると判定した場合、ステップST308に移行する。
ステップST308で、2値化予測部150は、上述のステップST302で求めたBBDの最小値を所定倍した値と現在のBBD[Ad]の2値化バーコードデータとを比較して、BBD[Ad]の2値化バーコードデータが大きければ、ステップST309に移行する。なお、この例では、BBDの最小値を12倍している。
ステップST309で、2値化予測部150は、図14の(B)のテーブルTB4に示すように、BBD[−]にエンドマージンを示す「ed_margin」を設定してステップST310に移行する。
ステップST310で、2値化予測部150は、図14の(A)のテーブルTB3のBBDのアドレス「Ad」を現在のアドレスから次のアドレスに変更してステップST311に移行する。
ステップST311で、2値化予測部150は、図14の(A)のテーブルTB3を参照してスタートマージンからエンドマージンまでのBBD、IO及びPOWを抽出して、図14の(B)に示すテーブルTB4を作成してステップST312に移行する。
ステップST312で、2値化予測部150は、図14の(A)のテーブルTB3における次のアドレスのBBDが存在するか否かを判定する。次のアドレスのBBDが存在すると判定した場合、ステップST301に戻る。次のアドレスのBBDが存在しないと判定した場合、図8に示したフローチャートのステップST4に移行する。このようにして、マージン計算及び切り出し処理を行う。
続いて、図8に示したフローチャートのステップST4の処理について説明する。図8に示すステップST4で、2値化予測部150は、白色、黒色、灰色の境界線の計算を行う。図17は、白色、黒色、灰色の境界線の計算を行う処理の一例を示すフローチャートであり、図8のステップST4の処理内容を詳細に説明するためのものである。
図17に示すステップST400で、2値化予測部150は、図14の(B)に示したテーブルTB4を参照して、変曲点の向きを示すIO[Ad]とIO[Ad−1]が同じ符号を示すPOWデータのみを抽出する。図16は、POWデータの抽出例を示す図である。図16に示す「POW_A」は、図14の(B)のIO[Ad]とIO[Ad−1]が同じ符号を示すPOWデータのみを抽出したものであり、「39」、「35」、「34」、「36」、「36」及び「44」となる。続いてステップST401に移行する。
ステップST401で、2値化予測部150は、IO[Ad]とIO[Ad−1]が同じ符号を示すPOW_Aが存在するか否かを判定する。POW_Aが存在すると判定した場合、ステップST402に移行する。
ステップST402で、2値化予測部150は、IO[Ad]とIO[Ad−1]が異なる符号を示すPOWデータのみを抽出する。図16に示す「POW_B」は、図14の(B)のIO[Ad]とIO[Ad−1]が異なる符号を示すPOWデータのみを抽出したものであり、「31」や「35」などがある。続いてステップST403に移行する。
ステップST403で、2値化予測部150は、POW_Bのデータの中から最大値を検出して、該最大値を白色の境界線の値(W_LINE)に設定する。例えば、図16のPOW_Bによると、このW_LINEは「58」となる。続いてステップST404に移行する。
ステップST404で、2値化予測部150は、POW_Bのデータの中から最小値を検出して、該最小値を黒色の境界線の値(B_LINE)に設定する。例えば、図16のPOW_Bによると、このB_LINEは「29」となる。続いてステップST405に移行する。
ステップST405で、2値化予測部150は、POW_Aのデータの中から3番目に大きい値と最も小さい値の中間値を求め、該中間値を灰色の境界線の値(G_LINE)として算出する。例えば、図16に示すPOW_Aによると、3番目に大きい値は「36」となり、最も小さい値は「34」となり、G_LINEは「35」となる。POW_Aのデータの中から3番目に大きい値を選択した理由は、レベルが大きくなる傾向があるスタートマージンとエンドマージンの付近のデータをカットするためである。続いてステップST406に移行する。
ステップST406で、2値化予測部150は、白色と灰色の境界線の値(WG_LINE)を以下の式(1)から求める。
WG_LINE=G_LINE+(W_LINE−G_LINE)×0.25・・・(1)
例えば、上述のステップST403,ST405で求めたW_LINE=「58」、G_LINE=「35」を式(1)に代入すると、WG_LINEは、小数点以下を四捨五入して「41」になる。続いてステップST407に移行する。
ステップST407で、2値化予測部150は、黒色と灰色の境界線の値(GB_LINE)を以下の式(2)から求める。
GB_LINE=G_LINE−(G_LINE−B_LINE)×0.25・・・(2)
例えば、上述のステップST404,ST405で求めたB_LINE=「29」、G_LINE=「35」を式(2)に代入すると、GB_LINEは、小数点以下を四捨五入して「34」になる。このようにして、白色、黒色、灰色の境界線を求めて、図8に示したフローチャートのステップST5に移行する。
また、上述のステップST401で、2値化予測部150は、IO[Ad]とIO[Ad−1]が同じ符号を示すPOW_Aが存在しないと判定した場合、ステップST408に移行する。
ステップST408で、2値化予測部150は、図14の(B)に示すPOWの全データの中から最大値を検出して、該最大値を白色の境界線の値(W_LINE)に設定してステップST409に移行する。
ステップST409で、2値化予測部150は、図14の(B)に示すPOWの全データの中から最小値を検出して、該最小値を黒色の境界線の値(B_LINE)に設定してステップST410に移行する。
ステップST410で、2値化予測部150は、ステップST408で設定したW_LINEとステップST409で設定したB_LINEの中間値を求め、該中間値を灰色の境界線の値(G_LINE)として算出する。続いてステップST406に移行する。このようにして、IO[Ad]とIO[Ad−1]が同じ符号を示すPOW_Aが存在しない場合は、白色、黒色、灰色の境界線を求める。
続いて、図8に示したフローチャートのステップST5の処理について説明する。図8に示すステップST5で、2値化予測部150は、変曲点間の色を振り分ける計算を行う。この例では、変曲点の向きを示すIO[Ad]、2値化バーコードデータの信号の強度を示すレベル情報POW[Ad]、白色と灰色の境界線の値(WG_LINE)、黒色と灰色の境界線の値(GB_LINE)を用いて色の振り分けを行う。
図18は、色の振り分け例を示すテーブルTB5を示す図である。図18に示すテーブルTB5には、色の振り分けを示すCOLOR[Ad]に、偶数個の1値幅バーが存在することを示す「偶数灰色(EG)」が設定されている。この「偶数灰色(EG)」を設定するためには、図14の(B)のテーブルTB4を参照して、IO[Ad−1]とIO[Ad]が同じ符号を満たすことを条件とする。
図19の(A)は、色の振り分け例の条件を示す図である。図19の(A)に示すように、IO[Ad]がプラス(+)であり、POW[Ad]がWG_LINEよりも大きい場合には、奇数個の灰色(G)となる。例えば、図14の(B)に示すアドレス「Ad」が「18」の場合、IO[18]がプラス(+)であり、POW[18]が「50」であり、WG_LINE(=41)よりも大きくなり、図19の(B)のテーブルTB6に示すように「奇数灰色(OG)」となる。また、図19の(A)に示すように、IO[Ad]がプラス(+)であり、POW[Ad]がWG_LINEとGB_LINEの間である場合にも、「奇数灰色(OG)」となる。
IO[Ad]がプラス(+)であり、POW[Ad]がGB_LINEよりも小さい場合には、黒色(B)となる。例えば、図14の(B)に示すアドレス「Ad」が「1」の場合、IO[1]がプラス(+)であり、POW[1]が「31」であり、GB_LINE(=34)よりも小さくなり、図19の(B)のテーブルTB6に示すように「黒色(B)」となる。
IO[Ad]がマイナス(−)であり、POW[Ad]がWG_LINEよりも大きい場合には、白色(W)となる。例えば、図14の(B)に示すアドレス「Ad」が「5」の場合、IO[5]がマイナス(−)であり、POW[5]が「45」であり、WG_LINE(=41)よりも大きくなり、図19の(B)のテーブルTB6に示すように「白色(W)」となる。
IO[Ad]がマイナス(−)であり、POW[Ad]がWG_LINEとGB_LINEの間である場合には、奇数個の灰色(G)となる。例えば、図14の(B)に示すアドレス「Ad」が「2」の場合、IO[2]がマイナス(−)であり、POW[2]が「35」であり、POW[2]の値「35」が、WG_LINE(=41)とGB_LINE(=34)の間であり、図19の(B)のテーブルTB6に示すように「奇数灰色(OG)」となる。また、IO[Ad]がマイナス(−)であり、POW[Ad]がGB_LINEよりも小さい場合にも、奇数個の灰色(G)となる。
図20は、変曲点間の色を振り分ける計算を行う処理の一例を示すフローチャートであり、図8のステップST5の処理内容を詳細に説明するためのものである。図20に示すステップST500で、2値化予測部150は、図14の(B)に示したテーブルTB4のBBD[Ad]のアドレス「Ad」に「0」を設定して初期化する。続いてステップST501に移行する。
ステップST501で、2値化予測部150は、変曲点の向きを示すテーブルTB4のIO[Ad],IO[Ad−1]を参照する。変曲点の向きを示すIO[Ad]とIO[Ad−1]が等しいか否かを判定する。IO[Ad]とIO[Ad−1]が等しいと判定した場合、ステップST511に移行する。
ステップST511で、2値化予測部150は、図19の(B)のテーブルTB6における色の振り分けを示すCOLOR[Ad]に、「偶数灰色(EG)」を設定してステップST509に移行する。
また、上述のステップST501で、2値化予測部150は、IO[Ad]とIO[Ad−1]が等しくないと判定した場合、ステップST502に移行する。
ステップST502で、2値化予測部150は、変曲点の向きを示すIO[Ad]がプラス(+)であるか否かを判定する。IO[Ad]がプラス(+)であると判定した場合、ステップST503に移行する。
ステップST503で、2値化予測部150は、2値化バーコードデータの信号の強度を示すPOW[Ad]が黒色と灰色の境界線の値(GB_LINE)より小さいか否かを判定する。POW[Ad]がGB_LINEより小さいと判定した場合、ステップST504に移行する。
ステップST504で、2値化予測部150は、図19の(B)のテーブルTB6における色の振り分けを示すCOLOR[Ad]に、「黒色(B)」を設定してステップST509に移行する。
上述のステップST503で、2値化予測部150は、2値化バーコードデータの信号の強度を示すPOW[Ad]がGB_LINE以上と判定した場合、ステップST505に移行する。
ステップST505で、2値化予測部150は、図19の(B)のテーブルTB6における色の振り分けを示すCOLOR[Ad]に、「奇数灰色(OG)」を設定してステップST509に移行する。
上述のステップST502で、2値化予測部150は、変曲点の向きを示すIO[Ad]がプラス(+)でないと判定した場合、ステップST506に移行する。
ステップST506で、2値化予測部150は、2値化バーコードデータの信号の強度を示すPOW[Ad]が白色と灰色の境界線の値(WG_LINE)より大きいか否かを判定する。POW[Ad]がWG_LINEより大きいと判定した場合、ステップST507に移行する。
ステップST507で、2値化予測部150は、図19の(B)のテーブルTB6における色の振り分けを示すCOLOR[Ad]に、「白色(W)」を設定してステップST509に移行する。
上述のステップST506で、2値化予測部150は、2値化バーコードデータの信号の強度を示すPOW[Ad]がWG_LINE以下と判定した場合、ステップST508に移行する。
ステップST508で、2値化予測部150は、図19の(B)のテーブルTB6における色の振り分けを示すCOLOR[Ad]に、「奇数灰色(OG)」を設定してステップST509に移行する。
ステップST509で、2値化予測部150は、図14の(B)に示したテーブルTB4のBBDのアドレス「Ad」を現在のアドレスから次のアドレスに変更してステップST510に移行する。
ステップST510で、2値化予測部150は、図14の(B)に示したテーブルTB4における次のアドレスのBBDが存在するか否かを判定する。次のアドレスのBBDが存在すると判定した場合、ステップSTST501に戻り、次のアドレスのBBDが存在しないと判定した場合、図8に示したフローチャートのステップST6に移行する。このようにして、変曲点間の色を振り分ける。
続いて、図8に示したフローチャートのステップST6の処理について説明する。図8に示すステップST6で、2値化予測部150は、図14の(B)のテーブルTB4を参照して、基準最小幅を計算する。
例えば、変曲点の向きを示すIO[Ad]とIO[Ad−1]の符号が同じ2値化バーコードデータのみを抽出して、これらのデータを「BBD_A」と称する。図21の(A)は、図14の(B)のテーブルTB4から抽出したBBD_Aを列挙した図であり、BBD_Aは、「15」,「14」,「14」,「13」,「23」及び「12」である。
BBD_Aは、基準最小幅(1値幅バー)の白色と黒色が偶数個しか存在しないデータなので、複数の最小BBD_Aは、白色と黒色の1値幅バーが1つずつ存在する。従って、複数の最小BBD_Aを平均して1つの最小BBD_Aを求め、平均された最小BBD_Aを半分にすると、基準となる1値幅バーを得ることができる。
一方で、変曲点の向きを示すIO[Ad]とIO[Ad−1]の符号が異なる2値化バーコードデータのみを抽出して、これらのデータを「BBD_B」と称する。図21の(A)は、図14の(B)のテーブルTB4から抽出したBBD_Bを列挙した図であり、BBD_Bは、「13」や「7」などである。
BBD_Bは、1値幅バーや多値幅バーなどの様々なバーが存在する。最小BBD_Bは、白色又は黒色の1値幅バーが1つ存在する。従って、複数の最小BBD_Bを平均して、基準となる1値幅バーを得ることができる。
図21の(A)に示すBBD_Aによると、最も細いBBD_Aは1値幅バーが2本であり、次に細いBBD_Aは1値幅バーが4本なので2倍の太さを持つ。従って、最小BBD_Aを求める場合、BBD_Aのデータの中から、最小幅のBBD_Aを検出する。そして、次に細いBBD_Aは2倍以上の太さなので、これを検出しないようにするために、該最小幅のBBD_Aを1.5倍した値のデータまでを抽出する。抽出した結果を図21の(B)のBBD_Aに示す。図21の(B)によれば、BBD_Aの値は、「15」,「14」,「14」,「13」及び「12」になる。
また、図21の(A)に示すBBD_Bによると、最も細いBBD_Bは1値幅バーが1本であり、次に細いBBD_Bは1値幅バーの集合か、又は多値幅バーであるので2倍以上の太さを持つ。従って、最小BBD_Bを求める場合、図21の(A)のBBD_Bにおけるデータの中から、最小幅のBBD_Bを検出する。そして、次に細いBBD_Bは2倍以上の太さなので、これを検出しないようにするために、該最小幅のBBD_Bを1.5倍した値のデータまでを抽出する。抽出した結果を図21の(B)のBBD_Bに示す。図21の(B)によれば、BBD_Bの値は、「7」,「7」及び「8」になる。
図21の(B)に示すBBD_AとBBD_Bを用いて、基準となる最小幅を求める。例えば、BBD_Aの平均値は「13.6」となり、2本分の1値幅バーが含まれている。従って、この値の半分の値「6.8」が基準最小幅(BBD_ref_A)となる。BBD_Bの平均値は「7.3」となり、1本分の1値幅バーが含まれている。従って、この値「7.3」が基準最小幅(BBD_ref_B)となる。
仮に、BBD_Aの最小幅が2本分の1値幅バーではなくて4本分の1値幅バーが含まれ、BBD_Bの最小幅が1本分の1値幅バーの場合、BBD_ref_AはBBD_ref_Bの略2倍の値となる。この場合、BBD_ref_A>BBD_ref_B×1.5の条件を満たすときには、基準最小幅には、BBD_ref_Bを使用する。
逆に、BBD_Aの最小幅が2本分の1値幅バーが含まれ、BBD_Bの最小幅が2値幅バーの場合、BBD_ref_BはBBD_ref_Aの略2倍の値となる。この場合、BBD_ref_B>BBD_ref_A×1.5の条件を満たすときには、基準最小幅には、BBD_ref_Aを使用する。
BBD_Aの最小幅が2本分の1値幅バーが含まれ、BBD_Bの最小幅が1本分の1値幅バーの場合はどちらの値も有効だが、白色と黒色の太さが違う場合にはBBD_ref_Bの信頼性が低くなる。このため、BBD_ref_Aを使用する。従って、BBD_ref_A>BBD_ref_B×1.5を満たす場合のみBBD_ref_Bを基準とする最小幅とし、それ以外ではBBD_ref_Aを基準とする最小幅とする。この例では、BBD_ref_A>BBD_ref_B×1.5を満たさないので、基準となる最小幅は、BBD_ref_Aの「6.8」となる。
図22は、基準最小幅の計算を行う処理の一例を示すフローチャートであり、図8のステップST6の処理内容を詳細に説明するためのものである。図22に示すステップST600で、2値化予測部150は、図14の(B)に示したテーブルTB4において、変曲点の向きを示すIO[Ad]とIO[Ad−1]の符号が等しい2値化バーコードデータ(BBD_A)のみを検出してステップST601に移行する。
ステップST601で、2値化予測部150は、IO[Ad]とIO[Ad−1]の符号が等しい2値化バーコードデータ(BBD_A)が存在するか否かを判定する。BBD_Aが存在すると判定した場合、ステップST602に移行する。
ステップSTで、2値化予測部150は、変曲点の向きを示すIO[Ad]とIO[Ad−1]の符号が異なる2値化バーコードデータ(BBD_B)を検出してステップST603に移行する。
ステップST603で、2値化予測部150は、抽出したBBD_Aのデータの中から、最小幅のBBD_Aを検出する。例えば、図21の(A)に示す「BBD_A」のデータの中から最小幅の「12」を検出する。続いてステップST604に移行する。
ステップST604で、2値化予測部150は、最小幅のBBD_Aを1.5倍した値(例えば、最小幅12の1.5倍の18)のデータまでを抽出する。例えば、図21の(B)によれば、BBD_Aの値は、「15」,「14」,「14」,「13」及び「12」になる。続いてステップST605に移行する。
ステップST605で、2値化予測部150は、BBD_Aから基準最小幅を算出する。例えば、図21の(B)に示すBBD_Aの値を平均して最小BBD_Aを求め、平均された最小BBD_Aを半分にして、基準となる1値幅バーを算出する。例えば、図21の(B)によれば、基準最小幅(BBD_ref_A)は、「6.8」になる。もちろん、他の方法によりBBD_ref_Aを算出してもよい。例えば、図21の(B)に示すBBD_Aの中から最大幅を求め、該最大幅のBBD_AとステップST603の最小幅のBBD_Aとを平均して求めてもよい。続いてステップST606に移行する。
ステップST606で、2値化予測部150は、上述のステップST602で抽出したBBD_Bのデータの中から、最小幅のBBD_Bを検出する。例えば、図21の(A)に示す「BBD_B」のデータの中から最小幅の「7」を検出する。続いてステップST607に移行する。
ステップST607で、2値化予測部150は、最小幅のBBD_Bを1.5倍した値(例えば、最小幅7の1.5倍の10.5)のデータまでを抽出する。例えば、図21の(B)によれば、BBD_Bの値は、「7」,「7」及び「8」になる。続いてステップST608に移行する。
ステップST608で、2値化予測部150は、BBD_Bから基準最小幅を算出する。例えば、図21の(B)に示すBBD_Bの値を平均して最小BBD_Bを求めて、基準となる1値幅バーを算出する。例えば、図21の(B)によれば、基準最小幅(BBD_ref_B)は、「7.3」になる。もちろん、他の方法によりBBD_ref_Bを算出してもよい。例えば、図21の(B)に示すBBD_Bの中から最大幅を求め、該最大幅のBBD_BとステップST606の最小幅のBBD_Bとを平均して求めてもよい。続いてステップST609に移行する。
ステップST609で、2値化予測部150は、BBD_ref_A>BBD_ref_B×1.5の条件を満たすか否かを判定する。BBD_ref_A>BBD_ref_B×1.5の条件を満たすときには、ステップST610に移行する。
ステップST610で、2値化予測部150は、基準最小幅には、BBD_ref_Bを設定する。また、上述のステップST609で、2値化予測部150は、BBD_ref_A>BBD_ref_B×1.5の条件を満たさないときには、ステップST611に移行する。ステップST611で、2値化予測部150は、基準最小幅には、BBD_ref_Aを設定する。
上述のステップST601で、2値化予測部150は、IO[Ad]とIO[Ad−1]の符号が等しい2値化バーコードデータ(BBD_A)が存在しないと判定した場合、ステップST612に移行する。
ステップST612で、2値化予測部150は、全ての2値化バーコードデータ(BBD)の中から、最小幅のBBDを検出してステップST613に移行する。
ステップST613で、2値化予測部150は、最小幅のBBDを1.5倍した値のデータまでを抽出してステップST614に移行する。
ステップST614で、2値化予測部150は、ステップST613で抽出したBBDから基準最小幅を算出する。例えば、抽出したBBDの中から最大幅を求め、該最大幅のBBDとステップST612の最小幅のBBDとを平均して、基準最小幅(BBD_ref)を算出する。続いてステップST615に移行する。ステップST615で、2値化予測部150は、基準最小幅には、BBD_refを設定して図8に示したフローチャートのステップST7に移行する。このようにして、基準最小幅の計算を行う。
続いて、図8に示したフローチャートのステップST7の処理について説明する。図8に示すステップST7で、2値化予測部150は、灰色のバーの分割処理を行う。例えば、図19の(B)に示したテーブルTB6を参照して、灰色のバーの分割処理を行う。このテーブルTB6の色の振り分けを示すCOLOR[Ad]が「白色(W)」及び「黒色(B)」の場合には分割しない。COLOR[Ad]が「偶数灰色(EG)」の場合には、偶数個になるように分割する。COLOR[Ad]が「奇数灰色(OG)」の場合には、奇数個になるように分割する。
図23の(A)は、灰色を示すBBD[Ad]を奇数に分割する例を示す図である。図23の(A)に示す分割数Div_n[Ad]は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算して求める。例えば、図19の(B)のテーブルTB6のBBD[2]の「7」を、基準最小幅BBD_ref(=6.8)で除算すると、図23の(A)の「0〜2」に該当するので、分割数Div_n[Ad]は、図24の(A)に示すように「1」となる。
図23の(B)は、灰色を示すBBD[Ad]を偶数に分割する例を示す図である。図23の(B)に示す分割数Div_n[Ad]は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算して求める。例えば、図19の(B)のテーブルTB6のBBD[0]の「15」を、基準最小幅BBD_ref(=6.8)で除算すると、図23の(B)の「0〜3」に該当するので、分割数Div_n[Ad]は、図24の(A)に示すように「2」となる。図24の(A)は、灰色バーの分割例を示すテーブルTB7の一例を示す図である。図24の(A)のテーブルTB7に示すように、COLOR[Ad]が「偶数灰色(EG)」又は「奇数灰色(OG)」を示すBBD[Ad]の分割数Div_n[Ad]を求める。
図24の(B)は、分割した2値化バーコードデータF_BBDを示すテーブルTB8である。図24の(B)に示すテーブルTB8のF_BBDは、2値化バーコードデータBBD[Ad]を分割数Div_n[Ad]で除算して求める。例えば、テーブルTB8のBBD[0]の「15」を分割数Div_n[2]で除算して、F_BBDの値「7.5」を求める。同様にして、COLOR[Ad]が「偶数灰色(EG)」又は「奇数灰色(OG)」を示すBBD[Ad]のF_BBDを求める。
図25は、分割した2値化バーコードデータF_BBDの最小分解能を「1」に正規化したテーブルTB9である。図25に示すテーブルTB9によると、「reference」には1値幅バーを示す「1.0」又は多値幅バーを示す「2.5」が設定されて、バーコードが再現されている。
図26は、灰色のバーの分割処理を実施するフローチャートであり、図8のステップST7の処理内容を詳細に説明するためのものである。図26に示すステップST700で、2値化予測部150は、図19の(B)のテーブルTB6のアドレス「Ad」に「0」を設定して初期化する。続いてステップST701に移行する。
ステップST701で、2値化予測部150は、図19の(B)のテーブルTB6を参照して、色の振り分けを示すCOLOR[Ad]が白色(W)であるか否かを判定する。COLOR[Ad]が白色(W)でないと判定した場合、ステップST702に移行する。
ステップST702で、2値化予測部150は、図19の(B)のテーブルTB6を参照して、色の振り分けを示すCOLOR[Ad]が黒色(B)であるか否かを判定する。COLOR[Ad]が黒色(B)でないと判定した場合、ステップST703に移行する。
ステップST703で、2値化予測部150は、図19の(B)のテーブルTB6を参照して、色の振り分けを示すCOLOR[Ad]が偶数の灰色(EG)であるか否かを判定する。COLOR[Ad]が偶数の灰色(EG)であると判定した場合、ステップST704に移行する。
ステップST704で、2値化予測部150は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算する。例えば、図19の(B)のテーブルTB6のBBD[0]の「15」を、基準最小幅BBD_ref(=6.8)で除算してステップST705に移行する。
ステップST705で、2値化予測部150は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算した値が、図23の(B)のどの範囲に該当するか判定する。例えば、図19の(B)のテーブルTB6のBBD[0]の「15」を、基準最小幅BBD_ref(=6.8)で除算した値は、図23の(B)の「0〜3」に該当するので、分割数Div_n[Ad]は、図24の(A)に示すように「2」となる。続いてステップST706に移行する。
ステップST706で、2値化予測部150は、2値化バーコードデータのアドレスを次のアドレスに進めてステップST707に移行する。
ステップST707で、2値化予測部150は、2値化バーコードデータBBD[Ad]を分割数Div_n[Ad]で除算して、分割された2値化バーコードデータF_BBD算出する。例えば、図24の(B)のテーブルTB8におけるBBD[0]の「15」を分割数Div_n[2]で除算して、F_BBDの値「7.5」を算出する。続いてステップST708に移行する。
ステップST708で、2値化予測部150は、図19の(B)に示したテーブルTB6における次のアドレスのBBDが存在するか否かを判定する。次のアドレスのBBDが存在すると判定した場合、ステップSTST701に戻る。
上述のステップST703で、2値化予測部150は、図19の(B)のテーブルTB6を参照して、色の振り分けを示すCOLOR[Ad]が奇数の灰色(OG)であると判定した場合、ステップST709に移行する。
ステップST709で、2値化予測部150は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算する。例えば、図19の(B)のテーブルTB6のBBD[2]の「7」を、基準最小幅BBD_ref(=6.8)で除算してステップST710に移行する。
ステップST710で、2値化予測部150は、2値化バーコードデータBBD[Ad]を基準最小幅BBD_refで除算した値が、図23の(A)のどの範囲に該当するか判定する。例えば、図19の(B)のテーブルTB6のBBD[2]の「7」を、基準最小幅BBD_ref(=6.8)で除算した値は、図23の(A)の「0〜2」に該当するので、分割数Div_n[Ad]は、図24の(A)に示すように「1」となる。続いてステップST706に移行する。
上述のステップST701,ST702で、2値化予測部150は、図19の(B)のテーブルTB6を参照して、色の振り分けを示すCOLOR[Ad]が白色(W)又は黒色(B)であると判定した場合、ステップST711に移行する。
ステップST711で、2値化予測部150は、2値化バーコードデータBBDを分割しないので、図24の(A)に示すテーブルTB7の分割数Div_n[Ad]に「1」を設定してステップST706に移行する。
上述のステップST708で、2値化予測部150は、図19の(B)に示したテーブルTB6における次のアドレスのBBDが存在しないと判定した場合、図8に示すステップST8に移行する。
図8のステップST8では、デコード処理を行う。例えば、図25に示したテーブルTB9の「reference」からバーコードで表された情報を復号する。
このように、第1の実施の形態に係るバーコードスキャナ100及びバーコード読取方法によれば、変曲点間の信号の強度を示すレベル情報を求め、該レベル情報に基づいて2値化バーコードデータを、反射光の強度の高い白色、反射光の強度の低い黒色、および白色と黒色の略中間を示す灰色に分類する。そして、灰色が示す2値化バーコードデータを、最小幅の2値化バーコードデータで除算して灰色の2値化バーコードデータを分割してバーコード情報を求める。
これにより、白色と黒色の略中間を示す灰色の2値化バーコードデータを認識できるようになる。従って、劣化したバーコードの信号波形からバーコードを正しく認識できるようになる。これにより、システムリソースを大幅に増やすことなく、バーコードの読み取り精度を向上できるようになる。
<第2の実施の形態>
本実施の形態では、二次元コードを読み取るコードスキャナ200について説明する。前述の第1の実施の形態及び実施例と同じ名称及び符号のものは同じ機能を有するので、その説明を省略する。
図27は、第2の実施の形態に係るコードスキャナ200の構成例を示すブロック図である。図27に示すように、コードスキャナ200は、画像取込手段の一例である光学ヘッド部201及び輝度ヒストグラム作成部を有する2値化予測部204からなる。光学ヘッド部201は、レンズ202及び固体撮像素子の一例であるCMOSイメージセンサ(以下、CMOS203という)を備える。
レンズ202は、例えば、光学レンズであり、図28の(A)に示すPDF417や、図28の(B)に示すQRコード(登録商標)や、図28(C)に示すRSS Expanded等の二次元コードの画像データを光学ヘッド部201内に取り込む。レンズ202にはCMOS203が設けられる。CMOS203は、レンズ202が取り入れた画像データを撮像し、該撮像した画像データをアナログの画像データからデジタルの輝度値で表現される画像データに変換して、出力信号として2値化予測部204に出力する。
2値化予測部204は、CMOS203から出力された出力信号に含まれる画像データの輝度値を縦横のライン毎に測定する。2値化予測部204は、ライン毎に測定した輝度値から図29に示す輝度ヒストグラムを図示しない輝度ヒストグラム作成部で作成する。(図29は、縦軸を輝度値とし、横軸を位置xとしたときの輝度ヒストグラム例を示す図である。)
2値化予測部204は、輝度ヒストグラム作成部で作成された輝度ヒストグラムから二次元コードの変曲点I1,I2,I3を検出して、変曲点間の信号の強度を示すレベル情報を求め、該レベル情報に基づいて2値化コードデータを、輝度値の高い白色、輝度値の低い黒色及び白色と黒色の略中間を示す灰色に分類する。そして、灰色が示す2値化コードデータを、最小幅の2値化コードデータで除算して灰色の2値化コードデータを分割して画像データの2値化信号を求める。
2値化予測部204は、上述の処理を縦横のライン毎で行うことによって、二次元コードに対する2値化信号を求める。この2値化信号は、後段の不図示の復号化回路によりデコードされて二次元コードのコード記号として読み取られる。
2値化予測部204の詳細な構成については、図2で説明した2値化予測部150の微分処理部153の代わりに輝度ヒストグラム作成部を設け、その他は2値化予測部150と同じであるので、その説明を省略する。
このように、第2の実施の形態に係るコードスキャナ200によれば、二次元コードを含む画像を取り込んで、この画像をデジタルの輝度値で表現される画像データに変換し、該変換した画像データの輝度値を縦横のライン毎で測定して輝度ヒストグラムを作成する。作成した輝度ヒストグラムから変曲点を検出して、該変曲点間の幅長を示す2値化コード記号データと該変曲点の変化量を求め、変曲点間の信号の強度を示すレベル情報を求める。この求めたレベル情報に基づいて2値化コード記号データを、輝度値の高い白色、輝度値の低い黒色及び白色と黒色の略中間を示す灰色に分類する。そして、灰色の情報が示す2値化コード記号データを、最小幅の2値化コード記号データで除算して該灰色の情報の2値化コード記号データを分割してコード記号情報を求める。
これにより、二次元コードの信号波形が劣化していても、二次元コードを正しく認識できるようになる。この結果、システムリソースを大幅に増やすことなく、二次元コードの読み取り精度を向上できるようになる。