обработка изображений Цепочка - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть этот код ниже, и меня попросили изменить его, добавить x [] и y [] и сохранить координаты границы в x [] и y []

кодчитает изображение как матрицу, 2X2, и, если какой-либо объект найден, он вычисляет периметры.Границы найденного объекта.

пс.Цепной код, в основном это Цепной код Фримена

Я добавлю картинку, как это работает, enter image description here

Может кто-нибудь помочь мне, пожалуйста, я был бы оченьблагодарен,

// compute the chain code of the object begninning at pixel (i,j)
//and return the direction code as NN integers in the array C[] , and coordinates of boundary in x[] and y[]

    void chain8 (struct image *x, int *c, int i, int j, int *nn)
    {
        int val,n,m,q,r, di[9],dj[9],ii,dii;
        int lastdir, jj;

    /*      Table given index offset for each of the 8 directions.          */
        di[0] = 0;      di[1] = -1;     di[2] = -1;     di[3] = -1;
        dj[0] = 1;      dj[1] = 1;      dj[2] = 0;      dj[3] = -1;
        di[4] = 0;      di[5] = 1;      di[6] = 1;      di[7] = 1;
        dj[4] = -1;     dj[5] = -1;     dj[6] = 0;      dj[7] = 1;

        for (ii=0; ii<200; ii++) c[ii] = -1;    /* Clear the code table */
        val = x->data[i][j];    n = 0;  /* Initialize for starting pixel */
        q = i;  r = j;  lastdir = 4;

        do {
           m = 0;
           dii = -1; 
           for (ii=lastdir+1; ii<lastdir+8; ii++) {     /* Look for next */
              jj = ii%8;
              if (range(x,di[jj]+q, dj[jj]+r))
            if ( x->data[di[jj]+q][dj[jj]+r] == val) {
               dii = jj;    m = 1;
               break;
            } 
           }

           if (m) {     /* Found a next pixel ... */
            if (n<200) c[n++] = dii;        /* Save direction as code */
            q += di[dii];   r += dj[dii];
            lastdir = (dii+5)%8;
           } else break;        /* NO next pixel */
           if (n>200) break;
        } while ( (q!=i) || (r!=j) );   /* Stop when next to start pixel */

        *nn = n;
    }

1 Ответ

0 голосов
/ 07 декабря 2018

Переменные q и r содержат текущие координаты пикселей.Вы начинаете с пикселя q = i, r = j.Во внешнем цикле вы делаете:

  1. Найти индекс переадресации границы dii.Вы последовательно (против часовой стрелки) просматриваете все направления, начиная с последнего направления lastdir, и находите пиксель с цветом val.Вы используете dii в качестве индекса направления, из которого вы можете получить смещения пикселей, используя таблицы поиска di и dj.

  2. Обновление текущей позиции пикселей путем добавления смещений пикселей (dx,dy) ядро ​​отсылается в направлении dii к текущим координатам q += di[dii]; r += dj[dii];

Вам необходимо хранить q и r для базовых пикселей в массивах bx и by.Это достаточно просто:

bx[n] = q;
by[n] = r;

Таким образом, ваш окончательный код будет

// compute the chain code of the object begninning at pixel (i,j)
//and return the direction code as NN integers in the array C[] , and coordinates of boundary in bx[] and by[]

void chain8(struct image *x, int* bx, int* by,  int *c, int i, int j, int *nn)
{
   int val, n, m, q, r, di[9], dj[9], ii, dii;
   int lastdir, jj;

   /*      Table given index offset for each of the 8 directions.          */
   di[0] = 0;      di[1] = -1;     di[2] = -1;     di[3] = -1;
   dj[0] = 1;      dj[1] = 1;      dj[2] = 0;      dj[3] = -1;
   di[4] = 0;      di[5] = 1;      di[6] = 1;      di[7] = 1;
   dj[4] = -1;     dj[5] = -1;     dj[6] = 0;      dj[7] = 1;

   for (ii = 0; ii<200; ii++) by[ii] = bx[ii] = c[ii] = -1;    /* Clear the code table */
   val = x->data[i][j];    n = 0;  /* Initialize for starting pixel */
   q = i;  r = j;  lastdir = 4;

   do {
      m = 0;
      dii = -1;
      for (ii = lastdir + 1; ii<lastdir + 8; ii++) {     /* Look for next */
         jj = ii % 8;
         if (range(x, di[jj] + q, dj[jj] + r))
            if (x->data[di[jj] + q][dj[jj] + r] == val) {
               dii = jj;    m = 1;
               break;
            }
      }

      if (m) {     /* Found a next pixel ... */
         q += di[dii];   r += dj[dii];
         if (n < 200)
         {
            c[n] = dii;        /* Save direction as code */
            bx[n] = q;
            by[n] = r;
            n++;
         }

         lastdir = (dii + 5) % 8;
      }
      else break;        /* NO next pixel */
      if (n>200) break;
   } while ((q != i) || (r != j));   /* Stop when next to start pixel */

   *nn = n;
}
...