1 /*====================================================================*
2 - Copyright (C) 2001 Leptonica. All rights reserved.
3 -
4 - Redistribution and use in source and binary forms, with or without
5 - modification, are permitted provided that the following conditions
6 - are met:
7 - 1. Redistributions of source code must retain the above copyright
8 - notice, this list of conditions and the following disclaimer.
9 - 2. Redistributions in binary form must reproduce the above
10 - copyright notice, this list of conditions and the following
11 - disclaimer in the documentation and/or other materials
12 - provided with the distribution.
13 -
14 - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18 - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *====================================================================*/
26
27 /*
28 * ccthin2_reg.c
29 *
30 * Tests:
31 * - The examples in pixThinConnectedBySet()
32 * - Use of thinning and thickening in stroke width normalization
33 */
34
35 #include "allheaders.h"
36
main(int argc,char ** argv)37 int main(int argc,
38 char **argv)
39 {
40 l_int32 i;
41 BOX *box;
42 PIX *pixs, *pix1, *pix2;
43 PIXA *pixa1, *pixa2, *pixa3, *pixa4, *pixa5;
44 PIXAA *paa;
45 L_REGPARAMS *rp;
46 SELA *sela;
47
48 if (regTestSetup(argc, argv, &rp))
49 return 1;
50
51 /* Clip to foreground to see if there are any boundary
52 * artifacts from thinning and thickening. (There are not.) */
53 pix1 = pixRead("feyn.tif");
54 box = boxCreate(683, 799, 970, 479);
55 pix2 = pixClipRectangle(pix1, box, NULL);
56 pixClipToForeground(pix2, &pixs, NULL);
57
58 pixDestroy(&pix1);
59 pixDestroy(&pix2);
60 boxDestroy(&box);
61
62 pixa1 = pixaCreate(0);
63
64 sela = selaMakeThinSets(1, 0);
65 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
66 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 0 */
67 pixaAddPix(pixa1, pix1, L_INSERT);
68 selaDestroy(&sela);
69
70 sela = selaMakeThinSets(2, 0);
71 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
72 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 1 */
73 pixaAddPix(pixa1, pix1, L_INSERT);
74 selaDestroy(&sela);
75
76 sela = selaMakeThinSets(3, 0);
77 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
78 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 2 */
79 pixaAddPix(pixa1, pix1, L_INSERT);
80 selaDestroy(&sela);
81
82 sela = selaMakeThinSets(4, 0);
83 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
84 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 3 */
85 pixaAddPix(pixa1, pix1, L_INSERT);
86 selaDestroy(&sela);
87
88 sela = selaMakeThinSets(5, 0);
89 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
90 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 4 */
91 pixaAddPix(pixa1, pix1, L_INSERT);
92 selaDestroy(&sela);
93
94 sela = selaMakeThinSets(6, 0);
95 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
96 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 5 */
97 pixaAddPix(pixa1, pix1, L_INSERT);
98 selaDestroy(&sela);
99
100 sela = selaMakeThinSets(7, 0);
101 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
102 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 6 */
103 pixaAddPix(pixa1, pix1, L_INSERT);
104 selaDestroy(&sela);
105
106 sela = selaMakeThinSets(8, 0);
107 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
108 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 7 */
109 pixaAddPix(pixa1, pix1, L_INSERT);
110 selaDestroy(&sela);
111
112 sela = selaMakeThinSets(9, 0);
113 pix1 = pixThinConnectedBySet(pixs, L_THIN_FG, sela, 0);
114 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 8 */
115 pixaAddPix(pixa1, pix1, L_INSERT);
116 selaDestroy(&sela);
117
118 sela = selaMakeThinSets(10, 0);
119 pix1 = pixThinConnectedBySet(pixs, L_THIN_BG, sela, 5);
120 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 9 */
121 pixaAddPix(pixa1, pix1, L_INSERT);
122 selaDestroy(&sela);
123
124 sela = selaMakeThinSets(11, 0);
125 pix1 = pixThinConnectedBySet(pixs, L_THIN_BG, sela, 5);
126 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 10 */
127 pixaAddPix(pixa1, pix1, L_INSERT);
128 selaDestroy(&sela);
129
130 /* Display the thinning results */
131 pix1 = pixaDisplayTiledAndScaled(pixa1, 8, 500, 1, 0, 25, 2);
132 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 11 */
133 if (rp->display) {
134 lept_mkdir("lept/thin");
135 pixDisplayWithTitle(pix1, 0, 0, NULL, rp->display);
136 fprintf(stderr, "Writing to: /tmp/lept/thin/ccthin2-1.pdf");
137 pixaConvertToPdf(pixa1, 0, 1.0, 0, 0, "Thin 2 Results",
138 "/tmp/lept/thin/ccthin2-1.pdf");
139 }
140 pixDestroy(&pix1);
141 pixDestroy(&pixs);
142 pixaDestroy(&pixa1);
143
144 /* Show thinning using width normalization */
145 paa = pixaaCreate(3);
146 pixa1 = l_bootnum_gen3();
147 pixa2 = pixaScaleToSize(pixa1, 0, 36);
148 pixaaAddPixa(paa, pixa2, L_INSERT);
149 pixa3 = pixaScaleToSizeRel(pixa2, -4, 0);
150 pixaaAddPixa(paa, pixa3, L_INSERT);
151 pixa3 = pixaScaleToSizeRel(pixa2, 4, 0);
152 pixaaAddPixa(paa, pixa3, L_INSERT);
153 pixa5 = pixaCreate(6);
154 for (i = 0; i < 3; i++) {
155 pixa3 = pixaaGetPixa(paa, i, L_CLONE);
156 pix1 = pixaDisplayTiledInColumns(pixa3, 15, 1.0, 10, 1);
157 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 12, 14, 16 */
158 pixaAddPix(pixa5, pix1, L_INSERT);
159 pixa4 = pixaSetStrokeWidth(pixa3, 5, 1, 8);
160 /* pixa4 = pixaSetStrokeWidth(pixa3, 1, 1, 8); */
161 pix1 = pixaDisplayTiledInColumns(pixa4, 15, 1.0, 10, 1);
162 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 13, 15, 17 */
163 pixaAddPix(pixa5, pix1, L_INSERT);
164 pixaDestroy(&pixa3);
165 pixaDestroy(&pixa4);
166 }
167 pix1 = pixaDisplayTiledInColumns(pixa5, 2, 1.0, 25, 2);
168 regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 18 */
169 if (rp->display) {
170 pixDisplayWithTitle(pix1, 0, 0, NULL, rp->display);
171 fprintf(stderr, "Writing to: /tmp/lept/thin/ccthin2-2.pdf");
172 pixaConvertToPdf(pixa5, 0, 1.0, 0, 0, "Thin strokes",
173 "/tmp/lept/thin/ccthin2-2.pdf");
174 }
175 pixaaDestroy(&paa);
176 pixaDestroy(&pixa1);
177 pixaDestroy(&pixa5);
178 pixDestroy(&pix1);
179
180 return regTestCleanup(rp);
181 }
182
183
184