Skip navigation

Aritmetikai műveletek

Numpy vs OpenCV aritmetika

Mint láttuk, a képmátrixokat az OpenCV Python felülete Numpy tömbökben biztosítja számunkra. Mind a Numpy, mind az OpenCV lehetőséget biztosít képek közötti aritmetikai műveletekre, mint például az összeadás, kivonás, szorzás. Ha az egyik kép helyett skalár értéket adunk meg, akkor minden képpontra egyenként fogja a skalár műveletet elvégezni.

Fontos!

Nagy különbség van a Numpy és az OpenCV aritmetika között! Numpy esetén alul- vagy túlcsorduláskor körkörös az értékváltás az értéktartományon belül, míg az OpenCV úgynevezett szaturált aritmetikát használ: túlcsorduláskor a maximális, alulcsorduláskor a minimális értéket adja! Emiatt célszerűbb az OpenCV aritmetikai függvények használata, még ha a Numpy egyszerűbb is lenne.

Próbáljuk ki az alábbiakat.

nparr = np.array([0, 50, 100, 150, 200, 250], dtype=np.uint8)
print(nparr)

print(nparr + 100)
print(nparr - 100)

print(cv2.add(nparr, 100))
print(cv2.add(nparr, -100))

Az eredmények:

[ 0 50 100 150 200 250]
[100 150 200 250 44 94]
[156 206 0 50 100 150]
[[100]
[150]
[200]
[250]
[255]
[255]]
[[ 0]
[ 0]
[ 0]
[ 50]
[100]
[150]]

A Numpy a túlcsordulást és az alulcsordulást másként kezeli, mint az OpenCV! Az OpenCV Numpy eredménye más felépítésű, mint a Numpy összeadásé.

További példák (angol nyelven):

OpenCV aritmetikai és bitenkénti logikai függvények

Az OpenCV számos függvényt definiál képek közötti és skalár értékekkel való aritmetikára és logikai műveletekre. Néhány ezek közül:

  • absdiff(): abszolút különbség.
  • add(): összeadás.
  • addWeighted(): súlyozott összeadás.
  • bitwise_and(), bitwise_not(), bitwise_or(), bitwise_xor(): logikai ÉS, NEM, VAGY, KIZÁRÓ VAGY.
  • divide(): osztás.
  • exp(): exponens.
  • log(): logaritmus.
  • min(), max(): elemenkénti minimum, maximum.
  • multiply(): szorzás.
  • normalize(): értékkészlet normalizálás.
  • pow(): hatványozás.
  • scaleAdd(): skálázott összeadás.
  • subtract(): kivonás.

Egy képmátrixra statisztika számítás, skalár eredménnyel:

  • mean(): átlag.
  • meanStdDev(): átlag és szórás.
  • minMaxIdx(): minimum és maximum értéke és indexe.
  • sum(): összeg.

Dokumentáció (angol nyelven):

Feladat

Készítsünk programot, amely:

  • Betölt egy képet.
  • Szürkeárnyalatosra alakítja.
  • Megszorozza a képpontokat elemenként 2-vel, Numpy tömbként és OpenCV multiply() függvénnyel is.
  • Megjeleníti a képeket.

Numpy eredmény:

OpenCV multiply() eredmény:

Az OpenCV esetén minden magas intenzitású képpont, amely 255 feletti értéket kap, 255, vagyis maximális fényességű fehér színértékre áll be. A Numpy esetén a magas intenzitású pontok túlcsorduláskor alacsony, vagyis sötét intenzitásértéket kapnak. Képek esetén az OpenCV aritmetikája ad használhatóbb eredményt.

Ha el akarjuk kerülni az értékkészlet csonkolást, alakítsuk át a képet más, nagyobb bitszélességű adattípusra. Ezzel a következő témakörben ismerkedünk meg.

Változás detekció

Két képmátrix abszolút különbségének számításával az intenzitásértékek változását kapjuk meg. Ha konstans hátteret feltételezünk, akkor a mozgó objektumok detektálására használhatjuk.

Készítsünk programot, amely betölti az imageSequenceBackground.jpg (imseqbg), imageSequence00000005.jpg (imseq1), imageSequence00000006.jpg (imseq2) képeket, majd meghatározza az imseq1 és imseq2 változását a háttérhez (imseqbg), valamint egymáshoz képest is!

A jobb láthatóságért invertáljuk a különbségképeket!

Az abszolút különbség az absdiff() OpenCV függvénnyel számítható.

imageSequenceBackground.jpg

imageSequence00000005.jpg

imageSequence00000006.jpg

Eredmények

adiff1 = 255 - cv2.absdiff(imseqbg, imseq1)

adiff2 = 255 - cv2.absdiff(imseqbg, imseq2)

adiff3 = 255 - cv2.absdiff(imseq1, imseq2)