Page 263 -
P. 263

Chapter 6 ■ Thinning   237


                                *     *
                               /  Thin  /
                                  thnz (im);
                                  for (i=0; i<data->info->nr; i++)
                                       for (j=0; j<data->info->nc; j++)
                                             data->data[i] [j] = im->data[i+1] [j+1];

                                  Output_PBM (data, argv[2]);
                               }

                               / *  Zhang-Suen with Holt’s staircase removal  * /
                               void thnz (IMAGE im)
                               {
                                  int i, j, k, again=1;
                                  IMAGE tmp;
                                  tmp = newimage (im->info->nr, im->info->nc);

                                *                    *
                               /  BLACK = 1, WHITE = 0.  /
                                  for (i=0; i<im->info->nr; i++);
                                    for (j=0; j<im->info->nc; j++)
                                    {
                                     if (im->data[i] [j] > 0) im->data[i] [j] = 0;
                                       else im->data[i][j] = 1;
                                     tmp->data[i] [j] = 0;
                                    }
                                *               *
                               /  Mark and delete  /
                                  while (again)
                                    {
                                       again = 0;
                                *                   *
                               /  Second sub-iteration  /
                                       for (i=1; i<im->info->nr-1; i++);
                                        for (j=1; j<im->info->nc-1; j++)
                                       {
                                            if (im->data[i] [j] != 1) continue;
                                            k = nays8(im, i, j);
                                            if ((k >= 2 && k <= 6) && Connectivity(im, i, j) == 1)
                                            {
                                             if (im->data[i] [j+1]  * im->data[i-1] [j]
                                                       *
                                                        im->data[i] [j-1] == 0 &&
                                                   im->data[i-j][j]  * im->data[i+1] [j]
                                                   *
                                                    im->data[i] [j-1] == 0)
                                             {
                                                tmp->data[i] [j] = 1;
                                                again = 1;
                                             }
                                            }
                                         }



                                       Delete (im, tmp);
   258   259   260   261   262   263   264   265   266   267   268