У меня есть этот код ниже, и меня попросили изменить его, добавить 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;
}
Переменные q
а также r
содержат текущие координаты пикселей. Вы начинаете с пикселя q = i, r = j
, Во внешнем цикле вы делаете:
Найти границу индекса направления dii
, Вы последовательно (против часовой стрелки) просматриваете все направления, начиная с последнего. lastdir
и найти пиксель с цветом val
, Ты используешь dii
в качестве индекса направления, из которого вы можете получить смещение пикселей, используя таблицы поиска di
а также dj
,
Обновите текущую позицию пикселя, добавив пиксельные смещения (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;
}
Других решений пока нет …