Skip navigation

Képmanipulációs feladatok

Maszk körvonal rajzolás továbbfejlesztése

  • A maszkolás alfejezetben látott példát módosítsuk úgy, hogy a körvonal vörös helyett más színnel legyen megjelenítve (kék, zöld, cián, narancssárga, lila, ...)!
  • A színes körvonal rajzolást készítsük el a bemeneti kép szürkeárnyalatos változatára is, hogy jobban látsszon a színes körvonal! (Ötlet: a bemeneti képet alakítsuk szürkeárnyalatossá, majd a ezt vissza színes reprezentációba. Egycsatornás szürkeárnyalatosra ugyanis nem tudunk színeset rajzolni.)
  • Módosítsuk úgy a programot, hogy a rendszámtábla területet ne fehérre, hanem lilára színezzük! (Arra kell figyelni, hogy mi az indexelő kifejezés, mert önmagában a 255 érték lecserélése [255, 0, 255]-re szintaktikai hibát fog adni.)

Képek súlyozott összeadása

Képezzük két egyforma méretű kép súlyozott összegét! Fedezzük fel a cv2.addWeighted() függvény használati lehetőségét erre a célra! Ezzel a függvénnyel képpontonként konstans súlyokkal hajtódik végre az elegyítés. Segítséget ad az angol nyelvű dokumentációban az Image Blending rész.

A feladat megoldását egy videó is bemutatja (KfGyak_03_03_addWeighted.mp4).

Személy körüli képi háttér cseréje

Készítsünk programot, ami egy állóképen lecseréli az emberi videókonferencia résztvevő mögött a hátteret!

  • Készítsünk webkamerával egy portré képet.
  • Egy rajzolóprogrammal rajzoljunk bináris maszkot az arc és a törzs területére.
  • Válasszunk egy a webkamera képével megegyező méretű háttérképet.
  • Az eredménykép maszk által meghatározott területére másoljuk be a személy arcát és törzsét, a többi képpontra a háttérkép információt.

A megoldásunkat bővítsük ki úgy, hogy kezelni tudjuk, ha a maszk kép nem bináris, hanem szürke átmenetes! Ebben az esetben a maszk képpont értékei az előtér és háttér képpontok összeadási súlyait jelentsék (0: teljesen a háttér látszik, 255: teljesen az előtér látszik, 128: 50%-50%-os súllyal adjuk össze őket. További szürke értékekhez egyenes arányossággal kapjuk a súlyokat.) A képek határain ilyen maszkkal fokozatos átmenetet tudunk megvalósítani, ami szebb vizuális eredményt adhat.

  • A szürkeárnyalatos maszk képet alakítsuk át np.float32 fípusra és osszuk el 255.0 értékkel. Ez adja az előtérkép képpontjainak súlyait. Legyen ez weight1.
  • A háttérkép képpontjainak súlyait az (1.0 - weight1) képlet adja.
  • Az eredményt ekkor a képek megfelelő súlyokkal szorzott összege adja. Ne felejtsük el np.uint8 típusba visszaalakítani!

Bemeneti képi adatokat a példatár webcam_selfie mappájában találunk!

Képek átlátszósági érték szerinti elegyítése

Képek súlyozott összeadásakor a képmátrixhoz adott, úgynevezett alfa csatorna segítségével képpontonként szabályozhatjuk az elegyítési súlyokat, a színek átlátszóságát. A 0 érték jelenti a teljesen átlátszót, a 255 pedig a teljesen átlátszatlant. A köztes értékek esetén megfelelő súlyozással összeadjuk a két kép adott pontban található értékeit. A PNG képformátum biztosítja az ilyen 4 csatornás képek tárolását.

Fontos, hogy 4 csatornás PNG kép beolvasásakor adjuk meg a cv2.IMREAD_UNCHANGED paramétert a cv2.imread() függvénynek! Ekkor a szokásos BGR értékek mellett a negyedik (3-as indexű) lesz az átlátszósági érték.

A súlyok számítását az alábbi példán mutatjuk be. Tegyük fel, hogy a két elegyítendő képpont a [B1, G1, R1, A1] és a [B2, G2, R2].

W1 = A1 / 255.0
W2 = 1.0 - W1
B = B1 * W1 + B2 * W2
G = G1 * W1 + G2 * W2
R = R1 * W1 + R2 * W2

Menjünk végig a képmátrix minden pontján, és végezzük el a fenti számítások alapján az elegyítést! Látható, hogy ezzel a megközelítéssel a második képpont alfa csatorna információját nem használjuk fel.

Hasonló algoritmust hajtanak végre a böngészőmotorok, amikor egy nem konstans színű háttéren átlátszósági értékkel rendelkező képet jelenítenek meg a HTML oldalon.

Alfa csatornával rendelkező képeket találhatunk például a https://www.transparenttextures.com/ oldalon, vagy készíthetünk magunk is fejlettebb képmanipulátor programokkal, mint ameilyen például a PhotoShop vagy a GIMP.

Megjegyezzük, hogy ez a feladat nagyon hasonló a személy körüli háttér lecserélésénél látottra. Itt a maszk kép nem külön kerül tárolásra, hanem az előtérkép negyedik csatornájaként.