- 1. Képtranszformációk - affin és nem affin transzformáció
- 2. Képfordítások - Mozgó kép felfelé, lefelé, balra és jobbra
- 3. Képforgatás - A kép forgatása
- 4. Méretezés, átméretezés és interpoláció
- 5. Képpiramisok - Az átméretezés másik módja
- 6. Körbevágás - A kívánt képterület kivágása
- 7. Számtani műveletek a képek világosításához és sötétítéséhez
Az előző tutorial, megtanulták OpenCV és tett néhány alapvető képfeldolgozó használja, mint a szürke méretezés, színtelítettség, hisztogram, színterek, RGB komponens stb Mint mondta az előző tutorial, OpenCV nyílt forráskódú Commuter Vision Library, amely C ++, Python és Java interfészek és támogatja a Windows, Linux, Mac OS, iOS és Android operációs rendszereket. Így könnyen telepíthető a Raspberry Pi-be Python és Linux környezettel. Az OpenCV-vel és a csatlakoztatott kamerával rendelkező Raspberry Pi sok valós idejű képfeldolgozó alkalmazás létrehozására használható, például Arcfelismerés, Arczár, Objektumkövetés, Autószámtábla-felismerés, Otthoni biztonsági rendszer stb.
Ebben az oktatóanyagban megnézzük, hogyan fogjuk kezelni a képet az OpenCV segítségével. Itt megtanuljuk a következő függvény alkalmazását egy képen az OpenCV használatával:
- Képtranszformációk - affin és nem affin transzformáció
- Képfordítások - Kép mozgatása felfelé, lefelé, balra és jobbra
- Kép forgatása - A kép forgatása
- Méretezés, átméretezés és interpoláció
- Képpiramisok - Az átméretezés másik módja
- Vágás - Kivágja a kívánt képtartományt
- Számtani műveletek a képek világosabbá és sötétebbé tételéhez
1. Képtranszformációk - affin és nem affin transzformáció
Az átalakítások egy kép geometriai torzításai, a torzítások itt természetesen nem hibákat, hanem egy korrekciótípust jelentenek a kép rögzítésének helyén felmerülő perspektívák kijavítására. A képtranszformációknak két típusa van : affin és nem affin
Az affin transzformációk háromféle skálázás, forgatás és transzláció, az affin transzformációknál az a fontos, hogy a vonalak párhuzamosak legyenek a képtranszformációk előtt és után.
A nem affin transzformációk vagy a projektív transzformációk nem őrzik meg a párhuzamosságot, a hosszúságot vagy a szöget, ugyanakkor megőrzik a kollinearitást és incidenciát, a kollinearitás azt jelenti, hogy a két pont ugyanazon az egyenesen fekszik.
A nem affin transzformációk nagyon gyakran előfordulnak a számítógépes látásban, és különböző kameraállásokból jönnek létre. A nem affin vagy projektív transzformációkat homográfiának is nevezzük.
2. Képfordítások - Mozgó kép felfelé, lefelé, balra és jobbra
A képfordítás a kép mozgatása felfelé, lefelé, balra és jobbra, sőt átlósan is, ha egyszerre valósítjuk meg az x és y fordítást.
A képfordítások elvégzéséhez az opencv warpAffine függvényét használjuk, a cv2.warpAffine- t használjuk ezeknek a fordításoknak a megvalósításához, de ehhez fordítási mátrixra van szükségünk.
Fordítási mátrix, T = 1 0 Tx
0 1 ty
T X, T y azok az irányok, amelyekben a kép elmozdul.
Ahol a T X eltolódik az X tengely mentén (vízszintes)
T Y az Y tengely mentén tolódik (függőleges)
# ez affin transzformáció, amely egyszerűen eltolja a kép helyzetét # a cv2.warpAffine-t használjuk ezeknek az átalakításoknak a megvalósításához. import cv2 import numpy as np image = cv2.imread ('input.jpg') # tárolja a kép magasságának és szélességének szélességét = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (kép, T, (szélesség, magasság)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Fordítás ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konzol kimenet - (183, 275) - magasság és szélesség
- T mátrix
]
3. Képforgatás - A kép forgatása
A kép elforgatása a kép elforgatása egy pont vagy a kép közepén lévő pont körül, ahogyan a forgási pont elfordul.
A fordításhoz hasonlóan van T-mátrixunk, valószínűleg forgáskor M-mátrixunk is van
Rotációs mátrix, M mátrix = Cosθ -Sinθ
Sinθ Cosθ
Ahol θ az óramutató járásával ellentétes irányban mért forgási szög.
Azt is meg kell jegyezni, hogy az OpenCV lehetővé teszi a képek egyidejű értékesítését és forgatását a cv2.getRotationMatrix2D függvény használatával (rotation_center_x, rotation_center_y, rotation angle, scale)
Még mindig az opencv warpAffine függvényét használjuk a kép elforgatásához, de a fordítási mátrix helyett, mint itt az előző esetben, a forgatás mátrixot használjuk.
import cv2 import numpy mint np image = cv2.imread ('input.jpg') magasság, szélesség = image.shape # ossza el a magasságot és a szélességet 2-vel, hogy a képet elforgassa a középső rotáción., height / 2), 90,1) rotated_image = cv2.warpAffine (kép, rotation_matrix, (szélesség, magasság)) cv2.imshow ('eredeti kép', kép) cv2.waitKey (0) cv2.imshow ('elforgatott kép ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Most a képet 90 fokkal elforgatták, a vászon mérete miatt levágták, mivel a vászon mérete változatlan, de az elforgatás miatt a kép mérete nem illeszkedik a vászon méretéhez. Beállítható a méretezési tényező negatívra állításával, de fekete hátteret enged a kép mögött.
Tehát előre beállíthatja vagy kitalálhatja a kép magasságát és szélességét, vagy a kép elforgatásának másik módja a transzponálás, de a kép 90 fok többszörösével elfordulna az óramutató járásával ellentétes irányba.
4. Méretezés, átméretezés és interpoláció
A méretezés és az átméretezés affin transzformációk, a kép átméretezése sokáig megtettük, és interpolációval is foglalkoztunk, például amikor nagyobb méretűre méretezzük a képet, amelyben kibővítjük a képpontokat, akkor vannak hiányosságok a pixel, és itt jön be az interpoláció.
Ez akkor fordulhat elő, ha a képméretet kisebbről nagyobbra növeli, vagy a képméretet nagyobbról kisebbre csökkenti.
Technikailag az interpoláció új adatpontok (pixelek) létrehozásának egy módja, az ismert adatpontok diszkrét halmazán belül.
Az OpenCV-ben különböző típusú interpolációs módszerek léteznek
cv2.INTER_AREA - jó a zsugorodáshoz vagy a mintavételhez
cv2.INTER_NEAREST - leggyorsabb
cv2.LINEAR - jó nagyításhoz vagy mintavételezéshez (alapértelmezett)
cv2.CUBIC - jobb
cv2.INTER_LANCZOS4 - a legjobb
A # átméretezése nagyon egyszerű a cv2.resize függvény használatával, argumentumai: # cv2.resize (kép, dsize (kimeneti képméret), x_scale, y_scale, interpoláció) import cv2 import numpy mint np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # tegyük a képet az eredeti kép méretének 3/4-ig, azaz 75% -ra kicsinyítjük image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) #mivel a lineáris interpoláció az alapértelmezett módszer a nyitott cv-hez, nem kell függvényként végrehajtanunk. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # duplázzuk meg a kép méretét img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # csináljuk az átméretezést pontos dimenziókkal image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Képpiramisok - Az átméretezés másik módja
A piramiszó kép vagy felnagyításra (képek nagyítása), vagy kicsinyítésre (képek zsugorítása) utal.
Ez egyszerűen egy másik átméretezési mód, amely lehetővé teszi számunkra a képek egyszerű és gyors méretezését, kicsinyítéssel felére csökkentve az új kép magasságát és szélességét.
Ez akkor hasznos, ha olyan objektumdetektorokat készítenek, amelyek minden egyes kép után skálázzák a képeket.
import cv2 image = cv2.imread ('input.jpg') kisebb = cv2.pyrDown (kép) nagyobb = cv2.pyrUp (kisebb) cv2.imshow ('eredeti', kép) cv2.waitKey (0) cv2.imshow ('kisebb', kisebb) cv2.waitKey (0) cv2.imshow ('nagyobb', nagyobb) cv2.waitKey (0) cv2.destroyAllWindows ()
Nagyobb képnél észreveheti, hogy még mindig ugyanolyan méretű, mint az eredeti kép, kissé elmosódott, mert kisebb képből közvetlenül nagyobb képpé konvertálódik. De ha interpoláljuk, akkor a képminőség javul, mint az előzőben, mert az interpoláció becsli a képpontokat, miközben kitölti a szóközöket a kép nagyításakor.
Most ugyanazt a kódot futtatva, de köbös interpolációval jobb minőségű képet kapunk. Az alábbi képek összehasonlítják az eredeti kép, a kép felfelé méretezett változata, a kisebb kép és a kisebb kép köbös interpolált változatát.
import cv2 image = cv2.imread ('input.jpg') kisebb = cv2.pyrDown (kép) nagyobb = cv2.pyrUp (kisebb) cv2.imshow ('eredeti', kép) cv2.waitKey (0) cv2.imshow ('kisebb', kisebb) cv2.waitKey (0) cv2.imshow ('nagyobb', nagyobb) cv2.waitKey (0) # a kisebb képből konvertált nagyobb kép minőségének javítása köbös interpoláció segítségével img_double = cv2.resize (kisebb, Nincs, fx = 2, fy = 2, interpoláció = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
Megjegyzés: Ha azt szeretné, hogy több kis példányban képek megy kisebb és kisebb méretű vagy több nagyméretű másolatait képek folyamatosan növekvő méretű, akkor tudjuk használni a hurkok vagy közben hurkok tartása belül pyrDown vagy pyrUp funkciót.
6. Körbevágás - A kívánt képterület kivágása
A képek kivágása a kép egy szegmensének kivonására vonatkozik.
Az OpenCV közvetlenül nem rendelkezik vágási funkcióval, de a numpy segítségével könnyen megtehető az alábbi kód segítségével
Levágva = kép
A képtömböt és indexelő eszközökkel vagy módszerrel a numery-be tesszük, meghatározzuk a kezdősort a végsorig és az oszlop elejétől a végéig oszlopot vesszővel elválasztva, amely kivonja a kivágni kívánt téglalapot a kép megszerzéséhez.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # kapjuk meg a kezdő pixel koordinátákat (a téglalap vágásának bal felső része) start_row, start_col = int (magasság *.25), int (szélesség *.25) # kapjunk végpont pixel koordinátákat (jobbra lent) end_row, end_col = int (magasság *.75), int (width *.75) #egyszerűen használja az indexelést a kivágni kívánt téglalap kivágásához = image cv2.imshow ("eredeti kép", image) cv2.waitKey (0) cv2.imshow ("levágott kép", levágva) cv2.waitKey (0) cv2.destroyAllWindows ()
Ne feledje , hogy a pixelértékeket közvetlenül is használhatja a start_col vagy a start_row helyett, ezek csak azért vannak megadva, hogy megkönnyítsék a felhasználó azonosítását.
7. Számtani műveletek a képek világosításához és sötétítéséhez
Az OpenCV aritmetikai műveletei alapvetően mátrixok hozzáadását vagy kivonását jelentik a képhez, a mátrixok összeadása vagy kivonása hatással van a fényerő növelésére vagy csökkentésére.
Tehát mátrixok hozzáadásához vagy kivonásához létre kell hoznunk őket, és a numpy-nak van egy np.ones nevű függvénye, amely az 1-es méretű mátrixokat adja meg, mint a képünk.
import CV2 import numpy mint np image = cv2.imread (input.jpg) #create mátrixot az ember, akkor szorozza meg a scaler-100' # np.ones ad mátrix azonos méretű a mi kép minden a 100 érték ebben az esetben M = np.ones (image.shape, dtype = "uint8") * 100 # ezt használjuk az M mátrix hozzáadásához a képünkhöz # figyeld meg a hozzáadott fényerő növekedését = cv2.add (image, M) cv2.imshow ("Hozzáadva", hozzáadva) cv2.waitKey (0) #hasonlóképpen kivonhatjuk # észrevehetjük a fényerő csökkenését is kivonva = cv2.subtract (kép, M) cv2.imshow ("kivonva", kivonva) cv2.waitKey (0) cv2.destroyAllWindows ()
Így lehet az OpenCV-t sokféle képfeldolgozási művelet alkalmazására a képen. A következő oktatóanyagban folytatjuk a többi képmanipulációs funkciót.