package Ġcom . kj ipo . experiments Ċ Ċ import Ġcom . kj ipo . prototype . Angle Line Ċ import Ġcom . kj ipo . raster . Encoding Utilities Ċ import Ġcom . kj ipo . raster . match . Match Distance Ċ import Ġcom . kj ipo . representation . raster . FlowDirection Ċ import Ġcom . kj ipo . segmentation . Matrix Ċ import Ġcom . kj ipo . segmentation . fit Line Pro totypes Ċ import Ġcom . kj ipo . segmentation . shrink Image Ċ import Ġcom . kj ipo . skeleton . transform Arrays To Matrix Ċ import Ġcom . kj ipo . skeleton . transform To Boolean Arrays Ċ import Ġcom . kj ipo . visualization . display Colour Matrix Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjava . io . File Ċ import Ġjavax . image io . Image IO Ċ import Ġkotlin . math . absolute Value ĊĊ Ċ private Ġobject ĠMerge Line Segments Experiment Ġ{ ĊĊĊĠĠĠ Ġfun Ġmerge Segments () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġencoded K an ji Ġ= Ġload Encoded K an ji ( Paths . get (" kan ji _ output 8 / 2 6 6 8 1 . dat ")) Ċ // ĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġtransform Arrays To Matrix ( encoded K an ji . image ) ĊĊĠĠĠĠĠĠĠ Ġval Ġread Image Ġ= ĠImage IO . read ( File (" test 2 . png ")) ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠMatrix ( read Image . height , Ġread Image . width , Ġ{ Ġrow , Ġcolumn Ġ-> Ġfalse Ġ}) ĊĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġread Image . height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( column Ġin Ġ 0 Ġuntil Ġread Image . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Image . get RGB ( column , Ġrow ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage [ row , Ġcolumn ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshrink Image Ġ= Ġshrink Image ( image , Ġ 6 4 , Ġ 6 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġline Pro totypes Ġ= Ġfit Line Pro totypes ( shrink Image ) ĊĠĠĠĠĠĠĠ Ġval Ġdistance Matrix Ġ= Ġtransform Arrays To Matrix ( Match Distance . compute Distance Map ( transform To Boolean Arrays ( shrink Image ))) Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġsorted Pro totypes Ġ= Ġline Pro totypes . sorted By Ġ{ Ġit . length Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġline Matrix Ġ= ĠMatrix ( shrink Image . numberOf Rows , Ġshrink Image . numberOf Columns , Ġ{ Ġrow , Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcounter 2 Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġline Pro totypes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . segments . flatMap Ġ{ Ġit . pairs Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . row Ġ>= Ġ 0 Ġ&& Ġit . row Ġ< Ġshrink Image . numberOf Rows Ġ&& Ġit . column Ġ>= Ġ 0 Ġ&& Ġit . column Ġ< Ġshrink Image . numberOf Columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Matrix [ it . row , Ġit . column ]. add ( counter 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ counter 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Line Pro totypes Ġ= Ġline Pro totypes . map Ġ{ ĠAngle Line ( it ) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġval Ġlines ToRemove Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġexpanded Lines Ġ= Ġmutable Set Of < Int >() ĊĊĊĠĠĠĠĠĠĠ Ġupdated Line Pro totypes . forEach Indexed Ġ{ Ġindex , Ġline Ġ-> Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . length Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Pair Ne ighbours Ġ= Ġmutable Set Of < Int >() Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġline Matrix [ line . start Pair . row , Ġline . start Pair . column ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow Direction . values (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Encoding Utilities . valid Cell ( line . start Pair . row , Ġline . start Pair . column , Ġit , Ġshrink Image . numberOf Rows , Ġshrink Image . numberOf Columns )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour Row Ġ= Ġline . start Pair . row Ġ+ Ġit . row Shift ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour Column Ġ= Ġline . start Pair . column Ġ+ Ġit . column Shift ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour Cell Ġ= Ġline Matrix [ ne ighbour Row , Ġneighbour Column ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Pair Ne ighbours . addAll ( ne ighbour Cell ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneighbour Cell . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ!= Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( // Ġ! expanded Lines . contains ( it ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! lines ToRemove . contains ( it )) Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( updated Line Pro totypes [ it ]. start Pair . row Ġ== Ġneighbour Row Ġ&& Ġupdated Line Pro totypes [ it ]. start Pair . column Ġ== Ġneighbour Column ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( merge Lines ( line , Ġupdated Line Pro totypes [ it ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Mer ging : Ġ${ line } Ġand Ġ${ updated Line Pro totypes [ it ]} ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Line Pro totypes [ it ]. start Pair Ġ= Ġcom . kj ipo . raster . segment . Pair ( line . start Pair . row , Ġline . start Pair . column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines ToRemove . add ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Lines . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneighbour Description Ġ= Ġstart Pair Ne ighbours . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . toString () Ġ+ "," Ġ+ line Pro totypes [ it ]. start Pair Ġ+ "," Ġ+ line Pro totypes [ it ]. length Ġ+ "," Ġ+ line Pro totypes [ it ]. angle Ġ+ ". Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Start Ġpair : Ġ${ line . start Pair }. ĠLength : Ġ${ line . length }. ĠAngle : Ġ${ line . angle }. ĠNe ighbours : Ġ${ ne ighbour Description }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġupdated And Filtered Pro totypes Ġ= Ġupdated Line Pro totypes . filter Indexed Ġ{ index , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! lines ToRemove . contains ( index ) ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĊĊĠĠĠĠĠĠĠ Ġvar ĠmaxValue Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġdistance Matrix . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ> ĠmaxValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠĠĠĠĠ Ġval Ġdisp Image Ġ= ĠMatrix ( shrink Image . numberOf Rows , Ġshrink Image . numberOf Columns , Ġ{ Ġrow , Ġcolumn Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġdistance Matrix [ row , Ġcolumn ] Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠColor . hs b ( distance . toDouble (). div ( max Value ). times ( 3 6 0 ), Ġ 0 . 5 , Ġ 0 . 2 ) Ċ // ĠĠĠĠĠĠĠ Ġ}) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠ Ġline Pro totypes . forEach Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġit . segments . flatMap Ġ{ Ġit . pairs Ġ}. forEach Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . row Ġ>= Ġ 0 Ġ&& Ġit . row Ġ< Ġdisp Image . numberOf Rows Ġ&& Ġit . column Ġ>= Ġ 0 Ġ&& Ġit . column Ġ< Ġdisp Image . numberOf Columns ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disp Image [ it . row , Ġit . column ]. brightness Ġ== Ġ 1 . 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisp Image [ it . row , Ġit . column ] Ġ= ĠColor . WHITE Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisp Image [ it . row , Ġit . column ] Ġ= ĠColor . hs b ( counter . toDouble (). div ( line Pro totypes . size ). times ( 3 6 0 ), Ġ 1 . 0 , Ġ 1 . 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ++ counter Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprintln (" Number Ġof Ġlines : Ġ${ updated And Filtered Pro totypes . size }") ĊĊĠĠĠĠĠĠĠ Ġdisplay Colour Matrix ( create Colour Image ( updated And Filtered Pro totypes , Ġdistance Matrix , ĠmaxValue ), Ġ 1 0 ) ĊĊĊ Ċ // ĠĠĠĠĠĠĠ Ġdisplay Colour Matrix ( create Colour Image ( line Pro totypes , Ġdistance Matrix , ĠmaxValue ), Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġmerge Lines ( line 1 : ĠAngle Line , Ġline 2 : ĠAngle Line ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline 1 End Pair Ġ= Ġline 1 . end Pair ĊĠĠĠĠĠĠĠ Ġval Ġline 2 Start Pair Ġ= Ġline 2 . start Pair ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġline 1 End Pair . row . minus ( line 2 Start Pair . row ). absolute Value Ġ+ Ġline 1 End Pair . column . minus ( line 2 Start Pair . column ). absolute Value ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdistance Ġ<= Ġ 2 Ġ&& Ġline 1 . angle . minus ( line 2 . angle ). absolute Value Ġ< ĠMath . PI Ġ/ Ġ 8 ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Colour Image ( line Pro totypes : List < Angle Line >, Ġdistance Matrix : Matrix < Int >, Ġmax Distance : Int ): ĠMatrix < Color > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisp Image Ġ= ĠMatrix ( distance Matrix . numberOf Rows , Ġdistance Matrix . numberOf Columns , Ġ{ Ġrow , Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġdistance Matrix [ row , Ġcolumn ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor . hs b ( distance . toDouble (). div ( max Distance ). times ( 3 6 0 ), Ġ 0 . 5 , Ġ 0 . 2 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcounter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġline Pro totypes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . segments . flatMap Ġ{ Ġit . pairs Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . row Ġ>= Ġ 0 Ġ&& Ġit . row Ġ< Ġdisp Image . numberOf Rows Ġ&& Ġit . column Ġ>= Ġ 0 Ġ&& Ġit . column Ġ< Ġdisp Image . numberOf Columns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disp Image [ it . row , Ġit . column ]. brightness Ġ== Ġ 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisp Image [ it . row , Ġit . column ] Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisp Image [ it . row , Ġit . column ] Ġ= ĠColor . hs b ( counter . toDouble (). div ( line Pro totypes . size ). times ( 3 6 0 ), Ġ 1 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ counter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdisp Image ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmerge Segments () ĊĊĠĠĠ Ġ} ĊĊ Ċ }