Rotulagem de componentes conectados
A rotulagem de componentes conectados (também chamada de análise de componentes conectados, extração de blobs, rotulagem de regiões, descoberta de blobs ou extração de regiões) rotula de forma única os componentes conectados de uma imagem. O processo de rotulagem varre a imagem, pixel a pixel, do canto superior esquerdo ao inferior direito, a fim de identificar regiões de pixels conectados, isto é, regiões de pixels adjacentes que compartilham o mesmo conjunto de valores de intensidade. Por exemplo, vamos encontrar os objetos nesta imagem:
Para identificar os objetos nesta imagem, use este comando:
magick objects.gif -connected-components 4 -auto-level -depth 8 objects.png
Os objetos detectados recebem rótulos únicos. Use o nivelamento automático (auto level) para visualizar os objetos detectados:
As estatísticas dos objetos são úteis para revisão. Para exibi-las, use este comando:
magick objects.gif -define connected-components:verbose=true -connected-components 4 objects.png
Cinco objetos foram detectados na imagem de origem com estas estatísticas:
Objects (id: bounding-box centroid area mean-color):
0: 256x171+0+0 119.2,80.8 33117 srgb(0,0,0)
2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255)
3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
4: 21x23+0+45 8.8,55.9 409 srgb(255,255,255)
1: 4x10+252+0 253.9,4.1 31 srgb(255,255,255)
Adicione -define connected-components:exclude-header=true para mostrar os objetos sem a linha de cabeçalho. Adicione -define connected-components:exclude-ids=true. Use -define connected-components:sort=area | width | height | x | y para ordenar os objetos de componentes conectados no modo verboso. Por padrão, os objetos são listados em ordem decrescente de área. Adicione -define connected-components:sort-order=increasing | decreasing para especificar a ordem de classificação.
Use -connected-components 8 para visitar 8 vizinhos em vez de 4. Por padrão, as cores dos vizinhos devem ser exatas para fazer parte de um objeto único. Use a opção -fuzz para incluir como parte de um objeto pixels que sejam próximos em cor.
Você pode querer eliminar objetos pequenos mesclando-os com seus vizinhos maiores. Se for o caso, use este comando:
magick objects.gif -define connected-components:area-threshold=410 -connected-components 4 \
-auto-level objects.jpg
Aqui estão os resultados esperados. Observe como os objetos pequenos agora estão mesclados com o fundo.
Observe como dois dos objetos foram mesclados, restando três objetos:
Objects (id: bounding-box centroid area mean-color):
0: 256x171+0+0 118.0,80.4 33557 srgb(0,0,0)
2: 120x135+104+18 159.5,106.5 8690 srgb(255,255,255)
3: 50x36+129+44 154.2,63.4 1529 srgb(0,0,0)
Por padrão, a imagem rotulada é em tons de cinza. Em vez disso, você pode substituir a cor do objeto na imagem rotulada pela mean-color da imagem de origem. Basta adicionar esta configuração, -define connected-components:mean-color=true, à sua linha de comando.
Os limiares podem, opcionalmente, incluir intervalos, por exemplo -define connected-components:area-threshold=410-1600. Para manter o objeto de fundo, identifique-o com -define connected-components:background-id=object-id. O objeto de fundo padrão é o objeto de maior área.
Além de area, há suporte para estas métricas de limiarização:
- connected-components:angle-threshold (a partir da elipse equivalente)
- connected-components:circularity-threshold (4piarea/perimeter^2)
- connected-components:diameter-threshold (sqrt(4*area/pi))
- connected-components:eccentricity-threshold (a partir da elipse equivalente)
- connected-components:major-axis-threshold (diâmetro a partir da elipse equivalente)
- connected-components:minor-axis-threshold (diâmetro a partir da elipse equivalente)
- connected-components:perimeter-threshold
Você pode querer remover certos objetos. Use -define connected-components:remove-ids=list-of-ids (por exemplo, -define connected-components:remove-ids=2,4-5). Ou use -define connected-components:keep-ids=list-of-ids para manter esses objetos e mesclar todos os demais. Por conveniência, você pode manter os objetos do topo, além do objeto de fundo, com esta opção: -define connected-components:keep-top=number-of-objects. Em vez de IDs de objeto, você também pode remover ou manter objetos identificados por sua cor, por exemplo -define connected-components:keep-colors=red;green;blue.
Os objetos na sua imagem podem parecer homogêneos, mas ter valores de cor ligeiramente diferentes. Por padrão, apenas pixels que correspondem exatamente são considerados parte de um determinado objeto. Para pequenas variações de cor em um objeto, use -fuzz. Por exemplo,
magick star-map.png -fuzz 5% -define connected-components:verbose=true \
-define connected-components:mean-color=true -connected-components 4 stars.gif
Componentes conectados
O algoritmo percorre os pixels de um componente, na ordem usual de linha-coluna, procurando um componente acima ou à esquerda. Para o componente no canto superior esquerdo, não há componentes acima ou à esquerda com os quais mesclar. Como resultado, há casos especiais em que é preciso rotacionar, repetir os componentes conectados e, então, rotacionar de volta. Por exemplo,
magick \
objects.gif \
-define connected-components:verbose=true \
-define connected-components:area-threshold=6000 \
-virtual-pixel None \
-connected-components 4 -rotate 180 \
-connected-components 4 -rotate -180 \
objects.png


