以下、本発明の実施の形態を説明する。
図1は、画像処理装置の装置構成図である。1は画像処理装置である。画像処理装置1は、多値画像から二値画像を取得する機能を実現する装置である。画像処理装置1は、制御部2、入力部3、出力部4、メモリ5、記憶部6、ネットワークインターフェース(ネットワークI/F)7を有し、それぞれがバス9で接続される。
制御部2は画像処理装置1の全体を制御する。例えば、中央処理装置(Central Processing Unit(CPU))である。制御部2はメモリ5に展開された画像処理プログラム8を実行する。画像処理プログラム8は画像処理装置1に画像処理を実行させる。制御部2は画像処理プログラム8によって、画像を取得する画像取得手段、画像を二値化する画像二値化手段、画像内の罫線の候補を抽出する罫線候補抽出手段等として機能する。画像二値化手段は、二値化する領域を取得する二値化領域取得手段、第一の閾値および第二の閾値を算出する算出手段、画素の二値を判別する判別手段、罫線の候補となるエッジを検出するエッジ検出手段等として機能する。罫線候補抽出手段は、黒画素をグループ化する黒画素グループ化手段、短いランレングスを削除する短ラン削除手段、罫線の領域を取得する罫線領域取得手段、罫線の座標を補正する罫線座標補正手段、罫線の幅を検証する罫線幅検証手段等として機能する。制御部2は、以上の処理によって、多値画像から罫線を検出する機能を実現する。
入力部3は、制御部2に与える種々の命令を受付ける。入力部3は、例えば、キーボード、マウス、タッチパネル、イメージスキャナ等である。また、命令は、ネットワーク7−1を経由して取得する場合もある。
出力部4は、例えば、ディスプレイである。なお、制御部2により作成された二値画像は、例えば、文字認識処理での入力画像情報に相当する場合がある。この場合、二値画像は出力部4に表示する必要はない。
メモリ5は、制御部2で実行する画像処理プログラム8が展開される記憶領域である。メモリ5は、制御部2の演算結果などのデータ、入力画像データ、出力画像データ等も格納する。例えば、第一の閾値を格納する閾値バッファが格納される。メモリ5は、例えば、ランダムアクセスメモリ(Random Access Memory(RAM))である。
記憶部6は例えばハードディスク装置である。記憶部6は、画像処理プログラム8、ノード間の意味の階層情報テーブル、テキスト情報等を記憶する。
ネットワークインターフェース7は、ネットワーク7−1に接続し、情報のやり取りを可能にする。制御部2は、ネットワークインターフェース7を介して入力画像情報、出力画像情報、演算パラメータ等を取得するあるいは出力する場合もある。
以下、制御部2が実行する処理について説明する。まず、制御部2は、入力画像を取得する。例えば、文書が紙の媒体である場合、制御部2は光学スキャナと光学スキャナを制御するプログラムを実行することによって入力画像を取得する。また、記憶部に入力画像情報が格納されている場合、記憶部から入力画像情報を読み出す処理を実行することによって入力画像を取得する。また、制御部2は、画像処理装置に接続されたネットワーク7−1を経由して入力画像を取得すること等も可能である。
ここで、入力画像および出力画像の語句を定義する。図2は画像の構成例である。
10は画像である。本実施例の画像は、多値画像と二値画像がある。多値画像は入力画像である。多値画像は、画素の輝度(明度)を3以上の階調で表示するものである。多値画像は、例えば、カラー画像や濃淡(グレースケール)画像等である。二値画像は出力画像である。二値画像は、画素の輝度(明度)を2の階調で表示するものである。2の階調は、白画素あるいは黒画素である。本実施例では、入力画像内の文字、罫線等を示す画素を黒画素として表示するものとする。
11は画像10の横方向の幅である。幅11は、画像10の横方向に並ぶ画素数である。12は画像10の縦方向の高さである。高さ12は、画像10の縦方向に並ぶ画素数である。13は画素の画像10の横方向の位置を特定するための横座標値である。14は画素の画像10の縦方向の位置を特定するための縦座標値である。
15は、横座標値13、縦座標値14で特定される画素である。なお、以降の説明において、二値化処理の対象となる画素を着目画素(対象画素)という。
16は、画素15を二値化処理の対象の着目画素としたときの着目画素15の周辺領域である。周辺領域16は着目画素15の第一の閾値を求める範囲である。第一の閾値は、従来の手法で算出する値である。例えば、第一の閾値は周辺画素の明度から計算で算出する。本実施例の周辺領域16は、着目画素15を中心とした矩形領域である。周辺領域16内の各周辺画素が有するそれぞれの第一の閾値が、複数の第一の閾値である。
17は、着目画素15から周辺領域16の幅11方向の端までの距離である。本実施例では、周辺領域16は着目画素15を中心とした矩形領域であるため、距離17は、着目画素15から周辺領域16の高さ方向12の端までの距離でもある。18は、周辺領域16に含まれる画素である。なお、以降の説明において、周辺領域16に含まれる画素を周辺画素という。16−2は、画素18に対する第一の閾値を算出するための周辺領域である。本実施例では、周辺領域16−2は、画素18を中心とした矩形領域である。周辺領域16−2は、周辺領域16と同じ大きさである。周辺領域16と周辺領域16−2とは異なる大きさであってもよい。本実施例では、以上の2種類の周辺領域が用いられる。局所的二値化で使用する領域が周辺領域16−2(第二の周辺領域)である。本実施例で新たに導入された領域が周辺領域16(第一の周辺領域)である。
次に、制御部2が入力画像情報を取得してから、入力画像上の罫線情報を検出するまでの処理について説明する。
図3は、入力画像情報を取得してから、入力画像上の罫線情報を検出するまでの制御部2の機能ブロック図である。制御部2は、入力画像を取得する画像入力手段201、入力画像を二値化する画像二値化手段202、罫線の候補を抽出する罫線候補抽出手段206として機能する。また、画像二値化手段202は、入力画像内の着目画素を設定して着目画素の周辺領域に存在する周辺画素の値から第一の閾値を求める閾値取得手段203、周辺領域内の着目画素および各周辺画素の第一の閾値から着目画素を二値化するための第二の閾値を求める閾値補正手段204、着目画素を二値に判別する二値判定手段205から構成される。
制御部2の処理は、以下の2つの処理ステップに大きく分けられる。制御部2は、第一の処理ステップで入力画像を二値化した二値画像を求める。制御部2は、第二の処理ステップで二値画像から罫線を求める。
制御部2が実行する第一の処理ステップの概要は、以下である。制御部2は入力画像の着目画素15に対する周辺領域16内の各画素に対応する第一の閾値を求める。そして、制御部2は、周辺領域16内の各画素に対応する複数の第一の閾値の内、最大値を検索する。そして、制御部2は、第一の閾値の最大値を利用して、着目画素15の第二の閾値を計算する。第二の閾値は、着目画素15が白画素か黒画であるかを判別する閾値である。以上の処理を実行することにより、制御部2は入力画像の各画素に対する第二の閾値を算出する。
制御部2の第二の閾値を求める処理には、二種類の手法がある。第一の方法は、着目画素15が変わるたびに周辺領域16の各周辺画素について第一の閾値を算出するものである。第一の方法は、着目画素15が変わるたびに周辺領域16の画素について第一の閾値を算出するため、多くの処理ステップを要する。しかし、周辺領域16内で最大値となる第一の閾値のみを格納しておけばよいため、記憶領域の使用量が少ない。
第二の方法は、入力画像内の第二の閾値を算出する領域に含まれる各画素に対応する第一の閾値を予め算出するものである。制御部2は算出した第一の閾値を画素に対応付けてメモリ5に記憶する。制御部2は、着目画素15について第二の閾値を算出するときに、記憶した着目画素15に対応する16に含まれる周辺画素の第一の閾値を読み出して使用する。第二の方法は、各画素に対応する第一の閾値を格納するための記憶領域を必要とする。しかし、制御部2は第一の閾値を各画素について一回演算すれば良いため、処理量が少ない。なお、入力画像全体に対応する各画素の第一の閾値を算出するのではなく、入力画像を部分領域に分割し、部分領域毎で第一の閾値を求める構成にすることも可能である。
上記の二種類の手法は処理の目的、対象によって使い分けることが可能である。
例えば、制御部2が画素数の多い入力画像全体について第二の閾値を取得する場合、記憶領域を多く消費しても第一の方法によって計算の高速化を図るのが得策と考えられる。一方、第二の閾値を算出する処理を画像内の特定の部分についてのみ行うのであれば、画像全体で第一の閾値を計算するのは無駄なので、第二の方法の利用が適当である。以下、第一の方法によって第二の閾値を算出する処理について説明する。第二の方法については図25にて説明する。
図4は、第一の方法での閾値取得手段203、閾値補正手段204の機能を詳細にした機能ブロック図である。閾値取得手段203は、着目画素に対応する第一の閾値を算出する閾値演算部214である。着目画素に対する周辺領域内の第一の閾値の最大値を算出する最大値演算部216、および着目画素の第一の閾値と周辺領域内の第一の閾値の最大値との重み付き平均から第二の閾値を算出する補正閾値演算部217である。
図5は、第一の方法によって第二の閾値を算出する処理のフローチャートである。制御部2は、第二の閾値を算出する着目画素15を特定する(S01)。制御部2は横座標13および縦座標14によって、着目画素15を特定する。次に、制御部2は、着目画素に対して周辺領域16を設定する(S02)。制御部2は、周辺領域16に含まれる各周辺画素の第一の閾値を算出する(S03)。
ここで周辺領域16内の着目画素15および周辺画素の第一の閾値の算出について説明する。
図6は第一の閾値を算出する処理のフローチャートである。第一の閾値は、局所的二値化の手法を使用して求める。制御部2は、例えば、第一の閾値を周辺画素の明度から算出する。第一の閾値は、例えば、ニブラック(Niblack)の二値化の計算方法を使用する。数(1)はNiblackの二値化の計算式である。
数(1)の「Th1」は第一の閾値である。「m」は周辺領域内の各画素の明度の平均値である。「s」は画素の明度値の頻度分布の標準偏差である。「k」はあらかじめ定めた定数である。「k」は、例えば、−0.1〜−0.3といった値が用いられる。「k」が負の値に設定されることで第一の閾値は矩形領域内の画素の明度の平均値よりも若干低い値に設定される。この結果、制御部2は閾値に近い値の画素がノイズとして残ってしまう現象を回避できる。一方、ノイズがさほど問題にならない場合や前景となる黒画素の脱落が問題になる場合、「k」を「0」に設定することも可能である。「k」が「0」の場合、周辺画素の明度の平均値をそのまま閾値として用いることになり、計算ステップが減少するメリットがある。また、第一の閾値は、周辺画素の明度の平均値ではなく、周辺画素の最大値と最小値の中間点を閾値とするなどの類似手法によって算出することも可能である。
本実施例の入力画像は、解像度が200dpiであり256階調のグレイ画像であるとする。グレイ画像の各画素は、0から255までのいずれかの値の明度をとる。
着目画素15は入力画像の画素の座標位置で特定されている。着目画素15には周辺領域16が設定されている。周辺領域16の幅および高さの画素数は「A」であるとする。着目画素15を周辺領域16の中央とすると、周辺領域16の端までの画素数「a」は数(2)で求まる。
例えば、周辺領域16は、着目画素15を中心とした縦方向に5画素、横方向に5画素の矩形領域であるとする。aは「2」である。なお、周辺領域16の大きさ、形状は、入力画像の特徴、制御部2の処理能力などによって適宜変更が可能である。
着目画素15の横座標値13および縦座標値14は(x、y)であるとする。
また、周辺領域16内の周辺画素の座標は(xi、yj)であるとする。「xi」は「x−a」から「x+a」までの範囲となる。「yj」は「y−a」から「y+a」までの範囲となる。制御部2は、「xi」を「x−a」から「x+a」まで「yj」を「y−a」から「y+a」まで変化させて各周辺画素を設定する(S11)。次に、制御部2は、例えば、周辺画素の明度値を取得する(S12)。制御部2は、周辺領域16の全ての周辺画素の明度値を取得するまでS11からの処理を繰り返す(S13)。
次に、制御部2は、周辺領域16内の周辺画素の明度値の平均値「m」を求める(S14)。制御部2は、周辺画素の明度値の頻度分布の標準偏差「s」を求める(S15)。制御部2は、平均値「m」と定数「k」倍した標準偏差「s」との和を求めることで、閾値「Th1」を求める(S16)。
なお、着目画素15が入力画像の端部の場合、着目画素15の周辺領域16に5×5の周辺画素が揃わない場合がある。この場合、制御部2は、周辺領域16に含まれる周辺画素のみで第一の閾値を算出することも可能である。
以上により着目画素15についての第一の閾値を取得することができる。周辺画素に対して第一の画素を算出する場合、図6のフローチャートの着目画素15に周辺画素を当てはめて実行する。周辺画素に対応する第一の閾値は、周辺画素を中心にした第二の周辺領域16−2を基準に求める。本実施例では、第二の周辺領域16−2の幅および高さは周辺領域16の大きさと同じであり、制御部2は、図6の処理によって周辺画素についての第一の閾値を算出できる。
ここで、第一の閾値の特性について説明する。図7、図8、図9、図10、図11、図12、図13、図14は、入力画像と第一の閾値との関係を示す図である。まず、図7、図9、図11、および図13について説明する。30は入力画像である。31は、多値画像の内、明度が中間程度の画素である。例えば、帳票の罫線である。32は、多値画像の内、明度が高い画素である。例えば、帳票の背景である。33は、多値画像の内。明度が低い画素である。例えば、帳票の文字である。15−1、15−2、15−3および15−4は着目画素15である。16−3、16−4、16−5、および16−6は、それぞれ着目画素15−1、15−2、15−3および15−4に対する周辺領域である。
図8、図10、図12、および図14は、それぞれ、図7、図9、図11、および図13の周辺領域16−3、16−4、16−5、16−6に含まれる各画素の明度の頻度分布図である。42は、罫線に対応する画素31の明度である。43は、背景に対応する画素32の明度である。44は、文字に対応する画素33の明度である。
図7では、周辺領域16−3には、帳票の罫線に対応する画素31と背景に対応する画素32のみがある。図8は、図7の周辺領域16−3の各画素の明度の頻度分布図である。周辺領域16−3から算出される着目画素15−1に対する第一の閾値は41−1となる。第一の閾値41−1は、罫線に対応する画素31の明度42よりも大きくなる。したがって、着目画素15−1は黒画素であると判別される。
図9では、周辺領域16−4には、帳票の罫線に対応する画素31、背景に対応する画素32、および文字に対応する画素33がある。図10は、図9の周辺領域16−4の各画素の明度の頻度分布図である。周辺領域16−4から算出される着目画素15−2に対する第一の閾値は41−2となる。第一の閾値41−2は、罫線に対応する画素31の明度42よりも高い明度となる。したがって、着目画素15−2は黒画素であると判別される。
図11では、着目画素15−3は罫線上にあるが、文字の画素33に近い。したがって、周辺領域16−5には、帳票の罫線に対応する画素31、背景に対応する画素32、および文字に対応する画素33がある。図12は、図11の周辺領域16−5の各画素の明度の頻度分布図である。周辺領域16−5から算出される着目画素15−3に対する第一の閾値は41−3となる。第一の閾値41−3は、罫線に対応する画素31の明度42よりも低い明度となる。したがって、着目画素15−3は白画素であると判別される。
図13では、着目画素15−4は罫線上にあるが、文字の画素33に近い。したがって、周辺領域16−6には、帳票の罫線に対応する画素31、背景に対応する画素32、および文字に対応する画素33がある。図14は、図13の周辺領域16−6の各画素の明度の頻度分布図である。周辺領域16−6から算出される着目画素15−4に対する第一の閾値は41−4となる。第一の閾値41−4は、罫線に対応する画素31の明度42よりも低い明度となる。したがって、着目画素15−4は白画素であると判別される。
次に、着目画素が図11の画素15−3に位置する場合の、周辺領域16−5内の各周辺画素に対応する第一の閾値について説明する。図15、図16、図17、図18、図19、および図20は、入力画像と第一の閾値との関係を示す図である。まず、図15、図17、および図19について説明する。30は入力画像である。31は、多値画像の内、明度が中間程度の画素である。例えば、帳票の罫線である。32は、多値画像の内、明度が高い画素である。例えば、帳票の背景である。33は、多値画像の内。明度が低い画素である。例えば、帳票の文字である。15−3は着目画素である。16−5は着目画素15−3に対する周辺領域である。18−1、18−2、および18−3は周辺領域16−5内の周辺画素である。16−8、16−9、および16−10は、それぞれ、周辺画素18−1、18−2、および18−3に対する周辺領域である。
図16、図18、および図20は、それぞれ、図15、図17、および図19の周辺領域16−8、16−9、および16−10内の各画素の明度の頻度分布図である。45は、罫線に対応する画素31の明度である。46は、背景に対応する画素32の明度である。47は、文字に対応する画素33の明度である。48−1、48−2、および48−3は、周辺画素18−1、18−2、および18−3に対する第一の閾値である。
図15では、周辺画素18−1についての第一の閾値は、周辺領域16−8に含まれる各画素から算出する。周辺領域16−8には、帳票の罫線に対応する画素31、背景に対応する画素32、および文字に対応する画素33がある。図16は、図15の周辺領域16−8の各画素の明度の頻度分布図である。周辺領域16−8から算出される第一の閾値は48−1となる。第一の閾値48−1は、罫線に対応する画素31の明度42よりも高い明度の値になる。
図17では、周辺画素18−2についての第一の閾値は、周辺領域16−9に含まれる各画素から算出する。周辺領域16−9には、帳票の罫線に対応する画素31および背景に対応する画素32がある。図18は、図17の周辺領域16−9の各画素の明度の頻度分布図である。周辺領域16−9から算出される第一の閾値は48−2となる。第一の閾値48−2は、罫線に対応する画素31の明度42よりも高い明度の値になる。
図19では、周辺画素18−3についての第一の閾値は、周辺領域16−10に含まれる各画素から算出する。周辺領域16−10には、帳票の罫線に対応する画素31、背景に対応する画素32、および文字に対応する画素33がある。図20は、図19の周辺領域16−10の各画素の明度の頻度分布図である。周辺領域16−10から算出される第一の閾値は48−3となる。第一の閾値48−3は、罫線に対応する画素31の明度42よりも低い明度の値になる。
図5の説明に戻る。
制御部2は、周辺領域16内の全ての画素についての第一の閾値を取得するまで、S03の処理を繰り返す(S04)。次に、制御部2は、S03で取得した周辺領域16内の全ての第一の閾値の中から最大値となる第一の閾値を求める(S05)。制御部2は、周辺領域16の第一の閾値の最大値を数(3)によって算出する。
「Th1(i)」は周辺領域16内の各画素に対する第一の閾値である。「M」は周辺領域16内の画素数である。「Th1m」は、周辺領域16内で最大となる第一の閾値である。制御部2は、S05で求めた第一の閾値の最大値を用いて第二の閾値を算出する(S06)。制御部2は、例えば、着目画素15の第二の閾値を数(4)によって算出する。
「Th1r」は着目画素15の第一の閾値である。「b」は0〜1の定数である。定数「b」は、着目画素の第二の閾値を決定するときに、着目画素についての第一の閾値および周辺領域16内から取得した第一の閾値の重みの大きさを決定する。例えば、「b=0」の場合、周辺領域16内の各画素についての第一の画素の最大値が第二の閾値になる。また、「b=1」の場合、着目画素15に対する第一の閾値が第二の閾値となる。なお、第二の閾値の求め方は種々考えられる。例えば、第二の閾値は、複数の第一の閾値の最大値を使用する。第二の閾値は、最大値でなく2番目に大きい第一の閾値を使用することにしてもよい。また、制御部2は、着目画素15の第一の閾値と周辺領域内の第一の閾値の最大値との重み付き平均値を第二の閾値として算出しても良い。例えば重みは第一の閾値の最大値と着目画素15の第一の閾値との割合を4対1などと設定する。また、重みは、着目画素15との距離に応じて変更することも可能である。
制御部2は、第二の閾値によって着目画素15が黒画素か白画素かを判別する(S07)。黒画素か白画素かは、着目画素15の明度と第二の閾値との比較によって判別する。
制御部2は、以上の処理を入力画像内の二値化の対象の範囲内の全ての画素について実行する(S08)。制御部2は、入力画像の全画素について第二の閾値を算出する場合、個々の画素を着目画素に設定する。そして、各着目画素に対応する第二の閾値を算出する。
以上により、制御部2は、第二の閾値を取得する。制御部2は、取得した第二の閾値によって入力画像を二値化する。この結果、制御部2は、二値画像を取得することができる。
ここで、第一の閾値を用いた場合の二値画像と第二の閾値を用いた場合の二値画像との違いについて説明する。図21は入力画像である。図22は第一の閾値によって二値化した二値画像である。図23は第二の閾値によって二値化した二値画像である。
図21の50は入力画像であり、51は罫線の画素であり、52は背景の画素であり、53は文字の画素である。15は着目画素である。16は着目画素15の周辺領域である。18は周辺画素である。16−2は周辺画素18の周辺領域である。着目画素15に対する第一の閾値は、周辺領域16内の画素の明度の平均値である。この場合、周辺領域16は明度が低い文字の画素53を含むため、周辺領域内にある画素の明度の平均値は低くなる。第一の閾値が着目画素15の明度よりも低くなると、第一の閾値を用いた二値化処理時に、着目画素15は白画素(背景画素)に判別される。
図22は、図21の入力画像50の各着目画素を、二値化対象となる着目画素に対する第一の閾値で二値化した二値画像である。54は、図21の入力画像50の各着目画素を、二値化対象となる着目画素に対する第一の閾値で二値化した二値画像である。56は、背景の画素(白画素)である。57は、前景の画素(黒画素)である。58は、第一の閾値で二値化したため、罫線の画素が白画素に判別された領域である。58付近が罫線の途切れが発生した領域である。
図23は、図21の入力画像50の各画素を各画素に対する第二の閾値で二値化した二値画像である。59は、図21の入力画像50の各画素を各画素に対する第二の閾値で二値化した二値画像である。60は白画素である。61は黒画素である。図21の周辺画素18の周辺領域16−2は、罫線の画素31および背景の画素32のみで構成される。したがって、周辺画素18に対する第一の閾値は罫線の画素31の明度よりも高い明度となる。着目画素15の第二の閾値は、例えば、周辺領域16内の周辺画素の第一の閾値の内、最大値となる第一の閾値を採用する。この結果、着目画素15の明度は第二の閾値よりも低くなる。着目画素15は黒画素と判別される。以上から、図23は罫線の欠けのない二値画像になる。
以上の方法により制御部2は、罫線の欠けのない二値画像を取得することができる。
次に、第二の方法で第二の閾値を算出する手順について説明する。第二の方法は、着目画素15が変わるたびに周辺領域16の画素について第一の閾値を算出するものである。
図24は、第二の方法で第二の閾値を算出する手順での閾値取得手段203、閾値補正手段204の機能を詳細にした機能ブロック図である。閾値取得手段203は、着目画素に対応する第一の閾値を算出する閾値演算部214である。閾値補正手段204は、閾値演算部214の出力結果となる第一の閾値を画素の位置に応じて格納する二次元の整数配列である閾値バッファ215、着目画素に対する周辺領域内の第一の閾値の最大値を算出する最大値演算部216、および着目画素の第一の閾値と周辺領域内の第一の閾値の最大値との重み付き平均から第二の閾値を算出する補正閾値演算部217である。なお、閾値バッファ215は、メモリ5に格納される。
図25は、第二の方法によって第二の閾値を算出する処理のフローチャートである。第二の方法は、入力画像内の第二の閾値を算出する領域に含まれる各画素に対応する第一の閾値を予め算出するものである。なお、入力画像内の第二の閾値を算出する領域は、予め特定されているものとする。
制御部2は、二値化の対象の領域内の画素毎に対応する第一の閾値を算出する(S21)。制御部2は、二値化の対象の領域内の全ての画素について第一の閾値を算出する(S22)。制御部2は、二値化の対象の領域内の全ての画素について第一の閾値を算出すると(S22:yes)、制御部2は着目画素15を設定する(S23)。制御部2は、着目画素15に対する周辺領域16を設定する(S24)。制御部2は、着目画素15に対応する第二の閾値を算出する(S26)。例えば、制御部2は、周辺領域に含まれる周辺画素の第一の閾値を読み出す。制御部2は、読み出した第一の閾値の内で最大となる値を検出する。制御部2は、検出した最大となる第一の閾値を第二の閾値として取得する。制御部2は、第二の閾値によって着目画素15を二値化する。制御部2はS25からS27までの処理を入力画像の処理の対象の全ての範囲が終了するまで繰り返す(S28)。全ての範囲が終了すると(S28:yes)、制御部2は二値化処理を終了する。
次に、制御部2の第二の閾値を算出する処理を画像領域の特定の場所でのみ実行する構成について説明する。入力画像の全ての領域で第二の閾値を算出すると、罫線とは関係がない場所の画素が第二の閾値で二値化されることになる。第二の閾値は、着目画素15の周辺領域16の第一の閾値の最大値を利用した値である。したがって、着目画素に対する第二の閾値の値は着目画素に対する第一の閾値に比較して増加する傾向がある。罫線の領域以外を第二の閾値で判別すると、制御部2は背景と判別されるべき画素を前景であると誤って判定する場合がある。この結果、二値画像に前景の画素である黒画素が不要に増える。
そこで、着目画素15の近くに罫線が存在するか否かを判定する手段を設け、制御部2は罫線が存在する場所でのみ第二の閾値を算出するようにする。以下に制御部2が実行する処理について説明する。
図26は、着目画素15の近くに罫線が存在するか否かを判定した結果を考慮する場合の制御部2の機能ブロック図である。制御部2は、入力画像を取得する画像入力手段201、入力画像を二値化する画像二値化手段202、罫線の候補を抽出する罫線候補抽出手段206として機能する。また、画像二値化手段202は、入力画像内の着目画素を設定して着目画素の周辺領域に存在する周辺画素の値から第一の閾値を求める閾値取得手段203、周辺領域内の着目画素および各周辺画素の第一の閾値から着目画素を二値化するための第二の閾値を求める閾値補正手段204、着目画素を二値に判別する二値判定手段205、および着目画素の周辺領域の各画素におけるエッジ成分の方向と強度を求め、抽出したい罫線方向と一致した方向のエッジ成分が周辺領域内に存在するか否かを判定する罫線エッジ判定手段207から構成される。
図27は、罫線エッジ判定手段207の機能を詳細にした機能ブロック図である。罫線エッジ判定手段207は、ソベル(sobel)フィルタによる畳み込み演算によって着目画素のエッジのソベル勾配を演算するSobel勾配演算部218、エッジの勾配の強度を演算する勾配強度演算部220、エッジの勾配の方向を演算する勾配方向演算部219、およびエッジが所定の方向、強度の条件を満たすときに罫線のエッジであると判定する罫線エッジ判定部221とから構成される。
図28は、罫線のエッジの有無を判別するフローチャートである。制御部2は、以下の処理を実行することで、着目画素15の周辺領域16にエッジがあるか否かを判別する。
まず、制御部2は周辺領域16のエッジ成分を抽出する(S31)。エッジ成分の抽出は、例えば、ソベル勾配(以下Sobel勾配とする)により抽出する。制御部2は周辺領域16内の着目画素15、周辺画素についてSobel勾配を求める。
制御部2は、例えば以下の処理によってSobel勾配を算出する。図29は縦の勾配を検出するSobelフィルタ62である。図30は横の勾配を検出するSobelフィルタ63である。制御部2は、縦方向のSobelフィルタ63、および横方向のSobelフィルタ64の中心を着目画素15に合わせる。制御部2は各Sobelフィルタの係数を用いて着目画素15の周囲の画素に対して畳み込み演算を行う。
制御部2は、横方向のSobelフィルタ64を用いた演算により横方向の明度の変化の強さ(横勾配値sblx)、縦方向のSobelフィルタ63を用いた演算により縦方向の明度の変化の強さ(縦勾配値sbly)を取得する(S32)。制御部2は勾配強度(sblm)を数(5)によって算出する。
制御部2は、エッジの勾配強度(sblm)が所定の値以上となるか否かを判定する(S33)。エッジがない、あるいは勾配強度(sblm)が所定の値未満である場合(S33:no)、制御部2は、周辺領域16内に罫線は存在しないと推定する(S37)。制御部2は、罫線が存在しない領域では、例えば、従来の二値化手法によって着目画素15を二値化する。所定値となる強度は、例えば、勾配強度(sblm)が100以上などである。
周辺領域16内に所定値以上の勾配強度がある場合(S33:yes)、制御部2はエッジ成分の方向を求める(S34)。制御部2は勾配方向を数(6)により算出する。
制御部2は、周辺領域16内のエッジ成分の方向が、罫線候補の条件を満たす方向か否かを判別する(S35)。具体的には、制御部2はエッジの勾配方向が所定の範囲内か否かを判定する。
エッジの勾配の範囲は、例えば、0°以上から180°未満であるとする。エッジの勾配は、入力画像の横方向に対する角度によって特定する。エッジの勾配が0°のとき入力画像の横方向と平行である。エッジの勾配が90°のとき入力画像の縦方向と平行である。エッジの勾配方向の所定の範囲は、横方向の罫線の場合、例えば、0°以上10°以下または170°以上180度未満とする。エッジの勾配方向の所定の範囲は、縦方向の罫線の場合、例えば、80°以上100°以下とする。周辺領域16に罫線の方向に合致するエッジ成分を含む場合(S35:yes)、制御部2は第二の閾値の算出処理を実行する。
以上により、制御部2は、罫線があると推測される領域についてのみ第二の閾値を算出することが可能となる。この結果、制御部2は、不要な黒画素の増加を防ぐことが可能となり、ノイズの少ない二値画像を取得することが可能となる。以上で、制御部2が、二値画像を取得する処理を実行するときに第二の閾値によって画素を判別する処理を説明した。
次に、制御部2が、二値画像から罫線を検出する手順について簡単に説明する。図31は、罫線の候補を抽出するため場合の制御部2の機能ブロック図である。制御部2は、取得した二値画像から直線的に連続した画素を抽出し、連続する画素数が所定値以下のものを削除する短ラン削除手段211、黒画素が連続する画素が所定値以下の領域を削除した画像中で隣接した黒画素を順にグループにまとめ、黒画素の連結領域を作成する黒画素グループ化手段212、および所定の上限値を以下の幅となる罫線の候補を罫線候補とする罫線幅検証手段213から構成される。
図32は横方向の罫線を検出する処理のフローチャートである。まず、制御部2は、二値画像の横方向に黒画素が連続する領域を抽出する(S41)。例えば、制御部2は二値画像の行ごとに黒画素が連続する領域を抽出する。図33は、二値画像の横方向の黒画素の領域が検出される第一の状態である。70−1は二値画像の一部の領域である。71は白画素である。72は黒画素である。73−1、73−2、73−3、73−4、73−5、および73−6は横方向に黒画素が連続する領域である。74は二値画像70−1の横方向である。制御部2の求める罫線が横方向である場合、横方向74は罫線の長さ方向になる。75は二値画像70−1の縦方向である。罫線が横方向である場合、縦方向75は罫線の幅方向になる。
制御部2は、黒画素が連続する領域の長さが所定値よりも長いか否かを判別する(S42)。所定値は予め設定する。所定値は例えば「4」と設定する。所定値を設定する基準は、罫線と判定できるか否かによる。罫線の判定は、ランレングス(以下ランとする)の大きさで判定する。ランは黒画素が連続する長さである。長さの単位は例えば画素数である。横方向にある程度の長いランであれば、横方向の罫線の可能性がある。一方、横方向に短いランは、横方向の罫線ではない。黒画素が連続する領域が所定値未満のランとなる場合(S42:no)、制御部2は、所定値未満の黒画素が連続する領域を白画素に変更する(S43)。制御部2は、所定値未満の黒画素が連続する領域の各画素を黒画素から白画素に変える。この結果、二値化画像には横方向に一定長以上のランを有する黒画素が残る。
制御部2は、二値画像の全ての領域について処理を繰り返す(S44)。
図34は、二値画像の横方向の黒画素の領域が検出される第二の状態である。70−1は二値画像の一部の領域である。71は白画素である。72は黒画素である。73−1、73−4、73−5、および73−6は横方向に黒画素が連続する領域である。74は二値画像70−1の横方向である。制御部2の求める罫線が横方向である場合、横方向74は罫線の長さ方向になる。75は二値画像70−1の縦方向である。罫線が横方向である場合、縦方向75は罫線の幅方向になる。図33の領域73−2はランが「3」であるため、制御部2は領域73−2を白画素73−7に変更する。図33の領域73−3はランが「2」であるため、制御部2は領域73−3を白画素73−8に変更する。
制御部2は、二値画像の全ての領域について処理が終了すると(S44:yes)、制御部2は、画素をグループにまとめる(S45)。グループは二値画像内の罫線の候補が存在すると判別される領域である。グループは、横方向に連続する黒画素の領域の集合である。例えば、横方向に連続する第一の領域に含まれる黒画素および横方向に連続する第二の領域に含まれる黒画素があるとする。第一の領域に含まれる黒画素および第二の領域に含まれる黒画素の内、縦方向で隣接する黒画素がある場合、第一の領域と第二の領域とがグループとしてまとめられる対象となる。罫線の候補は、グループとしてまとめられる対象内の黒画素の外接枠とする。
図35は、二値画像の横方向の黒画素の領域が検出される第三の状態である。70−1は二値画像の一部の領域である。71は白画素である。72は黒画素である。74は二値画像70−1の横方向である。75は二値画像70−1の縦方向である。図34の黒画素が連続する領域73−1、73−4、73−5、および73−6はそれぞれ隣接するため、グループにまとめられる。76は、グループ化された領域は黒画素の外接枠である。図32の説明に戻る。
なお、横方向の罫線の候補を検出するときにS45の処理によって、黒画素の集合が、縦方向に多くの行でグループ化される場合がある。この場合、黒画素の集合結果は縦方向に太い横方向の罫線となる。罫線には一般的な太さがある。罫線ではないにも関わらず、罫線の候補の端を延長する処理を行うと二値画像から文字情報を検出する処理等において、エラーの原因となる。また、後述する罫線の延長処理においての処理量の増加および不要な黒画素の発生の原因となる。そこで、明らかに罫線ではないと考えられる太さの罫線の候補については、罫線ではないと判別する。
罫線の幅の上限値は予め設定する。上限値は、例えば、入力画像が200dpiのときに6pixel程度にする。制御部2は、グループ化した領域の幅が上限値以下か否かを判定する(S46)。グループ化した領域が上限値以下の幅となる場合(S46:yes)、制御部2はグループ化した領域を罫線候補と判別する(S47)。一方、グループ化した領域の幅が上限値以上となる場合は、罫線の候補ではない。したがって、制御部2は、上限値以上の幅となる領域については罫線の候補とは判別しない。以上の処理により、制御部2は二値画像から罫線を検出する。
次に、第二の実施例として、制御部2が、入力画像を第一の閾値によって二値化した二値画像を取得し、その二値画像内の罫線の途切れの発生した領域を検出し、罫線の途切れを修復する方法について説明する。制御部2が既存の方法を用いて第一の閾値を求め、制御部2が第一の閾値によって入力画像を二値化するとする。この場合、第一の閾値によって入力画像を二値化した二値画像(以下、第一の二値画像とする)から制御部2が抽出する罫線の候補は、途切れが発生する場合がある。
罫線の途切れが発生する原因は、制御部2が抽出した罫線の候補を延長した領域に含まれる画素が、罫線の候補を延長した領域に含まれるそれぞれの画素に対応する第一の閾値の変動によって白画素に誤って認識されたものと推測できる。そこで、制御部2は、罫線の途切れが発生した付近の領域の画素について第二の閾値を算出する。具体的には、制御部2は以下の処理を実行して罫線の端点となる付近の領域について第二の閾値を算出する。
図36は、罫線の途切れが発生した付近の領域の画素について第二の閾値を算出する場合の制御部2の機能ブロック図である。制御部2は、入力画像を取得する画像入力手段201、入力画像を二値化する画像二値化手段202、罫線の候補を抽出する罫線候補抽出手段206、および罫線の候補の端点が延長される場合に罫線の領域座標を修正する罫線座標補正手段209として機能する。また、画像二値化手段202は、入力画像内の着目画素を設定して着目画素の周辺領域に存在する周辺画素の値から第一の閾値を求める閾値取得手段203、周辺領域内の着目画素および各周辺画素の第一の閾値から着目画素を二値化するための第二の閾値を求める閾値補正手段204、着目画素を二値に判別する二値判定手段205、入力画像の罫線のエッジの有無を判定し第二の閾値を求めるべきか否かを判定する罫線エッジ判定手段207、および罫線の候補の端点の近傍の再二値化の判定を行うべき領域を求める再二値化領域取得手段208から構成される。
図37は罫線の端点を検出して、端点付近の領域について再度二値化処理を実行する処理のフローチャートである。制御部2は、入力画像を取得する。制御部2は、図6で説明した処理を実行することにより、入力画像の各画素の第一の閾値を算出する(S51)。制御部2は、二値化の対象の領域内の全ての画素について第一の閾値を算出する(S52)。制御部2は、第一の閾値による二値化処理が終了すると(S53:yes)、制御部2は第一の閾値で求めた第一の二値画像から罫線の候補を抽出する(S54)。罫線の候補の抽出は図34のフローチャートによって行う。
次に、制御部2は、罫線の候補から第二の閾値を算出する領域を特定する(S55)。罫線の途切れが発生していると推測される領域は、罫線の候補の端となる画素および罫線の候補の端の画素の近傍の領域である。
図38は、第二の実施例での罫線の端となる画素および画素の近傍の領域の説明図である。99は罫線の候補である。罫線の候補99は横方向の罫線である。98は罫線の候補99の長さ方向である。97は罫線の候補99の幅方向である。罫線の候補99は、黒画素が集合した領域である。(xs,ys)および(xe,ye)は、罫線の候補99を構成する黒画素の外接矩形の頂点座標である。制御部2は、罫線の候補99の幅方向97の大きさ(ys−ye)で罫線の候補99の長さ方向98に延長した領域を、罫線の候補99の途切れが発生している領域とする。
なお、罫線の候補99の長さ方向98を二値画像の端まで延長した領域を罫線の途切れが発生している領域とすると、ノイズの増加が発生することもあり得る。そこで、本実施例では、図38のように長さ方向に長さ「m」だけ罫線領域を延長した領域96−1、96−2を、罫線の途切れが発生している領域とする。例えば、文書でよく使われる10pointの文字サイズの半分を罫線途切れが生ずる最大長であると設定する。この場合、入力画像の解像度が200dpiの場合、約14pixelとなる。そこで、罫線途切れが生ずる最大長として、m=14と設定する。
制御部2は、縦方向の罫線の場合も同様に、罫線の横方向の幅の領域内で縦方向に延長した領域を罫線の途切れが発生していると推測される領域とする。つまり、制御部2は、罫線の候補の幅内で、かつ、罫線の長さ方向に延長した領域を、罫線の途切れが発生している領域であると推測する。図37の説明に戻る。
次に、制御部2は、第一の二値画像の内、罫線の途切れが発生していると推測される領域内の画素について、入力画像から第二の閾値を算出する(S56)。具体的には、S56の第二の閾値は、第一の二値画像の画素の位置に対応する入力画像の画素を着目画素として第二の閾値を算出する。
例えば、制御部2は、図6または図25のフローチャートを実行する。なお、制御部2が第二の閾値を算出する画素は、罫線候補99の右側の領域96−2の場合、横の座標は「xe」から「xe+m」まで、縦の座標は「ys」から「ye」までになる。制御部2が第二の閾値を算出する画素は、罫線の候補99の左側の領域96−1の場合、横の座標は「xs−m」から「xs」まで、縦の座標は「ys」から「ye」までになる。
制御部2は算出した第二の閾値により入力画像の着目画素15が黒画素か白画素かを判別する(S57)。着目画素15が白画素から黒画素に変更になった場合(S58:yes)、制御部2は罫線の候補の延長処理を実行する(S59)。制御部2は、例えば、以下の処理を実行して罫線の途切れが発生した領域の周辺の画素を修正する。
図39、40、41を用いて、罫線の外接枠の拡張を説明する。制御部2は罫線の延長を行うスキャン処理を行う。スキャン処理は罫線の端から罫線の延長方向に連続する黒画素の有無を判断する。罫線の候補の端から連続する黒画素をグループ化することにより罫線を延長する。
図39は、延長前の罫線の候補の状態である。90は第一の二値画像の一部の領域である。91は白画素である。92は黒画素である。92−2はS56にて算出された第二の閾値によって黒画素に判別された画素である。99は罫線の候補である。99−1は罫線候補99の端である。93は、スキャン処理を行うスキャン方向である。スキャン方向93は罫線から離れる方向とする。94は、画素の範囲を特定するスキャン幅である。スキャン幅94は罫線の候補99の幅である。95−1、95−2、95−3、95−4、および95−5はスキャンラインである。本実施例では、スキャンラインは罫線99の延長方向に対して垂直方向とする。
図40は、スキャン処理のフローチャートである。制御部2は、罫線候補の端99−1に最も近いスキャンライン95−1からスキャン方向93に向かってスキャン処理を行う。まず、制御部2は、罫線99の端の隣の画素をスキャン処理の対象とするスキャンラインを設定する(S61)。制御部2は、スキャンライン95上で、スキャン幅94内に黒画素があるかどうかを判定する(S62)。制御部2は、S62で判定したスキャンライン95上に黒画素がある場合(S61:yes)、一画素分だけスキャン方向93にスキャンライン95を移動する(S63)。
制御部2は、スキャン幅94内に黒画素が無いスキャンラインを検出するまで、スキャン方向93に向かってスキャン処理を継続する。
一方、制御部2は、S62で判定したスキャンライン95上に黒画素がない場合(S61:no)、罫線の候補の端99−1をS62で判定したスキャンライン95の一つ前のスキャンラインまで延長する(S64)。図39のスキャンライン95−5のスキャン幅94内には黒画素がない。制御部2は、スキャン方向93で一つ前のスキャンラインとなるスキャンライン95−4まで罫線の候補99を延長する。
図41は、延長後の罫線の候補の状態である。図39と同じ番号が付されているものは、図39と同様であるため説明を省略する。99−2は、延長された罫線の候補である。99−3は、罫線の候補99から延長された領域である。罫線の候補99−2は、スキャン処理前の罫線の候補99に対して、スキャンライン95−4まで延長される。スキャンライン95−4は、スキャンライン上に黒画素が無いスキャンライン95−5からスキャン方向93で一つ前のスキャンラインである。以上によって、制御部2は、罫線の候補99を延長することが可能となる。図37の説明に戻る。
制御部2は第一の二値画像の処理対象の領域内の全ての画素について処理が終了したか否かを判定する(S60)。制御部2は、第一の二値画像の処理対象の領域内について処理が終了していない場合(S60:no)、S56からの処理を行う。第一の二値画像の処理対象の領域内の全ての画素について処理が終了すると(S60:yes)、制御部2は処理を終了する。以上の処理により、制御部2は第一の二値画像で罫線の途切れがあると推測される領域内の各画素の位置に対応する入力画像の画素について第二の閾値を算出し、罫線の途切れがあると推測される領域内の各画素について算出した第二の閾値で二値化した第二の二値画像を取得する。
次に、罫線の途切れを修正する第二の手法について説明する。第二の手法は、スキャン処理時に使用する第二の閾値の取得方法の変更例である。制御部2は、第二の閾値を罫線の候補に判別された画素について使用した第一の閾値から取得する。
図42は、罫線の途切れを修正する第二の手法の場合の制御部2の機能ブロック図である。制御部2は、入力画像を取得する画像入力手段201、入力画像を二値化する画像二値化手段202、罫線の候補を抽出する罫線候補抽出手段206、および罫線の候補の端点が延長される場合に罫線の領域座標を修正する罫線座標補正手段209として機能する。また、画像二値化手段202は、入力画像内の着目画素を設定して着目画素の周辺領域に存在する周辺画素の値から第一の閾値を求める閾値取得手段203、罫線候補上の画素の第一の閾値から罫線の候補の延長される領域の画素に対する第二の閾値を求める罫線閾値取得手段210、着目画素を二値に判別する二値判定手段205、入力画像の罫線のエッジの有無を判定し第二の閾値を求めるべきか否かを判定する罫線エッジ判定手段207、および罫線の候補の端点の近傍の再二値化の判定を行うべき領域を求める再二値化領域取得手段208から構成される。
図43は、罫線閾値取得手段210の機能を詳細にした機能ブロック図である。罫線閾値取得手段210は、罫線候補の外接枠座標を取得する罫線領域座標取得部225、罫線の外接枠座標の領域内の各画素に対応する第一の閾値を取得する第一の閾値取得部222
取得した第一の閾値を格納する第一の閾値バッファ223、および格納された第一の閾値の集合の中央地を算出する中央値演算部224から構成される。
図44および図45を用いて、第二の閾値の取得方法を説明する。
図44は、入力画像の一部の領域である。80は入力画像の一部の領域である。81は罫線に相当する画素である。82は背景に相当する画素である。83は前景に相当する画素である。罫線画素81は、背景画素82よりも明度が低く、前景画素83よりも明度が高い。101乃至110は、罫線画素31の個々の画素である。111は、第一閾値で二値化すると罫線画素31が前景に判別される領域である。112は、第一閾値で二値化すると罫線画素31が背景に判別される領域である。
図45は、入力画像の領域内の罫線を構成する画素の第一の閾値の分布図である。図45の分布図の横軸は、図44の罫線画素31の個々の画素101乃至110である。図45の分布図の縦軸は、図44の各罫線画素31の第一の閾値である。画素106の第一の閾値は、画素105の第一の閾値に比べて、減少している。
罫線であるにも関わらず背景であると判別された画素の第一の閾値は、罫線として判別された画素に対応する第一の閾値に比べて低い。したがって、第一の閾値の急激な低下が罫線の途切れが発生する原因である。一方、罫線として判別された画素に対応する第一の閾値は、少なくとも罫線の画素を抽出するために適切な範囲の値になる。したがって、罫線の候補上の画素の第一の閾値の分布によって、第二の閾値を算出する領域を特定することができる。例えば、罫線の候補上の画素に対応する第一の閾値の平均値や最頻値、中央値などを第二の閾値にする。制御部2は、罫線の候補上の画素の第一の閾値から第二の閾値を算出する。
具体的には、制御部2は、図37のS56の処理の変わりに以下の処理を実行する。制御部2は、罫線の候補の外接枠の座標を取得する。制御部2は、罫線の候補となる領域内の各画素の第一の閾値を取得する。制御部2は、S41からS43の二値化処理時で算出した各画素の第一の閾値をメモリ内の第一の閾値バッファに蓄積する。制御部2は、閾値バッファに蓄積された第一の閾値の集合から、罫線領域に該当する第一の閾値群を読み出す。制御部2は、例えば、読み出した第一の閾値群の中央値を算出する。なお、中央値の他、平均値、最頻値、その他の代表値等を用いることも可能である。
中央値の演算はその定義に従って以下のように記述できる。第一の閾値群の各閾値はTh(i)であるとする。第一の閾値群の数はN個であるとする。「i」は0から「N−1」まで変化する。Th(i)が数値の小さい順に並んでいるとすると、Nが奇数の時の中央値C1は、数(7)になる。
Nが偶数の時の中央値は数(8)になる。
以上の処理により、制御部2は、罫線の候補を判別する際に使用した第一の閾値を代表する閾値を取得することが出来る。制御部2は取得した閾値を第二の閾値にする。制御部2は、第二の閾値によって、罫線の延長方向の画素について、前景か背景かを判別する処理を実行する。
本実施例では、画像内の罫線を検出する方法について説明した。多値画像を二値画像に変換するときに画素に使用する閾値を変更する技術は、文字や図形の検出についても適用することが可能である。また、本実施例では、画素を識別する値として明度を用いる。画像の色彩を特定する他のパラメータ、例えば、色相、彩度、輝度等を用いることも可能である。
本発明により、入力画像の罫線の周辺に文字や別の罫線などの濃い近接画素が存在する場合でも罫線の途切れの無い二値画像を得ることができる。画素が濃いとは、前景に近い値の明度を持つことである。制御部2は、罫線の途切れの無い二値画像を取得できるため表認識の精度が向上する。表認識の制度の向上は、入力帳票画像内の文字画像情報の認識率を高めることができる。
濃度が濃い画素は、文字だけでなく、罫線の場合がある。例えば、背景の明度が高く、比較的明度が低い罫線と比較的明度の高い罫線とが直交している場合、二値化処理を実行すると、比較的明度の高い罫線に途切れが発生する場合がある。この場合の罫線の途切れも防ぐことが可能である。