Как найти связанный объект в двоичном изображении в VIVADO HLS?

У меня есть пороговое двоичное изображение, как показано ниже:

двоичное изображение

Я хочу найти все связанные объекты на изображении.

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

Я уже реализовал это в C, где матрицы хранятся и могут быть доступны непосредственно A[][] формат. Но в HLS образы приходят как поток, который я преобразовал в hls::Mat, Я не уверен, могу ли я выполнять поэлементную операцию над Mat и доступен ли mat для автономных операций, как матрица.

Я не могу понять, как реализовать код C в Vivado HLS.

unsigned char paddedImg[FULL_HD_HEIGHT+2][FULL_HD_WIDTH+2] = {0};

void connectedComponents(unsigned char* Image,int width, int height, int 
connectType, int* noOfComponents, char* list)
{
unsigned char  west, north,northWest, northEast,south,east,southEast,southWest = 0;

int label = 0;
int min = 0;

for(int i=0; i<height; i++)
{
    for(int j=0; j<width; j++)
    {
        paddedImg[i+1][j+1] = Image[(i*width) + j];
    }
}

for(int i=1; i<(height+1); i++)
{
    for(int j=1; j<(width+1); j++)
    {
        west      = paddedImg[i][j-1];
        northWest = paddedImg[i-1][j-1];
        north     = paddedImg[i-1][j];
        northEast = paddedImg[i-1][j+1];

        if(paddedImg[i][j] != 0)
        {
            min = 25500;

            if(connectType == 8)
            {
                if( west != 0 || north != 0 || northWest != 0 || northEast != 0)
                {
                    if(west < min && west != 0)         min  = west;
                    if(northWest < min && northWest != 0)       min  = northWest;
                    if(north < min && north != 0)           min  = north;
                    if(northEast < min && northEast != 0)       min  = northEast;

                    paddedImg[i][j] = min;
                }
                else
                {
                    paddedImg[i][j] = ++label;
                }
            }
            else if(connectType == 4)
            {
                if( west != 0 || north != 0)
                {
                    if(west < min && west != 0)     min  = west;
                    if(north < min && north != 0)       min  = north;

                    paddedImg[i][j] = min;
                }
                else
                {
                    paddedImg[i][j] = ++label;
                }
            }
            else
            {
                printf("invalid connect type\n");
            }
        }
    }
}

for(int i=1; i<height+1; i++)
{
    for(int j=1; j<width+1; j++)
    {
        if(paddedImg[i][j] != 0)
        {   
            if(connectType == 8)
            {
                west =      paddedImg[i][j-1];
                northWest = paddedImg[i-1][j-1];
                north =     paddedImg[i-1][j];
                northEast = paddedImg[i-1][j+1];

                east =      paddedImg[i][j+1];
                southEast = paddedImg[i+1][j+1];
                south =     paddedImg[i+1][j];
                southWest = paddedImg[i+1][j-1];

                min = paddedImg[i][j];

                if(west < min && west != 0)             min  = west;
                if(northWest < min && northWest != 0)       min  = northWest;
                if(north < min && north != 0)               min  = north;
                if(northEast < min && northEast != 0)       min  = northEast;
                if(east < min && east != 0)             min  = east;
                if(southEast < min && southEast != 0)       min  = southEast;
                if(south < min && south != 0)               min  = south;
                if(southWest < min && southWest != 0)       min  = southWest;

                if(west != 0)       paddedImg[i][j-1] = min;
                if(northWest != 0)  paddedImg[i-1][j-1] = min;
                if(north != 0)      paddedImg[i-1][j] = min;
                if(northEast != 0)  paddedImg[i-1][j+1] = min;
                if(east != 0)       paddedImg[i][j+1] = min;
                if(southEast != 0)  paddedImg[i+1][j+1] = min;
                if(south != 0)      paddedImg[i+1][j] = min;
                if(southWest != 0)  paddedImg[i+1][j-1] = min;

            }
            else if(connectType == 4)
            {   
                west =      paddedImg[i][j-1];
                north =     paddedImg[i-1][j];
                east =      paddedImg[i][j+1];
                south =     paddedImg[i+1][j];

                min = paddedImg[i][j];

                if(west < min && west != 0)     min  = west;
                if(north < min && north != 0)       min  = north;
                if(east < min && east != 0)     min  = east;
                if(south < min && south != 0)       min  = south;

                if(west != 0)               paddedImg[i][j-1] = min;
                if(north != 0)              paddedImg[i-1][j] = min;
                if(east != 0)               paddedImg[i][j+1] = min;
                if(south != 0)              paddedImg[i+1][j] = min;
            }
            else
            {
                printf("invalid connect type\n");
            }
        }
    }
}

for(int i=0; i<height; i++)
{
    for(int j=0; j<width; j++)
    {
        Image[i*width + j] = paddedImg[i+1][j+1];
    }
}

*noOfComponents = min;
 }

1 ответ

Алгоритм, который вы описываете, похоже, требует загрузки всего изображения в память FPGA для обеспечения произвольного доступа к элементам. Если изображение достаточно маленькое, вы можете сделать это, предварительно считав его из потока в память.

Если изображение большого размера или вы не хотите буферизовать все изображение, в бумажной реализации FPGA алгоритма связанных компонентов за один проход предлагается алгоритм поиска подключенного компонента за один проход.

Другие вопросы по тегам