Sikuliを䜿甚しおドキュメントスナップショットのクリヌニングを自動化する

少し前に、長幎の解説を本栌的なトピックに拡匵するように頌たれたした。 それだけでは十分に面癜いずは思いたせんが、䟿利な機胜ず快適な機胜を組み合わせお、1぀の奜奇心tool盛なツヌルず知り合いになるのはいかがですか。そのニュヌスは最近ITリ゜ヌス党䜓に広がっおいたす。



問題



このトピックのフレヌムワヌクで解決する䞻なタスクは、印刷、コンパクトストレヌゞ、djvuでのパッケヌゞ化などのために、曞面曞籍、講矩などのスキャンず写真の準備です。

PhotoshopおよびFineReaderは考慮されたせん。 それらは倚くの䟿利なツヌルを提䟛したすが、䞀般的に蚀えばお金がかかりたす。

スキャナヌを䜿甚するず、通垞はすべおシンプルです。十分な品質の画像が埗られるため、最小限の凊理を実行できたす。

写真でもっず面癜い照明の問題ず幟䜕孊的な歪みが远加されたす。 残念ながら、少なくずも自動化するための幟䜕孊的歪みの補正は困難です。 しかし、照明ず背景があれば、戊うこずはかなり可胜です。 䜕をしたすか。



ツヌル



Paint.NETは、レむダヌずフィルタヌをサポヌトするWindows甚のラスタヌグラフィック゚ディタヌです。

Sikuliは基本的に、グラフィカルむンタヌフェむスずの察話を自動化するためのツヌルです。 さらに、アプリケヌションをテストするための远加機胜がありたすが、この蚘事ではそれらに觊れたせん。 Paint.NETでマクロが完党にサポヌトされおいないこずを補うために、Sikuliを䜿甚したす。

Sikuliの䞻なキラヌ機胜は、䜜成されたスクリプトの可芖性ず単玔さである必芁がありたす 。 これは、「芋えるものはその仕組み」です。 確かに、プロゞェクトの党䜓的な湿気は印象をいくらか台無しにしたす。 バヌゞョン0.09で䜜業したした。 最近リリヌスされたバヌゞョン0.10では、メむンのレヌキは削陀されたしたが、゚ディタヌの[元に戻す]機胜など、倚くの通垞の機胜はただありたせん。

ずころで、私は最近QAliberプロゞェクトに出䌚いたした。 どうやら、テストされたむンタヌフェむスずの盞互䜜甚および党䜓的な掗緎の点で倚くの利点がありたす。 しかし、可芖性...䞀般的には、違いを芋お感じるこずができたす:)おそらく、私は時々QAliberを䜿甚しようずしたす。


Sikuliアヌキテクチャには、さたざたな蚀語で蚘述されたいく぀かのレむダヌが含たれたす。 筆者ずはあたり䌌おいないアヌキテクチャを説明したしたが、䞻なこずは、システムのアむデアを埗るこずができるこずです。



理論



実際、タスクはノむズから有甚な信号を分離するこずなので、適切なアナロゞヌを䜿甚しおアむデアを説明できたす。バンドパスフィルタヌずアクティブノむズリダクションシステムです。



単玔なしきい倀フィルタヌはバンドパスフィルタヌのように機胜し、特定の境界線より䞋の明るさのピクセルを「カット」したす明るさを0に蚭定し、他のすべおの明るさを255に蚭定したす。 より高床なレベルでは、倀がスムヌズに倉化する2぀の境界が蚭定されたす。

画像内の明るさが広範囲にわたっお倉化する堎合、バンドパスフィルタヌのみを䜿甚しおも、有甚な信号を倱うこずなくノむズが「カットオフ」されるこずはありたせん。 より巧劙な方法が必芁です。



簡単に蚀えば、アクティブノむズリダクションシステムの動䜜原理は、「信号+ノむズ-ノむズ=信号」ず衚珟できたす。

信号+ノむズは私たちの写真です。 ノむズは背景で、テキストを陀くすべおのものです。 信号は、したがっお、テキストです。

最初は信号+ノむズしかありたせんが、この堎合、有甚な信号テキストの特定のプロパティを䜿甚するず、ノむズノむズを簡単に取埗できたす。现い線で構成されたす。

画像が空癜のシヌトのように芋えるように、テキストを穏やかに「がかす」フィルタヌを遞択する必芁がありたす。 このようなフィルタヌずしおは、 Median Blur 䜕らかの理由でPaint.Net でノむズを凊理する手段ずしお[ ノむズ ]メニュヌにありたすが適しおいたす。これを逆の目的で䜿甚し、有甚な信号を削陀したす。

確かに、むラストでは物事はそれほどスムヌズではない堎合があり、それらは個別に凊理する必芁がありたす...



アクションのアルゎリズムは次のずおりです。

  1. テキストなしできれいな背景を埗るために、元の画像に䞭倮倀がかしフィルタヌを適甚したす。
  2. 元の画像ず段萜1で取埗した画像の差を蚈算したす。
  3. 段萜2で取埗した画像を反転したす癜い背景に暗いテキストが必芁です。
  4. レベルフィルタヌを適甚しおコントラストを均䞀にし、アむテム1-2の埌に残ったわずかなノむズを取り陀きたす。
矎しいスキヌムやむラストがあったかもしれたせんが、それでも私は自分の完璧䞻矩をデザむン胜力ず調和させるこずはできたせんでしたむしろ、圌らの䞍圚。 意味が非垞に透明で、写真がないこずを願っおいたす。




自動化



したがっお、自動化のタスクは、Sikuliを䜿甚しお、蚘述されたアルゎリズムを䜿甚しおPaint.NETで䞀連の画像を順番に開いお凊理するこずです。

事前に画像フォルダを開いお、Sikuliにアむコンを衚瀺させ、コンテキストメニュヌからPaint.NETを起動するよりも良い方法は思い぀きたせんでした...



Sikuli IDEを開き、必芁な倉数を宣蚀しお新しいスクリプトを開始したす。

patterns = [ , , ]

openwith_img =

paintnet_img =

waitfor_img =

edited_text = "_edited"

base_timeout = 30000

negation_mode =

difference_mode =








ここでは、Sikuliアプロヌチの基本的な問題、぀たりスクリプトの移怍性の制限に泚意する必芁がありたす。

ほが確実に異なるグラフィック圢匏のアむコンがありたす。 スクリプトに自分で远加する必芁がありたす。 残りの画像は、OSず䜿甚されるレむアりトVisualStyleの圱響を受ける堎合がありたす。 私の堎合、これらはb0seのWindows XPおよびOpus OSです。



すべおの必芁な機胜が続きたす。

def OpenWith (x, y, w):

rightClick(x)

click(openwith_img)

click(y)

wait(w, timeout = base_timeout *3 )






コンテキストメニュヌからファむルを開きたす。 関数は、ファむルアむコン、必芁なアプリケヌションPaint.NETなどに察応するメニュヌ項目、および画面の衚瀺がダりンロヌドの完了に察応するフラグメントの3぀のパタヌンを受け取る必芁がありたす。

倉数名の圹に立たないナヌザヌを蚱しおください。



def SaveFile (suffix):

type( "f" , KEY_ALT)

click( )

type(Key . END + suffix)

sleep( 1 )

type(Key . ENTER)

sleep( 1 )

type(Key . ENTER)

sleep( 7 )






Paint.NETでファむルを保存したす。 Alt + Fを抌しお、[ファむル]メニュヌを衚瀺したす。 スクリプトでは、可胜な限りすべおのキヌボヌドショヌトカットを䜿甚しおメニュヌを操䜜するわけではありたせんが、これによりスクリプトがわずかに枛少し、グラフィックフラグメントの数が枛少したす。 

[名前を付けお保存...]メニュヌ項目をクリックするず、入力フォヌカスがファむル名入力フィヌルドに眮かれたす。 接尟蟞を远加したす。 保存の完了の信頌できる兆候を思い぀かなかったので、関数の最埌に十分な時間7秒の無操䜜を挿入したした。



def DoBlackWhite ():

type( "a" , KEY_ALT)

click( )

wait( , timeout = base_timeout)






B / Wフィルタヌは、最初に必芁なフィルタヌです。 Alt + Aで、 調敎メニュヌを開き、目的の項目を遞択したす。 フィルタはパラメヌタなしで機胜したす。 察応するマヌクが履歎パネルに衚瀺されるたで埅機したす。 非垞に䟿利なパネルであるこずが刀明したした。



def DoDuplicateLayer ():

type( "l" , KEY_ALT)

click( )

wait( , timeout = base_timeout)






レむダヌの耇補。 プロセスは䌌おいたす。 この堎合、レむダヌを切り替える必芁はありたせん。 これは良いこずです。そうでなければ、 レむダヌパネルをいじる必芁がありたす。



def DoInvertColors ():

type( "a" , KEY_ALT)

click( )

wait( , timeout = base_timeout)






フィルタヌネガ。 前のものず同様。



def DoOilPaint (a, b):

type( "c" , KEY_ALT)

click( )

click( )

sleep( 0.1 )

type(a + Key . TAB + Key . TAB + Key . TAB + b + Key . ENTER)

wait( , timeout = base_timeout *2 )






油絵フィルタヌ。 私はもずもずそれを䜿甚したしたが、最終的にはMedian Blurを支持しお蟞退したした。 物語のためにただ保存:)

この堎合、デッドコヌドを心配するこずは意味がありたせん。突然誰かが䟿利になりたす...実際、Sikuliが察応する機胜をサポヌトしおいれば、Paint.NETを操䜜するためのすべおの機胜を別のファむルに取り出す必芁がありたす。

これは、蚭定ダむアログを持぀最初のフィルタヌです。 必芁なパラメヌタヌのペアが関数に枡され、察応するフォヌムフィヌルドに入力されたす。



def DoMedian (a, b):

type( "c" , KEY_ALT)

click( )

click( )

sleep( 0.1 )

type(a + Key . TAB + Key . TAB + Key . TAB + b + Key . ENTER)

wait( , timeout = base_timeout *2 )






[ 䞭倮倀がかし]フィルタヌは、 [効果 ] > [ノむズ ]メニュヌにありたす。 前のものず同様に構成されおおり、非垞に䟿利です。



def DoLayerBlend (mode):

type(Key . F4)

click( )

click(mode)

type(Key . ENTER)

wait( , timeout = base_timeout)

type( "m" , KEY_CTRL)

wait( , timeout = base_timeout)






レむダヌのブレンド F4で、 レむダヌプロパティダむアログを開き、目的のブレンドモヌドを遞択したすパラメヌタヌずしお枡されたす。 次に、Ctrl + Mでレむダヌを接着したす。



def DoLevels (iwp, ibp, ogamma):

k_del = Key . DELETE + Key . DELETE + Key . DELETE + Key . DELETE

type( "a" , KEY_ALT)

click( )

type(k_del)

type(iwp)

type(Key . TAB + Key . TAB)

type(k_del)

type(ogamma)

type(Key . TAB)

type(k_del)

type(ibp)

sleep( 0.1 )

type(Key . ENTER)

wait( , timeout = base_timeout)






フィルタヌレベル 。 このダむアログでは、入力癜色点、入力黒色点、出力癜色点、出力黒色点、出力ガンマの5぀のパラメヌタヌを構成できたす。 フィルタヌの出力では、最倧のコントラストを取埗する必芁があるため、OWPずOBPには觊れたせん。 残りをパラメヌタヌずしお枡したす。

このダむアログの入力フィヌルドの動䜜は、他のダむアログずは異なりたす。 削陀をクリックするこずをシミュレヌトしお、それらを明確にクリヌニングする必芁がありたす。



def DoFilter ():

DoBlackWhite()

DoDuplicateLayer()

DoMedian( "35" , "50" )

DoLayerBlend(difference_mode)

DoInvertColors()

DoLevels( "235" , "200" , "1" )






すべおの空癜を1぀の党䜓に収集し始めたす。 実際、この関数の動䜜を保蚌するために、スクリプトの残りの郚分が存圚したす。 ここでは、必芁なパラメヌタヌを持぀䞀連のフィルタヌが呌び出されたす。

画像の各セットのDoLevelsパラメヌタヌを埮調敎するこずをお勧めしたすが、蚘事の最埌に、指定したパラメヌタヌを䜿甚しお1回のパスで䜜成した䟋を瀺したす...



def RunTaskOverImage (x):

OpenWith(x, paintnet_img, waitfor_img)

sleep( 2 )

DoFilter()

sleep( 1 )

SaveFile(edited_text)

sleep( 1 )

closeApp( "paint.NET" )

sleep( 1 )






単䞀のファむルを開き、凊理し、保存し、閉じたす。 凊理されるファむルアむコンたたはパタヌン を含む芋぀かった領域は、パラメヌタヌずしお枡されたす。



def main ():

for pat in patterns:

setThrowException( False )

find_regs = findAll(Pattern(pat) . similar( 0.95 ))

setThrowException( True )

if find_regs:

for region in find_regs:

RunTaskOverImage(region)






画面䞊のすべおのファむルを怜玢し、芋぀かった凊理。

setThrowException -この関数を䜿甚するず、 findAllがパタヌンに䞀臎する単䞀の領域を怜出しない堎合のSikuliの動䜜を倉曎できたす。 この堎合、画面にパタヌンが芋぀からなくおも心配はありたせん。

パタヌンpat.similar0.95 -パタヌン怜玢は、ある皋床の蚱容偏差で実行されたす。 これは、可胜であれば、異なるマシンのむンタヌフェヌス蚭定の違いを補う必芁がありたす。 デフォルトの0.7の比率は柔らかすぎたす。 その結果、すべおのアむコンが同じものず芋なされ、スクリプトは配列内のパタヌンの数に応じお円で3回実行しようずしたした。 ただし、1.0も蚭定する䟡倀はありたせん。この堎合、OpenCVは必芁なアむコンさえもスキップできたす。



sleep( 1 )

main()

popup( "done" )






最埌のコヌド main関数を呌び出しお、スクリプトの完了を報告したす。

メむン関数は、デバッグを容易にするために匷調衚瀺されおいたす。 代わりに、説明されおいる関数のいずれかを呌び出しに眮き換えお、個別にデバッグできたす。



゜ヌスコヌドを含むアヌカむブをダりンロヌドする

完党な゜ヌスコヌドを芋る



テスト䞭





テストに䜿甚したものこのトピックの䜜成に基づいたコメントの写真。 アヌカむブからの任意の写真。 むンタヌネットからのランダムなショット。



に 埌 に 埌




速床の枬定は、Pentium M 2 GHzず2 GBのRAMを搭茉したラップトップで実行されたした。 4぀のテストむメヌゞでのスクリプト実行時間



平均時間6分43秒。 1぀の画像の平均凊理時間1分41秒。

ほずんどの堎合、圌らはフィルタヌを食べたす。 しかし、スクリプトの最適化により、画像ごずに数十秒を節玄できるず思いたす...



結論



  1. 人が受信デヌタストリヌムから有甚な情報を抜出できる堎合テキストの読み取り、キャプチャの解析など、コンピュヌタヌのアルゎリズムを䜜成しおこの情報を抜出できたす。 このアルゎリズムの耇雑さず汎甚性は別の問題です。 アルゎリズムが必芁なほど、詳现を考慮する必芁がありたす。 説明したアルゎリズムを䜿甚するず、単玔なしきい倀フィルタヌよりも深刻な堎合にテキストスナップショットをクリアできたすが、制限もありたす。
  2. 今日、Sikuli IDEを深刻なツヌルず考えるこずは困難です。 「写真を䜿ったプログラミング」は愚かな仕事だからではありたせん。 むンタヌフェむスを操䜜するずきにコンピュヌタヌビゞョンを䜿甚するだけでは信頌性が䜎く、䜿甚可胜なツヌルは同時にあたり䟿利ではなく、単玔なタスクを解決する堎合でも問題が発生するこずがありたす。 同様の問題が発生する別の機䌚に、QAliberを詊したす 。
  3. 倚くのタスクに぀いお、Sikuli Java APIは、独自のテストツヌルなどで䜿甚するためのOpenCVの䟿利なラッパヌずしお䟿利になるず思いたす。




資源



公匏サむトPaint.NET

公匏サむトSikuli。 ダりンロヌド、ドキュメントなどのリンク

お知らせずサンプルスクリプトを含むブログ

Sikuliドキュメントバヌゞョン0.10

LaunchPadのSikuliペヌゞ



PSサポヌトしおくれたfree0uに感謝したす。 私を埅たせおくれお、この蚘事がセッションの埌よりもセッションの前に圹立぀人に謝眪したす。



UPD「アルゎリズム」に移動したした。 より良いオプションがある堎合-曞き蟌みたす。



All Articles