Skip navigation

Alakzatok hasonlóságának vizsgálata

Alakjellemzők

Az előzőleg tárgyalt egyszerű alakjellemzők önmagukban elég korlátozottan használhatók. Körök, téglalapok, négyzetek, elnyúlt vagy kompakt alakzatok különböztethetők meg. Szimbólumok, számok, betűk osztályozására önmagukban jobbára alkalmatlanok. Definiálhatunk olyan alakjellemzőket, amelyek több elemből állnak, vektort alkotnak. Megfelelően megválasztott alakjellemzők alkalmasak lehetnek arra, hogy segítségükkel képen előforduló alakzatok közötti hasonlóságot vizsgáljunk. Kis számú szimbólumkészlet alakzat-alapú szétválasztására alkalmasak lehetnek, beleértve különféle geometriai transzformációkkal szembeni invarianciát is.

Sokféle lehetőségünk van, néhány példa:

  • Normalizált lánckód (kontúr alapján meghatározva)
  • Fourier leíró (kontúr alapján meghatározva)
  • Momentumok (Hu, Zernike, ...; területi kiterjedés alapján)

Az alakhasonlóság vizsgálatához az alábbi elvárásokat támaszthatjuk a jellemzőkkel szemben (invariancia):

  • Legyen invariáns a pozícióra (eltolásra): ne függjön az értéke attól, hogy a képmátrixban hol jelenik meg ugyanaz az alakzat.
  • Legyen invariáns az orientációra: az alakzat elforgatott változataira ugyanazon értéket adja.
  • Legyen invariáns a(z egyforma mértékű) skálázásra: ugyanazon alakzat kisebb és nagyobb méretű változatai egyforma értéket kapjanak. (Kamera közelítés-távolítás esete.)
  • Legyen invariáns a perspektív torzulásra: ilyen változást szenvednek el a síkszerű alakzatok, amiket változó térbeli irányból fotózunk. Általában megelégszünk az ezt közelítő affin-invarianciával (perspektív helyett affin torzulást veszünk).

Az alábbi ábrán kétféle alakzatot láthatunk többféle helyen, méretben, orientációban megjelenni. A célunk az lesz, hogy olyan alakjellemzőket definiáljunk, amelyek:

  • Ugyanarra az alakzatra a deformációjától függetlenül ugyanazt a leírót adja. A gyakorlatban a digitális raszterképek diszkrét mintavételezése miatt nem lesznek tökéletesen egyformák az alakzatok, így a leírók esetén is megengedünk kisebb eltéréseket.
  • Az is fontos persze, hogy más alakzat esetén más legyen a leíró.

A hasonlóságot vizsgálhatjuk a többelemű vektor-jellemzők vektoriális távolságával (Euklideszi távolság, korreláció (vektorok bezárt szöge), stb.), vagy bemenetként adhatjuk őket mesterséges intelligencia algoritmusoknak (k-means osztályozó, k-nn osztályozó, SVM, mesterséges neuronháló, stb.).

Ebben a részben a momentumok használatát tárgyaljuk alakzatok hasonlóságának vizsgálatára a momentum vektorok távolságának számításával.

Momentumok

A momentumok számszerű leírást adnak az alakzatokról. Az alakzatot alkotó objektumpontok (x, y) koordinátából kerülnek számításra, azok hatványozásával, összeszorzásával és a szorzatok összegzésével.

p+q-ad rendű momentum:

m_{pq} = \sum_{i=1}^{N} x_i^p \cdot y_i^q \cdot f_i

Vagyis az objektumpontok x koordinátáit p-edik, az y koordinátáit q-adik hatványra emeljük és összeszorozva összegezzük. (Ne felejtsük el, hogy a koordináta-rendszer origója a képmátrix bal felső sarka.)

Az fi érték az intenzitásérték az adott pozíción. Abban az esetben használjuk, amennyiben az intenzitásérték nagysága azt jellemzi, mennyire erősen kapcsolódik az objektumhoz a képpont. Ha nincs ilyen jelentés társítva, akkor érdemes a bináris verziót használni, vagyis fi legyen 1 értékű az objektumpontokban.

Nézzük meg néhány momentum jelentését!

m_{00}

p és q értéke is 0. Egy nemnegatív szám nulladik hatványa 1. Vagyis N darabszor adjuk össze az 1 értéket. Eredményül így az alakzat méretét kapjuk képpontban.

m_{10}

p értéke 1, q értéke 0. Első hatvány esetén megmarad a szám értéke, jelen esetben az x koordináták. Az y koordinátákból 1 lesz a nulladik hatvány miatt. Eredményül így az alakzatot alkotó képpontok x koordinátáinak összegét kapjuk.

m_{01}

Az előzővel analóg módon itt az y koordináták összegét kapjuk.

\overline{x} = \frac{m_{10}}{m_{00}}

Az x koordináták összegét osztva a darabszámmal az átlag x értéket kapjuk. Vagyis az alakzat súlypontjának az x koordinátáját.

\overline{y} = \frac{m_{01}}{m_{00}}

Ez pedig az alakzat súlypontjának az y koordináta értéke.

Centrális momentumok

Az alakzatra kiszámolt momentum értékek jól láthatóan függnek attól, hogy az alakzat a kép mely részén található. Pozíciótól független (vagyis pozíció invariáns) leírást a centrális momentumokkal érhetünk el. Ekkor az x és y koordináta értékekből kivonjuk a súlypont (alakzat x és y koordináták átlaga) megfelelő koordinátáját.

\mu_{pq} = \sum_{i=1}^{N} \left( x_i - \overline{x} \right )^p \cdot \left( y_i - \overline{y} \right )^q \cdot f_i

Normalizált centrális momentumok számítása (amennyiben p+q ≥ 2):

\eta_{pq} = \frac{\mu_{pq}}{\mu_{00}^{\frac{p+q}{2}+1}}

Hu-momentumok

A Hu momentumokból 7 darab van, normalizált centrális momentumokból számítva az alábbi képletek szerint:

\[\begin{array}{l} hu[0]= \eta _{20}+ \eta _{02} \\ hu[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ hu[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ hu[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ hu[4]=( \eta _{30}-3 \eta _{12})( \eta _{30}+ \eta _{12})[( \eta _{30}+ \eta _{12})^{2}-3( \eta _{21}+ \eta _{03})^{2}]+(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ hu[5]=( \eta _{20}- \eta _{02})[( \eta _{30}+ \eta _{12})^{2}- ( \eta _{21}+ \eta _{03})^{2}]+4 \eta _{11}( \eta _{30}+ \eta _{12})( \eta _{21}+ \eta _{03}) \\ hu[6]=(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}]-( \eta _{30}-3 \eta _{12})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ \end{array}\]

A gyakorlatban ezek momentumok logaritmikus értékeit is használják (az "emberi szem" számára is jobban olvashatók, ha kiíratjuk őket). Pozíció, forgatás és skála invariánsak, vagyis felhasználhatók alakzatok hasonlóságának vizsgálatára.

Megjegyezzük, hogy az elnevezés a kutató nevéből származik, aki 1962-ben publikálta a számítási módot:

  • M. K. Hu, "Visual Pattern Recognition by Moment Invariants", IRE Trans. Info. Theory, vol. IT-8, pp.179–187, 1962

Momentumok számítása OpenCV-vel

Normál, centrális és normalizált centrális momentumok számítása

moments = cv2.moments(array[, binaryImage])

A bemeneti array tömb lehet kép, vagy 2D pontok tömbje (1xN vagy Nx1 méretű), vagyis megadhatunk küszöbölt képet, összefüggő komponens képét, vagy akár kontúr reprezentáció eredményét is. A binaryImage logikai érték a bemeneti kép binárisságát jelzi.

Eredményként egy 24 elemű kulcs-érték pár struktúrát kapunk egyszerű (m00, m10, m01, m20, m11, m02, m30, m21, m12, m03), centrális (mu20, mu11, mu02, mu30, mu21, mu12, mu03) és normalizált centrális momentumokkal (nu20, nu11, nu02, nu30, nu21, nu12, nu03), harmadik rendig. "Feleslegességük" miatt az alábbi értékek nem tárolódnak: mu00 = m00; nu00 = 1; nu10 = nu01 = mu10 = mu01 = 0.

Megjegyzés: Látható, hogy az OpenCV nu-ként hivatkozik a normalizált centrális momentumok nevére, a képletekben viszont az éta (η) görög kisbetűt szokták használni.

A kulcs-érték párok indexeléséhez tömbindexként a kulcs nevét kell sztringként megadni, például:

moments['m00']

Hu momentumok számítása előzőleg meghatározott momentum értékekből

hu = cv2.HuMoments(moments[, hu])

A bemeneti moments a cv2.moments() függvénytől visszakapott eredmény.

Hu momentumokon alapuló alakzathasonlóság

A Hu momentumok együttesen használhatók alakzatok alakjának leírására. Invariáns jellemzőt adnak pozícióra, orientációra és méretre, viszont affin és perspektív torzulásokra nem!

Két alakzat hasonlóságának jellemzésére a legegyszerűbb, ha a Hu momentumaik távolságát határozzuk meg. Erre használhatjuk az alábbi OpenCV függvényt is.

shape_match_value = cv2.matchShapes(contour1, contour2, method, parameter)

A bementi adatok (contour1 és contour2) kontúr reprezentációk vagy összefüggő komponensek is lehetnek. Vagyis nem a számított Hu momentum vektort kell átadni, azt a függvény fogja számítani!

A method jelenleg cv2.CONTOURS_MATCH_I1cv2.CONTOURS_MATCH_I2, vagy cv2.CONTOURS_MATCH_I3 lehet. Részletes leírásuk a hivatalos dokumentációban található. A parameter egyelőre nem használt, de kötelező megadni, például 0 értékkel.

Mint a számítási képletekből látható, az összehasonlításhoz a Hu momentumok logaritmikus értékét használja fel a függvény.

Momentum példaprogramok

12_01_moments_contours.py

A példaprogram beolvassa a FrenchCardsShapes.png képet, kinyeri a külső kontúrokat, majd minden kontúrra kiszámításra és konzolra írásra kerülnek a momentumok, a Hu momentumok, és a logaritmikus Hu momentum értékek. Az éppen vizsgált kontúr körvonal berajzolásra kerül a képre.

12_02_moments_components.py

Az előzőhöz hasonló, csak itt összefüggő komponenseket detektálunk, és minden komponensre egyenként számolunk momentumokat. Figyeljük meg, hogy a vizsgált komponenst önálló, új képbe rajzoljuk először! Láthatjuk azt is, hogyan érhetjük el a komponensek kiszámolt statisztikai értékeit is.

12_03_a_shape_matching_components.py

A példaprogram a FCards_01_rs.jpg képet tölti be, küszöböli, és detektálja az összefüggő komponenseit. Ezután a bal egérgomb lenyomásával kijelölhetünk egy komponenst, amelyről megkapjuk a konzolra kiírva a momentum információkat.

12_03_a_shape_matching_components.py példaprogram bővítése

A példaprogramot egészítsük ki az alábbiak szerint.

  • A program reagáljon a jobb egérgomb lenyomására is. Ezzel meg tudjuk adni, melyik az a komponens, amellyel az alak hasonlósági összehasonlítást el akarjuk végezni.
  • A bal egérgomb lenyomásával a legutóbb jobb kattintással kijelölt komponens alakjával történjen összehasonlítás.
  • Figyeljünk arra, ha bármelyik gombbal történő kattintás háttéren történik!
  • Próbáljuk ki mindhárom alaktávolság opciót!

A feladat első három pontjának megoldása a 12_03_b_shape_matching_components_extended.py példaprogramban található.

Elemzés:

  • Vizsgáljuk meg a shapes_crowns_arrows.png bináris kép alakzatait! A korona alakzatok esetén bizonyosak távolsága nagyon nagynak adódik. Mi lehet ennek az oka?

További bővítési lehetőség:

  • A jobb egérgombbal kijelölt komponens alakját hasonlítsuk össze az összes többi összefüggő komponensével!
  • Jegyezzük fel a hasonlósági értékeket, majd rendezzük őket növekvő sorrendbe!
  • Ezek közül az első megadott darabszámút (például 20) képként jelenítsük meg!

Hasonlóság vizsgálat

A FrenchCardsShapes.png képet használva a 12_03_b_shape_matching_components_extended.py példaprogram az alábbi hasonlóság-értékeket adja az egyes alakzatok között.

0 50,9 64,1 23,9
0 13,2 27
0 40,2
0

Megjegyezzük, hogy a hasonlósági értékek szimmetrikusak, így csak egy irányban jelennek meg a számok a táblázatban. A hasonlóság számítása a CONTOURS_MATCH_I2 algoritmus szerint történik a programban. Az OpenCV függvény eredményét 1000-rel megszoroztuk a jobb olvashatóság érdekében. Csak az alakzatokat vettük figyelembe, a színeket nem, ezért jelenik meg mindegyik feketével a táblázatban. Valós alkalmazásban a vörös és fekete színek alapján is lehet pluszban osztályozni.

Ezen a képen a szimbólumok nagy méretűek és jó minőségben mintavételezettek. Az FCards_01_rs.jpg képen sokkal kisebb méretben jelennek meg és a szegmentált alakzatok is rosszabb minőségűek. Az FCards_02_rs.jpg képen pedig a döntöttebb irányú kamera pozíció miatt a perspektív torzulás is kezd megjelenni, ami tovább csökkenti a Hu-momentumokon alapuló hasonlóság mérésének használhatóságát.

Feladat

Készítsünk programot, amely egy bináris komponensen csúszkák segítségével geometriai transzformációkat végez (eltolás, elforgatás, skálázás), és kiírja a különféle momentum értékeket! Vizsgáljuk meg, hogy az egyes momentumok hogyan viselkednek a különféle transzformációkkal szemben!