Skip to main content
このセクションでは、低品質の画像上の日付フィールドを検索する FlexiLayout を作成する、代表的ないくつかの方法について説明します。このような画像は非常によく見られ、多くの場合、不適切なスキャン設定に起因するさまざまなスキャン不良を含んでいます。たとえば、明るさの設定が適切でないと、画像が明るすぎたり暗すぎたりすることがあります。その結果、画像内の一部の情報が失われたり、画像の一部にノイズが生じたりすることがあります。

Date 要素で日付を検出できない場合

FlexiLayout Studio には、日付を検出するための特別な Date 要素があります。ただし、FlexiLayout を作成する際に、この要素だけでは不十分な場合があります。これは、ドキュメント上の日付が Date 要素で使用可能なフォーマットのいずれにも一致しない場合に起こります。 たとえば、FlexiLayout Studio では、日付フィールド内の月を指定する際に、次の言語を使用できます: English、Czech、Danish、Dutch、Estonian、Finnish、French、German、Greek、Hungarian、Italian、Latvian、Lithuanian、Norwegian、Polish、Portuguese、Russian、Spanish、Swedish、Turkish。 月が一覧にない言語で単語として記載されている場合、その日付は使用可能なフォーマットのいずれにも該当しないため、Date 要素では検出できません。 また、画像に除去できない要素がある場合にも、日付検索エラーが発生することがあります。たとえば、日付に下線が引かれていて日付と下線の間に目に見える隙間がない場合、取り消し線が引かれている場合、または黒い区切り線 (フレーム、コーム) 付きの character cells に記入されている場合です。 さらに、検索領域内の斑点ノイズや、日付がタイプ入力ではなく手書きで記入されていることも、日付検索に Date 要素を使用できない原因になります。

SearchOfDate.fsp sample プロジェクト

日付フィールドを検索する方法については、sample プロジェクト SearchOfDate.fsp (フォルダー %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Date) で詳しく説明されています。 このプロジェクトには 5 つのページがあります。 目的は、Date 要素でサポートされていない日付フォーマットの画像も含め、すべての画像から日付を見つけることです。

Date 要素でサポートされている日付フォーマットを検索する

日付フィールドを記述するすべての要素は、DateGroup 要素にまとめられています。まず、このグループには日付フィールドの名前を検索する要素があります。sample プロジェクトでは、これは DateHeader という名前の Static Text 型の要素で、唯一の値は Date: です。
Relations セクションですべての要素の検索条件を設定するのは難しくないため、ここでは説明しません。詳細はプロジェクト内で直接確認できます。
このグループには、DateField という名前の Date 要素も含まれています。この要素は、Date 要素でサポートされているフォーマットの日付フィールドを検索します。 プロジェクトを見ると、Date 要素で日付を検出できるのは最初のページだけです。

Character String 要素を使用して別の日付フォーマットを検索する

他のページ上の日付を検索するために、このプロジェクトでは DateAsString という名前の Character String 要素を使用します。この要素では、画像に現れる可能性が高いすべての文字を表すためにアルファベットを使用します。
データfield内の内容が構造化されていて、Date 要素でサポートされていないフォーマットを持つ場合は、アルファベットを指定する代わりに、正規表現でそのフォーマットを記述することをお勧めします。ただし、正規表現では field と記述された構造が 100% 一致していることが前提となるため、処理対象の画像の品質が高いことを確実に把握しておく必要があります (これに対してアルファベットでは、要素のプロパティで指定した一定割合のエラーを許容できます) 。したがって、認識精度を保証できない場合は、アルファベットの方がより柔軟な手段です。日付内の月が 事前認識 言語と同じ言語の単語で記載されることがわかっている場合は、日付フィールドを 3 つのセクション (日、月、年度) に分け、Static Text 型の要素を使用して月の field を個別に検索することをお勧めします。このような Static Text 要素では、月の考えられるすべての表記バリエーション (たとえば、その言語における月の正式名称と省略形) を記述する必要があります。その後、日と年度の fields は、Character String 要素を使って月の右側と左側から見つけることができます。
DateAsString Character String 要素で許可される文字を指定するために ABBYY FlexiLayout Studio で使用されるアルファベットエディターのスクリーンショット。
FlexiLayout matching を最適化するために、DateAsString 要素の Advanced pre-search relations field には次の条件が設定されています。
次と同じです:
この条件は、Date 要素で日付を検出できない場合にのみ、文字列として日付を検索することを意味します。 プロジェクトが示すように、DateAsString 要素は、Date 要素では検出できなかった残りのプロジェクトページ上の日付を見つけます。

Object Collection 要素で部分的に認識された日付を抽出する

ただし、4 ページ目では、検出された文字列には日付フィールドの一部しか含まれていません。日付フィールドの事前認識結果を確認すると (ツールバーの Show Raw Objects をクリック) 、部分的にしか検出されなかった理由が明らかになります。検索領域には text objects だけでなく、Picture や Punctuation mark など、ほかの型のオブジェクトも含まれています。 このような状況は低品質の画像ではよく見られ、事前認識の段階で text objects が常に認識されるとは限りません。
ABBYY FlexiLayout Studio における事前認識の生オブジェクトのスクリーンショット。日付フィールドの検索領域に text、picture、punctuation mark のオブジェクトが含まれていることを示しています。
日付フィールドに関連するすべてのオブジェクトを見つけるため、このプロジェクトでは DateAsObjectCollection という名前の Object Collection 要素を使用します。事前認識中に日付フィールドで検出されたすべてのオブジェクト型を、その要素のプロパティで指定します。 FlexiLayout のマッチングを最適化するため、DateAsObjectCollection 要素と DateAsString 要素の Advanced pre-search relations field には、次の条件が指定されています。
条件 if (DateAsString.IsNull == FALSE) then Dontfind() は、DateAsObjectCollection 要素の Advanced properties には追加できません。これは、例が示すように、検出された文字列に日付の一部しか含まれない場合があるためです。

AlternativeDateGroup から Date ブロックの領域を定義する

この段階で、日付フィールドの検索条件を記述する要素セットは完成しています。DateFieldDateAsStringDateAsObjectCollection の各要素で構成される Group 要素 SearchElements.DateGroup.AlternativeDateGroup は、プロジェクトツリーで Date ブロックのソース要素として指定されています。 DateAsString 要素と DateAsObjectCollection 要素のプロパティを記述するために Dontfind() メソッドが使用されているため、検出されたブロックの実際の領域は、Date 要素の 仮説 によって見つかった領域か、DateAsObjectCollection 要素と DateAsString 要素の領域を結合したものの、いずれかに一致します。 後者の場合、DateAsString 要素の領域は DateAsObjectCollection 要素の領域の一部であることが想定されるため、結果の領域は DateAsObjectCollection 要素の領域になります。
この場合は状況が比較的単純なので、Group 要素 SearchElements.DateGroup.AlternativeDateGroup をソース要素として指定できます。グループの領域は、検出されたサブ要素の領域を組み合わせたものになります。Dontfind() メソッドを使用すると、一部のサブ要素の検索を省略できます。そのため、Group 要素 SearchElements.DateGroup.AlternativeDateGroup の領域は、そのサブ要素の領域に一致します。ここで示した例では、Dontfind() メソッドは FlexiLayout matching の最適化に役立つだけでなく、ブロックの記述も簡潔にします。
または、Expression セクションで次のコードを使用できます。
Expression を使用すると、利用できるオプションが増えます。たとえば、DateAsString 要素の region が、実際に DateAsObjectCollection の region の一部であるかどうかを確認できます。
SearchOfDate.fsp Project の AlternativeDateGroup 要素から Date ブロックの出力 region を定義する FlexiLayout language コードを示した、ABBYY FlexiLayout Studio の Expression セクションのスクリーンショット。
文字列形式を定義せず、またこの例のように Object Collection 要素も使用しないで日付フィールドを探すために Character String 要素を使用した場合でも、日付フィールドの 検索領域 を明確に定義できれば、良好な結果が得られることがあります。ただし、検索領域 内に複数の文字列がある場合は、正規表現 またはより限定的なアルファベットを使って文字列形式を記述する必要があります。そうしないと、最終的な仮説が期待どおりにならない可能性があります。Character String 要素では、誤った仮説を除外するために、文字列内の文字数、単語末尾の数、スペースの長さを制限できます。Object Collection 要素を使用する場合、仮説には、画像上で 検索領域 内にあり、object サイズの制約を満たすすべての objects が含まれます。