Skip navigation

Összefüggő komponensek címkézése

Összefüggő komponensek detektálása

A kontúr detekcióhoz hasonlóan bináris szegmentálás eredményéből indul ki az összefüggő komponensek keresése algoritmus is. Azok a képpontok tartoznak egy összefüggő komponensbe, amelyek bármely két pontjára igaz, hogy el tudunk jutni egyikből a másikba egy olyan úton, ahol szomszédos, szintén a komponenshez tartozó képpontokra lépünk tovább.

A szomszédok megállapításához szükség van a szomszédsági reláció megadására is. 2D-ben jellemzően 4-, illetve 8-szomszéd relációkat használnak.

  • 4-szomszédság egy vizsgált képpont esetében a képmátrixban "balra", "jobbra", "fel" és "le" irányban értelmeződik.
  • 8-szomszédság esetén az átlós irányok is hozzáadódnak.

Az ábrákon X jelöli a középponti, szürkével jelölt képpont 4- és 8-szomszédságát:

4-szomszédság 8-szomszédság

Az alábbi példában a szürkével jelzett objektumpontok egy komponenst alkotnak 8-szomszédság esetén, két külön komponensre bomlanak viszont 4-szomszédságnál (értelemszerűen a 3x3 és 2x2 részekre).

Az OpenCV az összefüggő komponens keresés eredményeként egy szürkeárnyalatos képet ad, ahol ugyanazon intenzitásértékkel azok a képpontok lesznek megjelölve, amelyek egyazon komponenshez tartoznak. Mivel egy képen a komponensek száma nagyobb lehet, mint 255, ezért 16 vagy 32 bites egész lehet jelenleg az eredménykép típusa, a számábrázolás csonkolási hibáját elkerülendő. Figyeljünk a képmátrix normalizálására, ha meg akarjuk jeleníteni!

A következő képek egy bináris képet, illetve az eltérő színekkel színezet összefüggő komponenseket ábrázolják.

  

OpenCV lehetőségek

A feladat megoldására a cv2.connectedComponents() függvényt használhatjuk, amelynek kétféle formája van.

retval, labels = cv2.connectedComponents(image[, labels[, connectivity[, ltype]]])

retval, labels = cv2.connectedComponentsWithAlgorithm(image, connectivity, ltype, ccltype[, labels])

Eredményül megkapjuk a komponensek számát a retVal-ban (pontosabban annál 1-gyel többet, mert a hátteret is számolja), valamint egy labels képmátrixot, amelyben a komponens sorszáma található minden képponthoz, ahol a 0 érték a hátteret jelenti.

A connectivity 4 vagy 8 értéket vehet fel. Az ltype a címkekép típusa, jelenleg CV_32S (32 bites előjeles egész) vagy CV_16U (16 bites előjel nélküli egész) támogatott. A ccltype az algoritmus típusát jelenti, értéke cv2.CCL_DEFAULTcv2.CCL_WU vagy cv2.CCL_GRANA lehet.

Használati példa

Kódrészlet a 11_04_connectedComponents.py példaprogramból.

threshVal = 100

if threshVal < 128:

_, bw = cv2.threshold(imgray, threshVal, 255, cv2.THRESH_BINARY_INV)
else:
_, bw = cv2.threshold(imgray, threshVal, 255, cv2.THRESH_BINARY)

retVal, labels = cv2.connectedComponents(bw, None, 8, cv2.CV_16U)

print('Kompenensek száma:', retVal)

labelsNorm = cv2.normalize(labels, None, 0, 65535, cv2.NORM_MINMAX, cv2.CV_16U)
cv2.imshow('Labels', labelsNorm)