A.第1実施例:
A1.装置構成:
図1は、一実施例としての複合機の構成を示す図である。複合機800は、画像を表示する表示部840と、ユーザによる操作を受け入れる操作部850と、画像を読み取る読取部900と、印刷部860と、複合機800を制御する制御部810と、を備えている。これらの要素は、バスを介して互いに接続されている。
表示部840は、液晶ディスプレイ、有機ELディスプレイなどの、画像を表示する装置である。操作部850は、ボタン、レバー、表示部840上に重ねて配置されたタッチパネルなどの、ユーザによる操作を受け取る装置である。
図1の下部には、複合機800の斜視図が示されている。図中の第1方向Dp1と第2方向Dp2とは、水平な方向を示し、第3方向Dp3は、鉛直上方向を示している。第1方向Dp1と第2方向Dp2とは、互いに垂直である。また、第3方向Dp3を、上方向Dp3とも呼ぶ。
複合機800は、いわゆるフラットベッド式のスキャナ装置である。複合機800は、本体部890と、本体部890の上方向Dp3側に開閉可能に取り付けられたカバー892と、を備えている。図1は、カバー892が上方向Dp3に向けて開けられた状態の複合機800を示している。
本体部890の上方向Dp3側には、支持台894が設けられている。支持台894は、カバー892を上方向Dp3に向けて開くことによって、現れる。支持台894は、第1方向Dp1に平行な2辺と第2方向Dp2に平行な2辺とで囲まれる略矩形状の台であり、透明板(例えば、ガラス板)を用いて構成されている。支持台894の第3方向Dp3側の面は、読取対象のシートが支持される支持面Usである。図1では、支持面Us上に、2枚のシートC1、C2が、互いに離れて配置されている。
本体部890の内部には、読取部900が収容されている。読取部900は、原稿を光学的に読み取るイメージセンサ920と、イメージセンサ920を第2方向Dp2に平行に移動させる移動装置930と、を含んでいる。
イメージセンサ920は、支持台894の下側(第3方向Dp3の反対側)に配置されている。本実施例では、イメージセンサ920は、シートを光学的に読み取る一次元イメージセンサであり、CCDやCMOSなどの複数の光電変換素子(単に、光学素子とも呼ぶ)が、第1方向Dp1に並んで配置された構成を有している。イメージセンサ920は、支持台894上のシートを、光学的に読み取ることによって、読み取ったシートを示すデータを出力する。
移動装置930は、動力源(例えば、電気モータ)を含んでいる。移動装置930は、動力源を用いて、イメージセンサ920を、支持台894の支持面Usに沿う方向(具体的には、第2方向Dp2と平行な方向)に移動させる。
本体部890内には、印刷部860が収容されている(図示省略)。印刷部860は、所定の方式(例えば、レーザ方式や、インクジェット方式)で、紙(印刷媒体の一例)上に画像を印刷する装置である。本実施例では、印刷部860は、シアンC、マゼンタM、イエロY、ブラックKの4種類のインクを用いてカラー画像を印刷可能なインクジェット方式の印刷装置である。
本体部890内には、制御部810も収容されている(図示省略)。図1の上部に示すように、制御部810は、プロセッサ811と、記憶装置815と、を有している。記憶装置815は、揮発性記憶装置812と、不揮発性記憶装置813と、を含んでいる。プロセッサ811は、データ処理を行う演算装置であり、例えば、CPUである。揮発性記憶装置812は、例えば、DRAMであり、不揮発性記憶装置813は、例えば、フラッシュメモリである。これらの要素は、バスを介して互いに接続されている。不揮発性記憶装置813は、プログラム814を格納している。プロセッサ811は、プログラム814の実行に利用される種々の中間データを、記憶装置815(例えば、揮発性記憶装置812、不揮発性記憶装置813のいずれか)に、一時的に格納する。プログラム814は、複合機800の製造者によって、ファームウェアとして、不揮発性記憶装置813に予め格納されている。
プロセッサ811は、プログラム814を実行することによって、読取部900を制御する。具体的には、プロセッサ811は、移動装置930を制御することによって、イメージセンサ920を、支持台894の第2方向Dp2とは反対方向側の端の位置から、第2方向Dp2に向かって、支持台894に沿って移動させる。プロセッサ811は、イメージセンサ920を移動させながら、イメージセンサ920を制御して、支持台894に支持されたシートをイメージセンサ920に光学的に読み取らせる。プロセッサ811は、イメージセンサ920から出力されるデータを用いて、シートの画像を含む対象画像の画像データである対象画像データを取得する(詳細は後述)。
A2.画像処理:
図2は、読取処理の例を示すフローチャートである。読取処理では、シートが読取部900によって読み取られ、そして、各シートの画像データが生成される。以下、図1の2枚のシートC1、C2が、読み取られることとする。シートC1、C2は、例えば、写真を含む略矩形の識別カードである。
プロセッサ811は、ユーザが読取処理の開始指示を操作部850に入力したことに応じて、読取処理を開始する。S110では、プロセッサ811は、読取部900に、シートC1、C2を読み取らせ、イメージセンサ920からのデータを取得する。S120では、プロセッサ811は、イメージセンサ920からのデータを用いて、シートC1、C2の画像を含む対象画像の画像データである対象画像データを取得する。対象画像データは、例えば、RGBのビットマップデータである。
図3(A)は、対象画像の例を示す概略図である。対象画像I10は、第1方向Dxと、第1方向Dxに垂直な第2方向Dyと、に沿ってマトリクス状に並ぶ複数の画素のそれぞれの色値によって、表されている。第1方向Dxは、支持面Us(図1)上における第1方向Dp1に平行な方向であり、第2方向Dyは、支持面Us上における第2方向Dp2に平行な方向である。以下、第1方向Dxを、横方向Dxとも呼び、第2方向Dyを、縦方向Dyとも呼ぶ。図3(A)の対象画像I10は、第1シートC1の画像Ci1と、第2シートC2の画像Ci2と、を含んでいる。
S130(図2)では、プロセッサ811は、対象画像中のオブジェクト領域を特定する処理を実行する。図4は、オブジェクト領域の特定処理の例を示すフローチャートである。S210では、プロセッサ811は、対象画像内の線分である対象線分を検出する処理を実行する。
図5は、対象線分を検出する処理の例を示すフローチャートである。S310ではプロセッサ811は、対象画像内の複数の画素からエッジ画素を検出する。そして、プロセッサ811は、エッジ画素と非エッジ画素との2値の画像データであるエッジ画像データを生成する。
エッジ画素の検出方法は、種々の方法であってよい。本実施例では、プロセッサ811は、いわゆるラプラシアンフィルタを用いて各画素のエッジ強度(例えば、フィルタによる計算結果の絶対値)を算出する。そして、プロセッサ811は、エッジ強度が第1閾値を超えている画素を、エッジ画素として検出する。ラプラシアンフィルタは、対象画像データによって示される特定の色成分値(例えば、緑Gの色成分値)に適用されてよい。これに代えて、ラプラシアンフィルタは、対象画像データから算出される色成分値(例えば、輝度値)に適用されてよい。なお、第1閾値は、適切にエッジ画素を検出できるように、予め実験的に決められている。これに代えて、プロセッサ811は、第1閾値を調整してよい。例えば、プロセッサ811は、対象画像データに応じて第1閾値を調整してよい。
図3(B)は、エッジ画像データによって表される画像であるエッジ画像の例を示す説明図である。このエッジ画像I15は、対象画像I10(図3(A))から得られるエッジ画像を示している。図示するように、エッジ画像I15は、シートの画像Ci1、Ci2から検出されるエッジ画素によって表される画像を、示している。エッジ画素としては、例えば、シートC1、C2内の文字、写真などのオブジェクトを示す画素と、シートC1、C2の輪郭(すなわち、縁)を示す画素とが、検出される。
S320(図5)では、プロセッサ811は、対象画像内の複数のブロックからエッジブロックを特定する。本実施例では、1個のブロックの形状は矩形状である。1個のブロックのサイズは、予め決められており、例えば、40画素×40画素である。図示を省略するが、複数のブロックは、対象画像(例えば、対象画像I10(図3(A))上で、第1方向Dxと第2方向Dyとに沿ってマトリクス状に配置されている。対象画像上の各ブロックの位置は、予め決められている。
プロセッサ811は、エッジ画像データを用いて、ブロック毎にエッジ画素の総数を算出する。そして、プロセッサ811は、エッジ画素の総数が第2閾値以上である場合に、そのブロックを第1種エッジブロックとして選択する。エッジ画素の総数が第2閾値未満である場合、プロセッサ811は、そのブロックを非第1種エッジブロックとして選択する。そして、プロセッサ811は、第1種エッジブロックと非第1種エッジブロックとの2値の画像データである第1種エッジブロックデータを生成する。なお、第2閾値は、適切に第1種エッジブロックを検出できるように、予め実験的に決められている。これに代えて、プロセッサ811は、第2閾値を調整してよい。例えば、プロセッサ811は、対象画像データに応じて第2閾値を調整してよい。
図3(C)は、第1種エッジブロックデータによって表される画像である第1種エッジブロック画像の例を示す説明図である。この第1種エッジブロック画像I20は、エッジ画像I15(図3(B))から得られる第1種エッジブロック画像を示している。図示するように、第1種エッジブロック画像I20は、シートの画像Ci1、Ci2から検出されるエッジ画素を含む第1種エッジブロックによって表される画像を示している。
S330(図5)では、プロセッサ811は、第1種エッジブロック画像のラベリング処理を行う。例えば、プロセッサ811は、連続する1以上の第1種エッジブロックで構成される1つの領域を、1つの連続領域として選択し、1つの連続領域に、1つの識別子を割り当てる。そして、プロセッサ811は、互いに離れた複数個の連続領域に、互いに異なる識別子を割り当てる。ラベリング処理としては、種々の処理を採用可能である。本実施例では、いわゆる8近傍ラベリングが行われる。これに代えて、いわゆる4近傍ラベリングが行われてよい。
図3(D)は、第1種エッジブロック画像I20のラベリングの結果を示すラベリング画像の説明図である。このラベリング画像I25は、第1種エッジブロック画像I20(図3(C))のラベリング処理の結果を示している。8個の連続領域A1~A8が検出されている。8個の連続領域A1~A8には、文字「LB」から始まる符号が付されている。文字「LB」に続く数字は、連続領域の識別番号である。第1連続領域A1は、第1シートC1の輪郭を示している。第5連続領域A5は、第2シートC2の輪郭を示している。他の連続領域A2~A4、A6~A8は、それぞれ、シート内のオブジェクトを示している。このように、典型的には、ラベリングによって得られる1個の連続領域は、1つのシートの輪郭、または、シート内の1つのオブジェクトを、示している。シート内の画像によっては、シート内の2個のオブジェクトを示す複数の第1種エッジブロックが、1つの連続領域に分類される場合もある。また、シートの輪郭を示す第1種エッジブロックと、シート内のオブジェクトを示す第1種エッジブロックとが、1つの連続領域に分類される場合もある。
S340(図5)では、プロセッサ811は、連続領域の縁を示すブロックである第2種エッジブロックと特定する。プロセッサ811は、連続領域を構成する複数の第1種エッジブロックのうち、非第1種エッジブロックに隣接する第1種エッジブロックを、第2種エッジブロックとして選択する。ここで、いわゆる8近傍のブロックが、隣接するブロックとして用いられる。これに代えて、いわゆる4近傍のブロックが、隣接するブロックとして用いられてもよい。
図3(E)は、第2種エッジブロックによって表される画像である第2種エッジブロック画像の例を示す説明図である。この第2種エッジブロック画像I30は、ラベリング画像I25(図3(D))から得られる第2種エッジブロック画像を示している。図示するように、各連続領域A1~A8から、第2種エッジブロックが検出される。ここで、連続領域A1~A8から、第2種エッジブロックの連続領域AE1~AE8が、それぞれ検出されたこととする。連続領域AE1~AE8の識別子LB1~LB8は、元の連続領域A1~A8の識別子LB1~LB8と、それぞれ同じである。
S350(図5)では、プロセッサ811は、第2種エッジブロック毎に、互いに異なる4つの方向のそれぞれのエッジ画素を検出する(方向エッジ画素と呼ぶ)。図6(A)~図6(D)は、1個の第2種エッジブロックBLKから検出される4つの方向Dx、Dy、-Dx、-Dyの方向エッジ画素Px1、Px2、Px3、Px4を、それぞれ示している。以下、第2種エッジブロックBLKを、単に、ブロックBLKとも呼ぶ。-Dx方向は、第1方向Dx(+Dx方向とも呼ぶ)の反対方向であり、-Dy方向は、第2方向Dy(+Dy方向とも呼ぶ)の反対方向である。このように、4つの方向+Dx、+Dy、-Dx、-Dyは、右、下、左、上の4つの方向に対応する。各図中には、1個のブロックBLKが示されている。このブロックBLK内のハッチングで示される領域AZは、S310(図5)で検出されたエッジ画素の領域である。領域AZは、縦に延びる線を示している。
図6(A)に示すように、+Dx方向の方向エッジ画素Px1は、ブロックBLKの-Dx方向の端から+Dx方向に画素を辿る場合に、最初に検出されたエッジ画素である。他の方向+Dy、-Dx、-Dyの方向エッジ画素Px2、Px3、Px4も、同様に、ブロックBLKの対応する方向とは反対方向の端から、対応する方向に画素を辿る場合に、最初に検出されたエッジ画素である。なお、ブロックBLKの対応する方向とは反対方向の端の画素がエッジ画素である場合、そのエッジ画素は、方向エッジ画素として検出されない。例えば、図6(B)は、+Dy方向の方向エッジ画素Px2が検出される。ここで、ブロックBLKの+Dy方向とは反対の-Dy方向の端のエッジ画素Px2xは、+Dy方向の方向エッジ画素としては、検出されない。
図6(A)~図6(D)に示すように、縦に延びる線を示す領域AZからは、多数の+Dx方向の方向エッジ画素Px1と、多数の-Dx方向の方向エッジ画素Px3とが、検出される。後述する処理では、これらの多数の方向エッジ画素Px1、Px3を用いることによって、領域AZのように縦に延びる線を、適切に検出できる。図示を省略するが、横に延びる線を示す領域からは、多数の+Dy方向の方向エッジ画素Px2と、多数の-Dy方向の方向エッジ画素Px4とが、検出される。後述する処理では、これらの多数の方向エッジ画素Px2、Px4を用いることによって、横に延びる線を、適切に検出できる。
S360(図5)では、プロセッサ811は、第2種エッジブロック毎に、4つの方向のそれぞれの部分線分を特定する。本実施例では、プロセッサ811は、複数の方向エッジ画素のそれぞれの座標を近似する直線の一部が、部分線分として用いられる。具体的には、プロセッサ811は、複数の方向エッジ画素のそれぞれの座標を、最小二乗法によって近似することによって近似直線を算出する。そして、プロセッサ811は、近似直線のうち、ブロックBLKに含まれる部分を、部分線分として特定する。
図6(E)~図6(H)は、図6(A)~図6(D)の第2種エッジブロックBLKから検出される4つの方向Dx、Dy、-Dx、-Dyの部分線分SL1~SL4を、それぞれ示している。図6(E)~図6(H)には、ブロックBLK内の4つの方向Dx、Dy、-Dx、-Dyの方向エッジ画素Px2、Px3、Px4が、それぞれ示されている。部分線分SL1~SL4は、方向エッジ画素Px2、Px3、Px4の座標を最小二乗法で近似することによって得られる近似直線の一部である。
部分線分の両端の特定方法は、種々の方法であってよい。本実施例では、プロセッサ811は、近似直線のうち、方向エッジ画素の分布範囲内の部分を、部分線分として選択する。図6(F)には、部分線分SL2の両端e1、e2が示されている。この部分線分SL2は、複数の方向エッジ画素Px2から特定されている。図6(F)には、端e2を含む部分の拡大図が示されている。部分線分SL2の端e2は、端の画素Px2e2の座標を通り近似直線FL2に垂直な直線PL2と、近似直線FL2と、の交点である。プロセッサ811は、複数の方向エッジ画素Px2の近似直線FL2に平行な方向の位置を算出し、両端の画素Px2e1、Px2e2を特定する。そして、端の画素Px2e1、Px2e2の座標を通り近似直線FL2に垂直な直線と、近似直線FL2と、の交点e1、e2を、部分線分SL2の両端として採用する。
なお、1つの方向に対応する方向エッジ画素の総数が1以下である場合、その方向の部分線分は、検出されないこととする。このように、1個の第2種エッジブロックBLKからは、0本以上、4本以下の部分線分が検出され得る。
S370(図5)では、プロセッサ811は、S360で検出された複数の部分線分から、共通の1本の直線に対応する複数の部分線分のグループを、1つの線分グループとして選択する。これにより、複数の部分線分は、1以上の線分グループに、分類される。プロセッサ811は、複数の部分線分の分類を、連続領域毎に行う。従って、1個の線分グループは、同じ連続領域に含まれる1以上の部分線分で構成される。
図7(A)~図7(C)は、2本の部分線分を1つの線分グループに分類するための条件の例を示す説明図である。図7(A)には、互いに隣接する2つの第2種エッジブロックBLKa、BLKbが示されている。これらのブロックBLKa、BLKbは、部分線分SLa、SLbを、それぞれ有している。端ea1、ea2は、第1部分線分SLaの両端であり、端eb1、eb2は、第2部分線分SLbの両端である。第1部分線分SLaの端ea2は、第2部分線分SLb側の端である。第2部分線分SLbの端eb1は、第1部分線分SLa側の端である。方向Daは、第1部分線分SLaに平行な方向であり、方向Dbは、第2部分線分SLbに平行な方向である。
本実施例では、プロセッサ811は、2本の部分線分の間の距離が第1距離閾値以下であり、かつ、2本の部分線分が成す角度が第1角度閾値以下である場合に、2本の部分線分を同じ線分グループに分類する。
図7(B)は、2本の部分線分の間の距離の説明図である。図中には、2本の部分線分SLa、SLbのうち、端ea2、eb1の近傍の一部分が、示されている。距離DSaは、2本の部分線分SLa、SLbの間の距離を示している。本実施例では、2本の部分線分の間の距離は、一方の部分線分を延長して得られる直線である延長直線と、他方の部分線分上の任意の位置と、の間の最短距離である。換言すれば、距離は、延長直線と、他方の部分線分との間の、延長直線に垂直な方向の距離の最小値である。図7(B)の例では、距離DSaは、第1部分線分SLaを延長して得られる延長直線ELaと、第2部分線分SLbと、の間の最短距離である。第2部分線分SLbが第1部分線分SLaに対して傾斜している場合、距離DSaは、第2部分線分SLbの端(ここでは、端eb1)と延長直線ELaとの間の距離である。
図7(C)は、2本の部分線分の成す角度の説明図である。図中には、2本の部分線分SLa、SLbの方向Da、Dbが示されている。本実施例では、2本の部分線分SLa、SLbが成す角度AGaは、2つの方向Da、Dbが成す角度である。なお、部分線分の方向は、部分線分に平行な2つの方向(すなわち、互いに反対の方向)から選択される。従って、2つの方向が成す角度は、90度を超え得る。この場合、2本の部分線分の成す角度としては、180度から2つの方向が成す角度を減算して得られる角度が、採用される。
なお、第1距離閾値と第1角度閾値とは、同じ直線に対応する複数の部分線分が同じ線分グループに分類されるように、予め実験的に決められている。これに代えて、プロセッサ811は、第1距離閾値と第1角度閾値とを調整してよい。例えば、プロセッサ811は、対象画像データに応じて、閾値と第1角度閾値とを調整してよい。
S370(図5)では、プロセッサ811は、1個の連続領域内の互いに隣接する2つの第2種エッジブロックに含まれる複数の部分線分から得られる2本の部分線分の全ての組み合わせについて、距離と角度とが上記の条件を満たすか否かを判断する。そして、条件を満たす2本の部分線分を、同じ線分グループに分類する。プロセッサ811は、このような処理を、連続領域内の互いに隣接する2つの第2種エッジブロックの全ての組み合わせについて実行する。また、プロセッサ811は、このような処理を、連続領域毎に行う。ここで、いわゆる8近傍のブロックが、隣接するブロックとして用いられる。これに代えて、いわゆる4近傍のブロックが、隣接するブロックとして用いられてもよい。なお、S340とS370との間で、隣接するブロックの定義は、同じであってよく、異なってもよい。
S380では、プロセッサ811は、線分グループ毎に、1本の線分を特定する。特定される線分は、対象画像内の線分を示している(対象線分とも呼ぶ)。本実施例では、プロセッサ811は、1個の線分グループに含まれる全ての部分線分のそれぞれの両端の画素の座標を、最小二乗法によって近似することによって、1本の対象線分を特定する。対象線分の特定方法は、S360(図5)の部分線分の特定方法と同じである。対象線分の両端は、図6(F)で説明した部分線分SL2の両端e1、e2の特定方法と同じ方法で、特定される。
図7(D)は、対象線分を示す対象線分画像の例を示す説明図である。この対象線分画像I35は、図3(A)、図3(E)の画像I10、I30の処理によって得られる対象線分の例を示している。図示するように、対象線分画像I35は、シートC1、C2(図3(A))の輪郭やシートC1、C2内のオブジェクトを示す対象線分を表している。各対象線分には、文字「L」から始まる符号が付されている。文字「L」に続く数字は、線分グループを含む連続領域の識別番号である。識別番号に続く文字は、対象線分を区別する符号である。例えば、6本の対象線分L1a、L1b、L1c、L1d、L1e、L1fは、同じ1番の連続領域AE1(図3(E))から検出された対象線分である。2本の対象線分L1c、L1dは、第1シートC1(図3(A))の輪郭のうちの第1方向Dx側の同じ辺に対応している。このように、対象画像I10内の1本の線分は、同じ連続領域内の互いに離れた複数の対象線分L1c、L1dによって、表され得る。
S390(図5)では、プロセッサ811は、各対象線分に、対象線分を含む連続領域の識別子と同じ識別子を付与する。例えば、プロセッサ811は、6本の対象線分L1a、L1b、L1c、L1d、L1e、L1fには、連続領域AE1と同じ識別子(ここでは、1番)を付与する。そして、図5の処理、ひいては、図4のS210が、終了する。
図4のS220では、プロセッサ811は、対象線分を用いて矩形の角点を検出する。後述するように、矩形は、シートの輪郭として用いられる。図8は、角点を検出する処理の例を示すフローチャートである。S410では、プロセッサ811は、未処理の連続領域の識別子を対象識別子として選択する。
S415では、プロセッサ811は、対象識別子に対応する複数の対象線分を結合する処理を行う。図7(D)で説明したように、対象画像I10(図3(A))内の1本の線分は、同じ連続領域内の互いに離れた複数の対象線分によって、表され得る(例えば、対象線分L1c、L1d)。S415では、プロセッサ811は、このような複数の対象線分を結合することによって1本の対象線分を生成する。
図9(A)、図9(B)は、2本の対象線分を結合するための条件の例を示す説明図である。本実施例では、プロセッサ811は、2本の対象線分の間の距離が第2距離閾値以下であり、かつ、2本の対象線分が成す角度が第2角度閾値以下である場合に、2本の対象線分を結合する。
図9(A)は、2本の対象線分の間の距離の説明図である。図中には、2本の対象線分L1c、L1dのうちの一部分が示されている。対象線分L1cの端e1cは、対象線分L1d側の端である。対象線分L1dの端e1dは、対象線分L1c側の端である。距離DSbは、対象線分L1c、L1dの間の距離である。この距離DSbは、図7(B)で説明した距離DSaの算出方法と同じ方法によって、算出される。
図9(B)は、2本の部分線分の成す角度の説明図である。方向DL1cは、対象線分L1cに平行な方向であり、方向DL1dは、対象線分L1dに平行な方向である。角度AGbは、2つの方向DL1c、DL1dが成す角度である。この角度AGbが、2本の対象線分L1c、L1dが成す角度として用いられる。角度AGbは、図7(C)で説明した角度AGaの算出方法と同じ方法によって、算出される。
距離DSbが第2距離閾値以下であり、かつ、角度AGbが第2角度閾値以下である場合、プロセッサ811は、2本の対象線分L1c、L1dを結合して1本の対象線分を生成する。図9(C)は、対象線分を示す対象線分画像の例を示す説明図である。この対象線分画像I40は、図7(D)の対象線分画像I35にS415(図8)の処理を行うことによって得られる対象線分を示している。2本の対象線分L1c、L1d(図7(D))は、1本の対象線分L1cdに置換され、2本の対象線分L5d、L5e(図7(D))は、1本の対象線分L5deに置換されている。
複数の対象線分から1本の対象線分を特定する方法は、図5のS380の方法と同じである。プロセッサ811は、結合すべき複数の対象線分のそれぞれの両端の画素の座標を、最小二乗法によって近似することによって、1本の対象線分を特定する。
S415(図8)では、プロセッサ811は、対象識別子に対応付けられた複数の対象線分から得られる2本の対象線分の全ての組み合わせについて、距離と角度とが上記の条件を満たすか否かを判断する。プロセッサ811は、条件を満たす2本の対象線分を、同じ結合グループに分類する。そして、プロセッサ811は、1個の結合グループに含まれる複数の対象線分を結合することによって、新たな1本の対象線分を生成する。複数の対象線分の結合は、結合グループ毎に行われる。
なお、第2距離閾値と第2角度閾値とは、同じ直線に対応する複数の対象線分が結合されるように、予め実験的に決められている。本実施例では、第2距離閾値は、S370(図5)で用いられる第1距離閾値よりも大きい値に、予め決定されている。第2角度閾値は、S370で用いられる第1角度閾値と同じである。なお、第2距離閾値と第2角度閾値とは、他の種々の値であってよい。また、プロセッサ811は、第2距離閾値と第2角度閾値とを調整してよい。例えば、プロセッサ811は、対象画像データに応じて、第2距離閾値と第2角度閾値とを調整してよい。
S420(図8)では、プロセッサ811は、対象識別子に対応付けられた複数の対象線分の重心位置を算出する。図9(D)は、対象識別子に対応付けられた複数の対象線分の例を示す説明図である。図中には、1番の対象識別子に対応付けられた5本の対象線分L1a、L1b、L1cd、L1e、L1fが、示されている。点PCは、5本の対象線分L1a、L1b、L1cd、L1e、L1fの重心である(重心PCとも呼ぶ)。
複数の対象線分の重心の算出方法としては、任意の方法を採用可能である。例えば、プロセッサ811は、以下の方法で重心を算出可能である。プロセッサ811は、各対象線分の中点の座標を、対象線分の重心の座標として算出する。プロセッサ811は、複数の対象線分のそれぞれの重心の座標の重み付き平均の座標を、複数の対象線分の重心の座標として算出する。ここで、重みは、対象線分の長さである。
S430(図8)では、プロセッサ811は、対象線分毎に、特徴量を算出する。特徴量は、対象線分がシートの輪郭の一部を示す可能性の高さを示している。この可能性は、対象線分の長さ(線分長とも呼ぶ)が長いほど、高い。また、この可能性は、対象線分に垂直な方向の対象線分と重心との間の距離(重心距離とも呼ぶ)が長いほど、高い。図9(D)の5個の距離D1a、D1b、D1cd、D1e、D1fは、5本の対象線分L1a、L1b、L1cd、L1e、L1fのそれぞれの重心距離を示している。本実施例では、プロセッサ811は、線分長と重心距離との合計値を、特徴量として算出する。
S440(図8)では、プロセッサ811は、最大の特徴量を有する対象線分を、第1代表線分として選択する。図9(D)の例では、対象線分L1eが第1代表線分として選択されることとする。
S450では、プロセッサ811は、第1代表線分を用いて、シートの輪郭を示す可能性の高い対象線分を、候補線分として選択する。本実施例では、以下の条件A、Bを満たす対象線分と、条件A、Cを満たす対象線分とが、候補線分として選択される。
条件A)対象線分の線分長が線分長閾値以上である。
条件B)対象線分と第1代表線分とが平行条件を満たす。
条件C)対象線分と第1代表線分とが垂直条件を満たす。
線分長閾値は、検出すべきシートの大きさを考慮して、予め決められている。例えば、線分長閾値は、想定されているシートの短辺の長さよりも小さい値に設定される。
平行条件は、対象線分と第1代表線分とが成す角度が、ゼロ度を含む第1範囲内であることである。角度は、図7(C)で説明した角度AGaの算出方法と同じ方法によって、算出される。第1範囲は、シートの互いに平行な2辺に対応する2本の対象線分が平行条件を満たし、互いに平行ではない2本の対象線分が平行条件を満たさないように、予め実験的に決められている。ここで、第1範囲は、シートの製造誤差や読取部900(図1)による読取りの誤差などの種々の誤差が許容されるように、決定される。第1範囲は、例えば、ゼロ度以上、5度以下の範囲である。
垂直条件は、対象線分と第1代表線分とが成す角度が、90度を含む第2範囲内であることである。角度は、図7(C)で説明した角度AGaと同じ方法によって、算出される。第2範囲は、シートの互いに垂直な2辺に対応する2本の対象線分が垂直条件を満たし、互いに垂直ではない2本の対象線分が垂直条件を満たさないように、予め実験的に決められている。ここで、第2範囲は、シートの製造誤差や読取部900(図1)による読取りの誤差などの種々の誤差が許容されるように、決定される。第2範囲は、例えば、85度以上、90度以下の範囲である。
以上の条件に従って、プロセッサ811は、第1代表線分と共にシートの輪郭を示す可能性の高い対象線分を、候補線分として選択する。図9(D)の例では、対象線分L1a、L1bが、条件A、Bを満たし、対象線分L1cd、L1fが、条件A、Cを満たすこととする。
S460(図8)では、プロセッサ811は、候補線分のうち、第1代表線分との上記の平行条件を満たし、かつ、第1代表線分から最も遠い候補線分を、第2代表線分として選択する。図9(D)の例では、2本の候補線分L1a、L1bが、第1代表線分L1eとの平行条件を満たしている。これらの候補線分L1a、L1bのうち、第1代表線分L1eから最も遠い線分は、候補線分L1aである。従って、プロセッサ811は、候補線分L1aを、第2代表線分として、選択する。通常は、シートの輪郭の内側には、オブジェクトを示すとともに輪郭に連続する他の対象線分が配置され得るが、シートの輪郭の外側には、輪郭に連続する他の対象線分は配置されない。従って、S460の上記の条件によって、プロセッサ811は、シートの輪郭の4辺のうち第1代表線分に対応する辺に平行な他の辺を示す候補線分を、第2代表線分として選択できる。
S470では、プロセッサ811は、候補線分のうち、第1代表線分との上記の垂直条件を満たし、かつ、最も外側の候補線分を、第3代表線分として選択する。ここで、最も外側の線分は、重心から最も遠い線分である。図9(D)の例では、2本の対象線分L1cd、L1fが、第1代表線分との垂直条件を満たしている。これらの候補線分L1cd、L1fのうち、重心PCから最も遠い線分は、候補線分L1fである。従って、プロセッサ811は、候補線分L1fを、第3代表線分として、選択する。上述したように、通常は、シートの輪郭の外側には、輪郭に連続する他の対象線分は配置されない。従って、S470の上記の条件によって、プロセッサ811は、シートの輪郭の辺を示す候補線分を、第3代表線分として選択できる。
S480では、プロセッサ811は、候補線分のうち、第1代表線分との上記の垂直条件を満たし、かつ、第3代表線分の反対側の最も外側の候補線分を、第3代表線分として選択する。第3代表線分の反対側の候補線分は、重心を挟んで第3代表線分に対向する線分である。図9(D)の例では、対象線分L1cdが、第1代表線分との垂直条件を満たしている。この候補線分L1cdは、重心PCを挟んで第3代表線分L1fと対向している。そして、候補線分L1cdは、第3代表線分L1fの反対側の線分のうち、重心PCから最も遠い線分である。従って、プロセッサ811は、候補線分L1cdを、第4代表線分として、選択する。上述したように、通常は、シートの輪郭の外側には、輪郭に連続する他の対象線分は配置されない。従って、S480の上記の条件によって、プロセッサ811は、シートの輪郭の辺を示す候補線分を、第4代表線分として選択できる。
S490では、プロセッサ811は、4本の代表線分のそれぞれを延長することによって、4個の交点(すなわち、4個の角点)を特定する。図9(E)は、4個の角点の説明図である。図中の4本の直線L1ae、L1cde、L1ee、L1feは、図9(D)の4本の代表線分L1a、L1cd、L1e、L1fを、それぞれ延長して得られる直線である。4本の直線L1ae、L1cde、L1ee、L1feは、四角形Q1を形成している。4個の交点C11、C12、C13、C14は、それぞれ、互いに異なる2本の代表線分の交点であり、四角形Q1の4個の角点である。なお、四角形Q1の4個の角の内角は、おおよそ90度である。従って、四角形Q1は、略矩形である。
S495では、プロセッサ811は、全ての連続領域(すなわち、識別子)の処理が終了したか否か判断する。未処理の連続領域が残っている場合(S495:No)、プロセッサ811は、S410へ移行する。全ての連続領域の処理が終了した場合(S495:Yes)、プロセッサ811は、図8の処理、すなわち、図4のS220の処理を、終了する。
S230では、プロセッサ811は、不要な角点を除去する処理を行う。図10(A)は、図4のS220で検出される角点の例を示す説明図である。図中には、第1四角形Q1の4個の角点C11~C14と、第2四角形Q2の4個の角点C21~C24と、が示されている。第2四角形Q2は、第1四角形Q1の内部に含まれている。第1四角形Q1は、第1シートC1の輪郭を示し、第2四角形Q2は、第1シートC1の内の四角のオブジェクトの輪郭を示している。このように、他の四角形の内部に配置される四角形は、シートの内のオブジェクトを示している可能性が高い。本実施例では、プロセッサ811は、連続領域毎に特定された4個の角点の座標を用いて、4個の角点で構成される四角形の包含関係を特定する。そして、他の四角形の内に含まれる四角形の4個の角点を、処理対象の角点から除去する。図10(A)の例では、第2四角形Q2の4個の角点C21~C24が、除去される。
S240(図4)では、プロセッサ811は、角点を用いて矩形のオブジェクト領域を示すオブジェクト領域情報を生成する。図10(B)は、オブジェクト領域情報の例を示す説明図である。図中の4個の角点C11~C14は、図10(A)の4個の角点C11~C14と同じである。プロセッサ811は、4個の角点C11~C14によって形成される矩形の幅W1と高さH1と中心座標RC1と傾斜角AG1とを、オブジェクト領域情報として算出する。傾斜角AG1は、対象画像内における第1方向Dxに対する矩形の辺の方向DR1の傾きを示している。支持面Us(図1)上で、シートC1が第1方向Dp1に対して傾いた状態で配置された場合、対象画像内において、4個の角点C11~C14で構成される矩形は、第1方向Dxに対して傾く。矩形の辺の方向DR1は、矩形の4辺のうち第1方向Dxに対する傾きの最も小さい辺を用いて、特定される。
上述したように、角点C11~C14によって形成される四角形Q1は、厳密な矩形ではない場合がある。プロセッサ811は、角点C11~C14によって形成される矩形として、角点C11~C14を近似する矩形を用いてよい。角点C11~C14を近似する矩形を特定する方法は、種々の方法であってよい。例えば、プロセッサ811は、第1代表線分を含む辺を有する矩形であって、4個の角点を含む最小の矩形を、採用してよい。
S240(図4)では、プロセッサ811は、連続領域毎に、オブジェクト領域情報を生成する。図10(C)は、オブジェクト領域情報によって示されるオブジェクト領域の例を示す説明図である。図中には、図3(A)と同じ対象画像I10が示されている。第1オブジェクト領域R1は、第1シートC1の画像Ci1を示す矩形領域である。第2オブジェクト領域R2は、第2シートC2の画像Ci2を示す矩形領域である。このように、プロセッサ811は、シートの輪郭を示す辺を有する矩形のオブジェクト領域の情報を、生成できる。また、対象画像I10が複数のシートC1、C2の画像Ci1、Ci2を含む場合に、プロセッサ811は、各シートC1、C2の輪郭を示す矩形の領域R1、R2を、適切に特定できる。
オブジェクト領域情報の生成の終了によって、図4の処理、すなわち、図2のS130の処理が終了する。続いて、プロセッサ811は、オブジェクト領域の画像を表すオブジェクト画像データを生成する処理を実行する。
S140では、プロセッサ811は、未処理のオブジェクト領域を、対象オブジェクト領域として選択する。S150では、プロセッサ811は、対象画像データのうち対象オブジェクト領域を示す部分を切り出すクロップ処理実行する。図10(D)は、切り出されたオブジェクト領域の例を示す説明図である。図中には、図10(C)の第1オブジェクト領域R1が、示されている。第1オブジェクト領域R1の外の部分は、削除されている。
S160(図2)では、プロセッサ811は、対象オブジェクト領域の傾斜角に基づいて、対象オブジェクト領域の傾きを補正する処理を実行する。具体的には、プロセッサ811は、傾斜角がゼロになるように、対象オブジェクト領域を回転させる。そして、プロセッサ811は、補正済のオブジェクト領域を表すオブジェクト画像データを生成する。図10(E)は、補正済の対象オブジェクト領域の例を示す説明図である。図中のオブジェクト領域R1rは、図10(D)のオブジェクト領域R1の傾きを補正して得られる画像を示している。図示するように、矩形状のオブジェクト領域R1の横に延びる辺は、第1方向Dxに平行であり、縦に延びる辺は、第2方向Dyに平行である。
S170(図2)では、プロセッサ811は、S160で生成したオブジェクト画像データを、記憶装置に格納する。本実施例では、プロセッサ811は、オブジェクト画像データを不揮発性記憶装置813(図1)に格納する。これに代えて、プロセッサ811は、ユーザによって指定された記憶装置(例えば、複合機800に接続された図示しない携帯記憶装置)に、オブジェクト画像データを格納してよい。
S180では、プロセッサ811は、全てのオブジェクト領域の処理が終了したか否かを判断する。未処理のオブジェクト領域が残っている場合(S180:No)、プロセッサ811は、S140へ移行する。全てのオブジェクト領域の処理が終了した場合(S180:Yes)、プロセッサ811は、図2の処理を終了する。
以上のように、本実施例では、図2のS120で、プロセッサ811は、対象画像データを取得する。図5のS310~S350では、プロセッサ811は、対象画像データによって表現される対象画像からエッジ画素を検出する処理を実行する。図5のS360では、プロセッサ811は、対象画像を構成する複数のブロックのうちのエッジ画素を含むブロック毎に、ブロック内のエッジ画素の座標を用いて、ブロック内の線分である部分線分を検出する処理を実行する。図5のS370~S380では、プロセッサ811は、複数のブロックから検出された部分線分を用いて、対象画像内の線分である対象線分を特定する。このように、プロセッサ811は、ブロック毎に検出された部分線分を用いて対象画像内の線分を特定するので、精度良く線分を特定できる。
また、図5のS350、図6(A)~図6(D)で説明したように、プロセッサ811は、互いに異なる4つの方向+Dx、+Dy、-Dx、-Dyのそれぞれのエッジ画素Px1、Px2、Px3、Px4を検出する。従って、種々の方向に延びる線を示す部分線分を、適切に、検出できる。
また、図5のS360、図6(E)~図6(H)で説明したように、プロセッサ811は、4つの方向+Dx、+Dy、-Dx、-Dyのそれぞれについて、方向に対応するエッジ画素の座標を用いて方向に対応する部分線分を検出する。そして、S370、S380で説明したように、プロセッサ811は、複数のブロックから方向毎に検出された部分線分を用いて、対象画像内の対象線分を特定する。このように、プロセッサ811は、方向毎に検出された部分線分を用いて対象線分を特定するので、種々の方向に延びる線分を、適切に、特定できる。
また、S360で説明したように、プロセッサ811は、各ブロックにおいて、複数のエッジ画素のそれぞれの座標を最小二乗法で近似することによって得られる直線の一部を、部分線分として検出する。従って、プロセッサ811は、複数のエッジ画素の座標を用いて適切な部分線分を検出できる。また、ハフ変換を用いる方法や、高速フーリエ変換とウエーブレット変換とを用いる方法と比べて、小さい容量の記憶装置を用いて処理を進行できる。
また、図2のS110、S120で説明したように、プロセッサ811は、シートを光学的に読み取る読取部900からのデータを用いて、シートの画像を含む対象画像を表現する対象画像データを取得する。そして、図4のS220~S240、図8の処理では、プロセッサ811は、対象画像内の対象線分を用いて、対象画像内のシートの輪郭を示す矩形を特定する。この構成によれば、プロセッサ811は、対象画像内のシートの輪郭を示す矩形を、適切に、特定できる。
また、図5のS320、S330で説明したように、プロセッサ811は、対象画像からエッジ画素を含む複数のブロックが連続する連続領域を特定する。そして、図8の処理では、プロセッサ811は、連続領域毎に、連続領域に含まれる対象線分を用いて4個の角点を特定する。そして、図4のS230、S240では、4個の角点を用いて、矩形を特定する。すなわち、連続領域毎に、矩形が特定される。この構成によれば、図3(A)の対象画像I10のように、対象画像が複数のシートの画像を含む場合に、図10(C)で説明したように、プロセッサ811は、各シートの輪郭を示す矩形を、適切に特定できる。
また、図8のS420~S480、図9(D)、図9(E)で説明したように、プロセッサ811は、複数の対象線分の重心の位置と、複数の対象線分のそれぞれの長さと、を用いて、シートの輪郭の一部を示す対象線分を特定する。これにより、シートの輪郭の一部を示す対象線分を、適切に、特定できる。
また、図1に示すように、複合機800は、読取装置の例である。具体的には、複合機800は、図2の読取処理を実行する画像処理装置の例である制御部810と、シートを載せるための支持台894と、支持台894に載せられたシートを光学的に読み取る読取部900と、を備えている。そして、図2のS110、S120で説明したように、制御部810のプロセッサ811は、読取部900からのデータを用いて、対象画像データを取得する。従って、複合機800を用いることによって、他の装置を用いずに、画像処理を進行できる。
B.変形例:
(1)図6(A)等に示すブロックBLKは、対象画像を構成する複数の部分領域の例である。部分領域の形状は、正方形に代えて、長方形など、他の種々の形状であってよい。なお、部分領域の大きさが大きい場合には、1個の部分領域に複数の線分が含まれ易い。1個の部分領域に複数の線分が含まれる場合、適切な対象線分の特定が難しい。部分領域の大きさが小さい場合には、1個の部分領域に含まれるエッジ画素の総数は、容易に少なくなる。1個の部分領域に含まれるエッジ画素の総数が少ない場合、適切な対象線分の特定が難しい。従って、部分領域の形状と大きさとは、検出すべき線分を含む種々の画像を用いて、実験的に決定されてよい。
(2)エッジ強度を算出するためのフィルタは、ラプラシアンフィルタに代えて、エッジ強度を算出するための任意のフィルタであってよい(ソーベルフィルタ、プレウィットフィルタなど)。ソーベルフィルタ、プレウィットフィルタ等の特定の方向の差分を算出するフィルタを用いる場合には、エッジ画素を検出するために、複数の方向のエッジ強度を総合して得られるエッジ強度が用いられてよい。例えば、第1方向Dxのエッジ強度と第2方向Dyのエッジ強度との合計値が、エッジ強度として用いられてよい。
(3)対象線分の特定処理は、図5で説明した処理に代えて、他の種々の処理であってよい。例えば、S350が省略されて、S360では、プロセッサ811は、第2種エッジブロックに含まれる全てのエッジ画素を用いて、部分線分を特定してよい。また、S360では、プロセッサ811は、1個の第2種エッジブロックに含まれる全ての方向の複数のエッジ画素を用いて、1本の部分線分を特定してよい。また、近似直線のうちブロックに含まれる部分の全体が、部分線分として用いられてよい。また、複数のエッジ画素を用いて部分線分を特定する処理は、最小二乗法に代えて、ハフ変換を用いる処理であってよい。
また、S330、S340が省略されてよい。この場合、S360では、プロセッサ811は、全ての第1種エッジブロックの部分線分を特定してよい。S370では、プロセッサ811は、全ての第1種エッジブロックの複数の部分線分を、線分グループに分類してよい。そして、図8の処理では、プロセッサ811は、対象画像に含まれる全ての部分線分を用いて、1個の矩形の4個の角点を特定してよい。この場合も、対象画像に含まれるシートの画像の総数が1である場合には、適切に、シートの輪郭に対応する矩形を特定できる。
(4)対象線分を用いて特定される矩形は、シートの輪郭を示す矩形に代えて、他の任意のオブジェクトを示す矩形であってよい。例えば、対象画像が2次元コードを含む場合に、プロセッサ811は、上記の実施例の処理を実行することによって、対象画像から2次元コードを抽出することができる。プロセッサ811は、抽出された2次元コードの画像を、表示部840に表示させてよい。
いずれの場合も、矩形を特定する処理は、図4、図8で説明した処理に代えて、他の種々の処理であってよい。例えば、図8のS430では、線分長が省略されて、特徴量は、重心距離であってよい。これに代えて、重心距離が省略されて、特徴量は、線分長であってよい。また、特徴量は、線分長と重心距離との重み付きの合計値であってよい(線分長と重心距離とのそれぞれの重みは、予め実験的に決定されてよい)。一般的に、特徴量は、線分長と相関を有する値であることが好ましい。また、特徴量は、重心距離と相関を有する値であることが好ましい。
また、矩形の一部を示す対象線分は、重心を用いずに、特定されてよい。例えば、プロセッサ811は、4本の対象線分を延長して得られる4本の延長直線で囲まれる四角領域の面積が最大となるような4本の対象線分を、選択してよい。
(5)対象画像から特定される矩形は、種々の処理に利用されてよい。例えば、図2のS170では、プロセッサ811は、クロップ処理されたオブジェクト画像を、表示部840に表示させてよい。また、プロセッサ811は、対象画像内の矩形の位置と大きさとをユーザに示すために、対象画像上に矩形を示す図形が重なる重畳画像を、表示部840に表示させてよい。
(6)対象画像から特定される対象線分を用いる処理は、種々の処理であってよい。例えば、プロセッサ811は、対象線分を用いて対象画像の傾き補正を行ってよい。対象画像から複数の対象線分が特定される場合、プロセッサ811は、特定の条件を満たす対象線分(例えば、最長の対象線分)に従って、傾き補正を行ってよい。また、プロセッサ811は、対象線分を用いて対象画像内のオブジェクト領域を特定する処理を、行ってよい。
(7)読取部900の構成は、図1の構成に代えて、他の種々の構成であってよい。例えば、読取部900は、イメージセンサ920に対してシートを搬送する搬送装置を備えてよい。そして、イメージセンサ920は、移動せずに、搬送装置によって搬送されるシートを読み取ることによって、シートの全体を読み取ってよい。
(8)対象画像から対象線分を特定する画像処理装置は、複合機800の制御部810に代えて、他の種々の装置であってよい。例えば、読取部900は、画像処理装置に接続可能な外部装置であってよい。このように画像処理装置は、いわゆる複合機とは異なる種類の装置であってよい(例えば、パーソナルコンピュータ、タブレットコンピュータ、スマートフォンなど)。また、対象画像データは、シートを読み取る読取部によって生成されたデータに代えて、デジタルカメラによって生成されたデータを用いて、取得されてよい。また、読取部900やデジタルカメラのように対象物を光学的に読み取る装置によって生成されるデータに代えて、他の任意のデータを用いて、対象画像データが取得されてよい。例えば、画像編集アプリケーションプログラムによって生成された画像データが、対象画像データとして利用されてよい。
上記各実施例において、ハードウェアによって実現されていた構成の一部をソフトウェアに置き換えるようにしてもよく、逆に、ソフトウェアによって実現されていた構成の一部あるいは全部をハードウェアに置き換えるようにしてもよい。例えば、図4のS210の機能は、専用のハードウェア回路によって実現してもよい。
また、本発明の機能の一部または全部がコンピュータプログラムで実現される場合には、そのプログラムは、コンピュータ読み取り可能な記録媒体(例えば、一時的ではない記録媒体)に格納された形で提供することができる。プログラムは、提供時と同一または異なる記録媒体(コンピュータ読み取り可能な記録媒体)に格納された状態で、使用され得る。「コンピュータ読み取り可能な記録媒体」は、メモリーカードやCD-ROMのような携帯型の記録媒体に限らず、各種ROM等のコンピュータ内の内部記憶装置や、ハードディスクドライブ等のコンピュータに接続されている外部記憶装置も含み得る。
以上、実施例、変形例に基づき本発明について説明してきたが、上記した発明の実施の形態は、本発明の理解を容易にするためのものであり、本発明を限定するものではない。本発明は、その趣旨を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物が含まれる。