обработка изображений Цепочка

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

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

пс. Цепной код, в основном Цепной код Freeman

Я добавлю фото, как это работает,
введите описание изображения здесь

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

// 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;
}

-2

Решение

Переменные 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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector