функция подсчета BLOB-объектов в C - PullRequest
1 голос
/ 03 ноября 2011

Сегодня у нас была задача, где мы должны были найти все пиксели, которые были связаны друг с другом на изображении. Картинка просто зеленая = 1, без цвета = 0 и может быть представлена ​​в виде массива:

    int grid[5][5] = {
    {1, 1, 0, 0, 0},
    {0, 1, 1, 0, 0},
    {0, 0, 1, 0, 1},
    {1, 0, 0, 0, 1},
    {0, 1, 0, 1, 1},
};

Мы сидели в моей группе 3 часа и пытались решить эту проблему (первая лекция о рекурсии), но мы просто не можем заставить ее работать. Похоже, проблема заключается в том, что функции как-то принимают за пределы сетки. Любой кто, вот код:

#include <stdio.h>
#include <string.h>

//Prototype
int blob_count(int y, int x, int gridCopy[][5], int sum);

int blob_count(int y, int x, int gridCopy[][5], int sum){

   //Local vars
    int posX, posY;
    printf("\n\nX: %d - Y: %d\nposX: %d - posY: %d\nSum: %d", x, y, posX, posY, sum);
    printf("\n\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n{%d - %d - %d - %d - %d}\n",
           gridCopy[0][0],
           gridCopy[0][1],
           gridCopy[0][2],
           gridCopy[0][3],
           gridCopy[0][4],

           gridCopy[1][0],
           gridCopy[1][1],
           gridCopy[1][2],
           gridCopy[1][3],
           gridCopy[1][4],

           gridCopy[2][0],
           gridCopy[2][1],
           gridCopy[2][2],
           gridCopy[2][3],
           gridCopy[2][4],

           gridCopy[3][0],
           gridCopy[3][1],
           gridCopy[3][2],
           gridCopy[3][3],
           gridCopy[3][4],

           gridCopy[4][0],
           gridCopy[4][1],
           gridCopy[4][2],
           gridCopy[4][3],
           gridCopy[4][4]); 

    //Find the position 1 behind and 1 above the starting point, and start the loop there
    for(posX = -1;posX <=1; posX++){
        for(posY = -1; posY <= 1; posY++){
            if((y + posY) >= 0 && (x + posX) >= 0){
                if((y + posY) <= 5 && (x + posX) <= 5){
                    if(gridCopy[posY+y][posX+x] == 1){
                        //Set the starting point to 0 (so it wont get calculated again)
                        gridCopy[posY+y][posX+x] = 0;



                        y = posY+y;
                        x = posX+x;

                        sum++;
                        blob_count(y, x, gridCopy, sum);
                    }
                }
            }
        }
    }

    return sum;



}

int main (void)
{

    int grid[5][5] = {
        {1, 1, 0, 0, 0},
        {0, 1, 1, 0, 0},
        {0, 0, 1, 0, 1},
        {1, 0, 0, 0, 1},
        {0, 1, 0, 1, 1},
    };

    //Create a manipulateable grid
    int gridCopy[5][5];
    memcpy(gridCopy, grid, 5*5*sizeof(int));

    //Start Positions
    int start_x = 0;
    int start_y = 3;

    //If the starting point selected, is not 0, initiate the function:
    if(grid[start_y][start_x] != 0){
        printf("\nSum: %d", blob_count(start_y ,start_x, gridCopy, 0));
    }




}

Edit:

Я обновил код выше, и теперь у меня возникла новая проблема, он получает правильную сумму (количество пикселей в сочетании друг с другом), однако, когда я распечатываю сумму (в main ();), она говорит 1, почему он не переносится из рекурсивной функции в основную функцию?

1 Ответ

3 голосов
/ 03 ноября 2011

Вы смотрите на всех соседей текущего пикселя:

for(posX = -1;posX<=1;posX++){
    for(posY = -1; posY<= 1;posY++){

И вы проверяете, что координаты положительные:

        if((y + posY) >= 0 && (x + posX) >= 0){

Но вы не проверяете, что координатыне переполняйте:

        if((y + posY) < 5 && (x + posX) < 5) {

И вместо этого получите доступ к неопределенным данным вне сетки:

            if(gridCopy[posY+y][posX+x] == 1){

Возможно, это все равно не будет работать, но так как это домашняя работа, я будупросто дать вам несколько советов: вы игнорируете возвращаемое значение рекурсивного вызова (не делайте этого) и не инициализируете sum (включите предупреждения компилятора, чтобы получить уведомление об этом).Вы также не копируете всю сетку: memcpy(gridCopy, grid, 5*5); копирует 25 байтов , а не 25 целых .Вместо этого используйте memcpy(gridCopy, grid, 5 * 5 * sizeof(int));.

...