\documentclass[a4paper,10pt]{jarticle}

\topmargin -5mm
\oddsidemargin 5mm
\textheight 220mm
\textwidth 150mm

\pagestyle{plain}

%%%%%%    TEXT START    %%%%%%
\begin{document}
\begin{center}
{\Large Skeletonization for 2D binary data by curvature.}\\
\end{center}
{\bfseries program} Skeletonization by curvature;\\
{\bfseries INPUT : }x\_size $\times $ y\_size binary data. (* data format : PGM file *)\\
{\bfseries OUTPUT : }" OUTNAME***.pgm " (* skeleton data. *)\\
\hspace{2cm} " OUTNAME\_curve***.pgm " (* boundary data with curvature code. *)\\
\hspace{2cm} " error.txt " (* error coordinate. *)\\
\\
1: {\bfseries type}\\
2: \hspace{0.5cm}STRUCTURE = record\\
3: \hspace{1cm}sign : integer;\\
4: \hspace{1cm}x\_coordinate : integer;\\
5: \hspace{1cm}y\_coordinate : integer;\\
6: \hspace{0.5cm}end;\\
\\
7: {\bfseries var} curve\_sequence : {\bfseries array}["number of boundary pixels"] of STRUCTURE;\\
8: {\bfseries var} i,j,k,hole\_num:integer;\\
9: {\bfseries var} hole\_x,hole\_y:{\bfseries array}[1.."number of holes"] {\bfseries of} integer;\\
(* hole\_num: number of holes,hole\_x,hole\_y:coordinate of each holes *)\\
(* It is nessesary to set these hole datas before process. *)\\
10: {\bfseries var} data,move,leave,watch,data\_bin:{\bfseries array}[1..x\_size][1..y\_size] {\bfseries of} unsigned char;\\
(* data:Input data, move:moved data, leave:left data , watch:reference ,data\_bin:binarized Input data*)\\
11: {\bfseries var} curv\_data:{\bfseries array}[1..x\_size][1..y\_size] {\bfseries of} integer;\\
(* curv\_data:for curvature *)\\
\\
12: {\bfseries begin}\\
13: \hspace{0.5cm}data[x][y] := "Input 2D Data";\\
14: \hspace{0.5cm}leave\_pix(data,leave);\\
15: \hspace{0.5cm}{\bfseries while} "there are one-pixel thickness components." {\bfseries do}\\
16 :\hspace{1cm}{\bfseries begin}\\
17: \hspace{1.5cm}cut(data);\\
18: \hspace{1cm}{\bfseries end;}\\
19: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x\_size {\bfseries do}\\
20: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y\_size {\bfseries do}\\
21: \hspace{1.5cm}data\_bin[i][j] := "binarized data[i][j]";\\
22: \hspace{0.5cm}curv\_cul(data\_bin,curv\_data);\\
23: \hspace{0.5cm}curv\_num(data\_bin,curv\_data);\\
24: \hspace{0.5cm}{\bfseries if} "there are holes." {\bfseries then}\\
25: \hspace{1cm}{\bfseries for} k := 1 {\bfseries to} hole\_num {\bfseries do}\\
26: \hspace{1.5cm}{\bfseries for} i := hole\_x[k] {\bfseries to} x\_size {\bfseries do}\\
27: \hspace{2cm}{\bfseries for} j := hole\_y[k] {\bfseries to} y\_size {\bfseries do}\\
28: \hspace{2.5cm}{\bfseries if} data\_bin[i][j] = BOUNDARY {\bfseries then}\\
29: \hspace{3cm}{\bfseries begin}\\
30: \hspace{3.5cm}bound\_rev(data,watch,curve\_sequence,i,j);\\
31: \hspace{3.5cm}moving(move,curve\_sesquence);\\
32: \hspace{3cm}{\bfseries end}\\
33: \hspace{0.5cm}{\bfseries else}\\
34: \hspace{1cm}{\bfseries while} "there are boundarys."{\bfseries do}\\
35: \hspace{1.5cm}{\bfseries begin}\\
36: \hspace{2cm}{\bfseries for} i := 0 {\bfseries to} x\_size {\bfseries do}\\
37: \hspace{2.5cm}{\bfseries for} j := 0 {\bfseries to} y\_size {\bfseries do}\\
38: \hspace{3cm}{\bfseries if} data\_bin[i][j] = BOUNDARY {\bfseries then}\\
39: \hspace{3.5cm}{\bfseries begin}\\
40: \hspace{4cm}bound(data,watch,curve\_sequence,i,j);\\
41: \hspace{4cm}moving(move,curve\_sequence);\\
42: \hspace{3.5cm}{\bfseries end}\\
43: \hspace{1.5cm}{\bfseries end}\\
44: \hspace{0.5cm}paint(move);\\
45: \hspace{0.5cm}"reverse the processed image.";(* IMAGE $\to$ BACK, BACK $\to$ IMAGE *)\\
46: \hspace{0.5cm}{\bfseries if} "there are components more than one-pixel thickness" {\bfseries then}\\
47: \hspace{1cm}"Iterate from the line 13.";\\
48: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x\_size {\bfseries do}\\
49: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y\_size {\bfseries do}\\
50: \hspace{1.5cm}{\bfseries if} (move[i][j][k] = Image or leave[i][j][k] = Image) {\bfseries then}\\
51: \hspace{2cm}"Output Skeleton Data" := Image;\\
52: {\bfseries end.}\\
\\
(* leave component composed one-pixel thickness *)\\
1: {\bfseries procedure} leave-pix({\bfseries var} data,leave:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char);\\
2: \hspace{0cm}{\bfseries begin}\\
3: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x-size {\bfseries do}\\
4: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y-size {\bfseries do}\\
5: \hspace{2cm}{\bfseries if} data[i][j] = one-pixel thickness {\bfseries then}\\
6: \hspace{2.5cm}leave[i][j] = LEAVE;\\
7: \hspace{0cm}{\bfseries end;}\\
\\
(* eliminate pixel connected by one pixel *)\\
1: {\bfseries procedure} cut({\bfseries var} data:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char);\\
2: \hspace{0cm}{\bfseries begin}\\
3: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x-size {\bfseries do}\\
4: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y-size {\bfseries do}\\
5: \hspace{2cm}{\bfseries if} 'data[i][j] = one-pixel thickness' {\bfseries then}\\
6: \hspace{2.5cm}data[i][j] = BACK;\\
7: \hspace{0cm}{\bfseries end;}\\
\\
(* culculate curvature for edge pixel *)\\
1: {\bfseries procedure} curv\_cul({{\bfseries var} data\_bin:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char , curv\_data:{\bfseries array}[x\_size][y\_size] {\bfseries of} integer);\\
2: \hspace{0cm}{\bfseries begin}\\
3: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x-size {\bfseries do}\\
4: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y-size {\bfseries do}\\
5: \hspace{1.5cm}'culculate curvature for data[i][j]';\\
6: \hspace{0cm}{\bfseries end;}\\
\\
(* assign curvature code *)\\
1: {\bfseries procedure} curv\_num({\bfseries var} data\_bin:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char , curv\_data:{\bfseries array}[x\_size][y\_size] {\bfseries of} integer);\\
2: \hspace{0cm}{\bfseries begin}\\
3: \hspace{0.5cm}{\bfseries for} i := 1 {\bfseries to} x-size {\bfseries do}\\
4: \hspace{1cm}{\bfseries for} j := 1 {\bfseries to} y-size {\bfseries do}\\
5: \hspace{1.5cm}{\bfseries if} curv\_data[i][j] $>$ 0 {\bfseries then}\\
6: \hspace{2cm}data\_bim[i][j] := PLUS;\\
7: \hspace{1.5cm}{\bfseries else if} curv\_data[i][j] $<$ 0 {\bfseries then}\\
8: \hspace{2cm}data\_bin[i][j] := MINUS;\\
9: \hspace{1.5cm}{\bfseries else} data\_bin[i][j] := ZERO;\\
10: \hspace{0cm}{\bfseries end;}\\
\\
(* boundary tracking ({\bfseries clockwise}) for {\bfseries outer boundary} *)\\
1: {\bfseries procedure} bound({{\bfseries var} data,watch:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char , curv\_sequence:{\bfseries array}["number of boundary pixels"] {\bfseries of} curve\_sequence , x\_start,y\_start:integer);\\
2: {\bfseries var} x\_now,y\_now:integer;\\
3: \hspace{0cm}{\bfseries begin}\\
4: \hspace{0.5cm}{\bfseries while} x\_now $<>$ x\_start {\bfseries and} y\_now $<>$ y\_start {\bfseries do}\\
5: \hspace{1cm}{\bfseries begin}\\
6: \hspace{1.5cm}'curve\_sequence.sign := curvature code of data[x\_now][y\_now];\\
7: \hspace{1.5cm}'curve\_sequence.x\_coordinate := x\_now;\\
8: \hspace{1.5cm}'curve\_sequence.y\_coordinate := y\_now;\\
9: \hspace{1.5cm}'watch[x\_now][y\_now] := BACK';\\
10: \hspace{1.5cm}(* for reference. if watch is null then all boundarys are checked. *)\\
11: \hspace{1.5cm}" boundary tracking by 4-neighborhood ";\\
12: \hspace{1cm}{\bfseries end}\\
13: \hspace{0cm}{\bfseries end;}\\
\\
(* boundary tracking ({\bfseries counterclockwise}) for {\bfseries inner boundary} *)\\
1: {\bfseries procedure} bound\_rev({{\bfseries var} data,watch:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char , curv\_sequence:{\bfseries array}["number of boundary pixels"] {\bfseries of} curve\_sequence  , x\_start,y\_start:integer);\\
2: {\bfseries var} x\_now,y\_now:integer;\\
3: \hspace{0cm}{\bfseries begin}\\
4: \hspace{0.5cm}{\bfseries while} x\_now $<>$ x\_start {\bfseries and} y\_now $<>$ y\_start {\bfseries do}\\
5: \hspace{1cm}{\bfseries begin}\\
6: \hspace{1.5cm}'curve\_sequence.sign := curvature code of data[x\_now][y\_now];\\
7: \hspace{1.5cm}'curve\_sequence.x\_coordinate := x\_now;\\
8: \hspace{1.5cm}'curve\_sequence.y\_coordinate := y\_now;\\
9: \hspace{1.5cm}'watch[x\_now][y\_now] := BACK';\\
\hspace{1.5cm}(* for reference. if watch is null then all boundarys are checked. *)\\
10: \hspace{1.5cm}" boundary tracking by 4-neighborhood ";\\
11: \hspace{1cm}{\bfseries end}\\
12: \hspace{0cm}{\bfseries end;}\\
\\
(* move pixel according to curvature *)\\
1: {\bfseries procedure} moving({{\bfseries var} move:{\bfseries array}[x\_size][y\_size] {\bfseries of} unsigned char , curv\_sequence:{\bfseries array}["number of boundary pixels"] {\bfseries of} curve\_sequence , h:integer(* number of boundary pixels*));\\
2: {\bfseries var} x\_now,y\_now:integer;\\
3: \hspace{0cm}{\bfseries begin}\\
4: \hspace{0.5cm}"move boundary pixels according to curvature";\\
5: \hspace{0cm}{\bfseries end;}\\
\\
(* fill boundary *)\\
1: {\bfseries procedure} paint({{\bfseries var} move:{\bfseries array}[x\_size][y\_size]);\\
2: \hspace{0cm}{\bfseries begin}\\
3: \hspace{0.5cm}"fill background";(* then reverse image *)\\
4: \hspace{0cm}{\bfseries end;}\\
\\

\end{document}
