Page 264 -
P. 264

238   Chapter 6 ■ Thinning


                                   if (again == 0) break;



                           / *  First 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-1] [j]  im->data[i] [j+1]
                                                  *
                                                   im->data[i+1] [j]==0 &&
                                                           *                *
                                           im->data[i] [j+1]  im->data[i+1] [j]  im->data[i] [j-1] == 0)
                                        {
                                           tmp->data[i] [j] = 1;
                                           again = 1;
                                        }
                                        }
                                    }
                                 Delete (im, tmp);
                              }
                           / *  Post_process  * /
                           stair (im, tmp, NORTH);
                                  Delete (im, tmp);
                                  stair (im, tmp, SOUTH);
                                  Delete (im, tmp);

                           / *  Restore levels  *  /
                              for (i=1; i<im->info->nr-1; i++)
                               for (j=1; j<im->info->nc-1; j++)
                                    if (im->data[i] [j] > 0) im->data[i] [j] = 0;
                                    else im->data[i] [j] = 255;

                              freeimage (tmp);
                           }

                                                                          *
                           / *  Delete any pixel in IM corresponding to a 1 in TMP /
                           void Delete (IMAGE im, IMAGE tmp)
                           {
                               int i, j;
                           / *  Delete pixels that are marked  * /
                              for (i=1; i<im->info->nr-1; i++)
                               for (j=1; j<im->info->nc-1; j++)
                                 if (tmp->data[i] [j])
                                 {
                                    im->data[i] [j] = 0;
                                    tmp->data[i] [j] = 0;
                                  }
   259   260   261   262   263   264   265   266   267   268   269