{"id":18679999,"url":"https://github.com/effeix/imagesegmentation","last_synced_at":"2025-11-07T15:30:25.309Z","repository":{"id":92510059,"uuid":"157239452","full_name":"effeix/ImageSegmentation","owner":"effeix","description":"Simple image segmentation software using GPU parallelization","archived":false,"fork":false,"pushed_at":"2018-12-09T19:05:23.000Z","size":2350,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-27T22:22:42.601Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Cuda","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/effeix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-12T16:02:12.000Z","updated_at":"2021-03-19T20:42:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"65d77485-9dfa-4891-bc69-871acee44e35","html_url":"https://github.com/effeix/ImageSegmentation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/effeix%2FImageSegmentation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/effeix%2FImageSegmentation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/effeix%2FImageSegmentation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/effeix%2FImageSegmentation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/effeix","download_url":"https://codeload.github.com/effeix/ImageSegmentation/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239533067,"owners_count":19654617,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T09:47:31.745Z","updated_at":"2025-11-07T15:30:25.119Z","avatar_url":"https://github.com/effeix.png","language":"Cuda","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ImageSegmentation\nSoftware para segmentação de imagens com paralelização em GPU\n\n## Objetivo\nNeste projeto o objetivo é realizar a separação de um objeto seleciona como plano de frente do resto da imagem (plano de fundo). Esta técnica é conhecida como segmentação de imagens. O usuário deve escolher alguns pontos da imagem dentro do objeto que deseja selecionar e alguns pontos dentro dos objetos que deseja ignorar. A imagem final será uma máscara em preto e branco representando esta separação que, ao ser multiplicada com a imagem original, gera a nova imagem segmentada. A parte final (multiplicação) não está implementada no momento. Existem duas versões do programa: uma sequencial e uma paralela, sendo que a segunda utiliza estratégias de paralelização em GPU com CUDA (Nvidia).\n\n## Explicação\nPrimeiramente, devemos interpretar a imagem a ser segmentada como um grafo (conjunto de nós que possuem conexões entre eles). Neste grafo cada pixel da imagem é um nó e possue quatro nós vizinhos: os pixels de cima, de baixo da esquerda e da direita na imagem original. Ligando estes nós existem arestas cujo peso é a diferença de cor entre os dois nós ligados por ela. Por exemplo: se temos um nó `i` de cor 255 (branco) ligado à um nó `j` de cor 127 (cinza), a aresta que liga estes dois nós tem peso 255 - 127 = 128. Depois de calculados todos os pesos das arestas, deseja-se descobrir, para cada pixel, se este está mais perto de uma semente de frente ou uma de fundo. Para isto, deve-se achar o menor caminho (com menor soma de pesos) entre um pixel `i` e as sementes de fundo e o menor caminho entre o mesmo pixel `i` e as sementes de frente. Dentre estes menores caminhos, o menor deles mostra a qual plano o pixel pertence. O algoritmo utilizado para encontrar o menor caminho entre dois pixels foi o SSSP (Single Source Shortest Path). \n\n## Dependências\n- [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)\n- [Thrust](http://thrust.github.io/)\n- [Python 3.6.5+](https://www.python.org/)\n- Make\n\n## Utilização\nPrimeiramente, deve-se compilar os três executáveis utilizados pelo programa. Vá para a pasta `ImageSegmentation/src/build/` e execute o comando `make`.\n\nCom os executáveis criados já é possível utilizar o software da seguinte maneira:\n```sh\n$ ./imseg_p \u003cimagem_entrada\u003e \u003cimagem_saida\u003e \u003c sementes.txt\n```\npara a versão paralela, ou\n```sh\n$ ./imseg_s \u003cimagem_entrada\u003e \u003cimagem_saida\u003e \u003c sementes.txt\n```\npara a versão sequencial. Caso não possua uma placa de vídeo (GPU) da marca Nvidia, a versão paralela não funcionará.\n\nO arquivo `sementes.txt` (pode ter qualquer nome) contém as sementes de frente e fundo no seguinte formato:\n\n```\nN_FG N_BG\nX1 Y1\nX2 Y2\nX3 Y3\n...\n```\nem que N_FG é a quantidade de sementes de frente, N_BG é a quantidade de sementes de fundo e logo abaixo coordenadas dos pixel de frente e fundo (N_FG coordenadas e em seguida N_BG coordenadas).\n\nForam observados resultados mais satisfatórios quando as imagens de entrada eram um filtro de bordas da imagem original, ou seja, uma nova imagem destacando somente os contornos. Portanto é recomendado que a imagem de entrada dos executáveis `imseg_p` e `imseg_s` seja uma imagem filtrada.\n\n**Filtro de bordas na imagem**\nDentro da pasta `build/` execute:\n```sh\n$ ./edge_filter \u003cimagem_entrada\u003e \u003cimagem_saida\u003e\n```\nIsto gerará uma imagem filtrada.\n\n**Uma limitação do projeto é o suporte apenas à imagens do tipo PGM no formato ASCII. Este tipo pode ser obtido convertendo uma imagem qualquer (PNG, JPG, etc) em PGM utilizando o software GIMP.**\n\n## Testes\nPara verificar a performance do programa, algumas métricas de tempo foram utilizadas. Foram medidos os tempos de criação do grafo (GRAPH), execução do algoritmo SSSP (SSSP) e criação da máscara final (IMAGE). O programa imprime, no final da execução, os tempos medidos e o tempo total no seguinte formato:\n\n```\nTIMING\nGRAPH: V ms\nSSSP: X ms\nIMAGE: Y ms\nTOTAL: Z ms\n```\nNa versão sequencial, a criação do grafo e execução do algoritmo são realizadas ao mesmo tempo, portanto o tempo GRAPH não aparece. Os testes foram realizados com versões filtradas das imagens. As imagens de teste se encontram em `ImageSegmentation/test/`, sendo que cada imagem possue a versão original (.pgm), a versão filtrada (com sufixo \\_edge) e versão final (com sufixo \\_out) dentro de suas respectivas pastas, bem como o arquivo sementes.txt utilizado.\n\n#### Imagem 1: test/balls/balls.pgm (500x500 - 972Kb)\n\n| Tempos (ms) | Sequencial | Paralela |\n|:-----------:|------------|----------|\n| GRAPH       | -          | 114.017  |\n| SSSP        | 569.091    | 3389.42  |\n| IMAGE       | 15.8321    | 17.0986  |\n| TOTAL       | 587.2      | 3522.75  |\n\n#### Imagem 2: test/stickers/stickers.pgm (1000x1000 - 3.7Mb)\n\n| Tempos (ms) | Sequencial | Paralela |\n|:-----------:|------------|----------|\n| GRAPH       | -          | 493.55   |\n| SSSP        | 2847.61    | 14258  \t|\n| IMAGE       | 6808.94    | 70.3044\t|\n| TOTAL       | 2919.03    | 14828.1  |\n\n#### Imagem 3: test/logo/logo.pgm (2000x2000 - 14Mb)\n\n| Tempos (ms) | Sequencial | Paralela |\n|:-----------:|------------|----------|\n| GRAPH       | -          | 0.001824 |\n| SSSP        | 11203.9    | 189854  \t|\n| IMAGE       | 260.536    | 261.807 \t|\n| TOTAL       | 11464.5    | 195576   |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feffeix%2Fimagesegmentation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feffeix%2Fimagesegmentation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feffeix%2Fimagesegmentation/lists"}