Need Help -> Векторизация

From
Victor A. Pavlov (2:5025/81)
To
Evgen Kondratyuk
Date
2002-07-26T00:16:35Z
Area
RU.ALGORITHMS
Доброго здоровья, Evgen!

 Как то раз (Чет Июл 25 2002 12:15) Evgen Kondratyuk написал письмо Victor A. Pavlov:

 VAP>> 3. Скелетизация (thinning).   На данном
 VAP>> этапе все линии на изображении приводятся к толщине в 1 пиксел. Имеется
 VAP>> несколько алгоритмов скелетизации, например, Zhang-Suen. Если нужен
 VAP>> пример в исходниках - могу выслать.
 EK> Вышли пожалуйста.

  Кидаю в эху, т.к. уже второй запрос.
  Хотя исходник и несколько сырой, но разобраться можно.

=== Begin Windows Clipboard ===
/* Zhang-Suen thinning */

int y [256][256];

main()
{

 int i,j,k,n,m;
 int im[256][256];


/* Read the glyph       */
 scanf ("%d", &n); scanf("%d", &m);
 for (i=0; i<n; i++) {
    for (j=0; j<m; j++) {
  scanf ("%d", &k);
  im[i][j] = k;
 }  }

 iputim (im, n, m);
 thin_b (im, n, m);
 iputim (im, n, m);
}

iputim (image,n,m)
 int image[256][256],n,m;
{
 int i,j;

 for (i=0; i<n; i++) {
    for (j=0; j<m; j++)  {
  if (image[i][j] >= 100) image[i][j] = 9;
  printf ("%3d", image[i][j]);
    }
    printf ("\n");
 }
}


thin_b (image,nn,mm)
 int image[256][256], nn,mm;
{
/*  Thinning algorithm: CACM 1984 march (Zhang and Suen) */

 int i,j,n,m,k, cont, br,ar,p1,p2, t1a();
 int a[8];

 printf ("Thinning algorithm: CACM 1984 march (Zhang and Suen) \n");
 cont = 1;
 while (cont) {
  printf ("+\n");
  cont = 0;

/* Sub-iteration 1: */
  for (i=0; i<nn; i++)
    for (j=0; j<mm; j++) {  /* Scan the entire image */
   if (image[i][j] == 0) {
    y[i][j] = 0;
    continue;
   }
   ar = t1a (image, i, j, a, &br,nn,mm); /* Function A */
   p1 = a[0]*a[2]*a[4];
   p2 = a[2]*a[4]*a[6];
   if ( (ar == 1) && ((br>=2) && (br<=6)) &&
    (p1 == 0) && (p2 == 0) )  {
     y[i][j] = 1;
     cont = 1;
   }
   else y[i][j] = 0;
  }
  subtr (y, image,nn,mm);

/* Sub iteration 2: */
  for (i=0; i<nn; i++)
    for (j=0; j<mm; j++) {  /* Scan the entire image */
   if (image[i][j] == 0) {
    y[i][j] = 0;
    continue;
   }
   ar = t1a (image, i, j, a, &br,nn,mm); /* Function A */
   p1 = a[0]*a[2]*a[6];
   p2 = a[0]*a[4]*a[6];
   if ( (ar == 1) && ((br>=2) && (br<=6)) &&
    (p1 == 0) && (p2 == 0) )  {
     y[i][j] = 1;
     cont = 1;
   }
   else y[i][j] = 0;
  }
  subtr (y, image,nn,mm);
 }
}

subtr (a, b, n,m)
 int a[256][256], b[256][256],n,m;
{
 int i,j;

 for (i=0; i<n; i++)
  for (j=0; j<m; j++)
   b[i][j] -= a[i][j];
}


int t1a (image, i, j, a, b,nn,mm)
 int image[256][256];
 int i,j, *b,nn,mm;
 int a[8];
{
/* Return the number of 01 patterns in the sequence of pixels
 P2 p3 p4 p5 p6 p7 p8 p9.     */

 int n,m;

 for (n=0; n<8; n++) a[n] = 0;
 if (i-1 >= 0) {
  a[0] = image[i-1][j];
  if (j+1 < mm) a[1] = image[i-1][j+1];
  if (j-1 >= 0) a[7] = image[i-1][j-1];
 }
 if (i+1 < nn) {
  a[4] = image[i+1][j];
  if (j+1 < mm) a[3] = image[i+1][j+1];
  if (j-1 >= 0) a[5] = image[i+1][j-1];
 }
 if (j+1 < mm) a[2] = image[i][j+1];
 if (j-1 >= 0) a[6] = image[i][j-1];

 m= 0; *b = 0;
 for (n=0; n<7; n++) {
  if ((a[n]==0) && (a[n+1]==1)) m++;
  *b = *b + a[n];
 }
 if ((a[7] == 0) && (a[0] == 1)) m++;
 *b = *b + a[7];
 return m;
}

/*  End of method B     */
=== End Windows Clipboard ===

Всего хорошего - Victor

--- GoldED/W32 3.0.1
 * Origin: Red Station, Voronezh, Russia (2:5025/81)