- 1. Transformácie obrazu - afinná a neafinická transformácia
- 2. Preklady obrázkov - Pohybujúci sa obrázok hore, dole, doľava a doprava
- 3. Otočenie obrázka - Otočenie obrázka
- 4. Zmena mierky, zmena veľkosti a interpolácia
- 5. Obrázkové pyramídy - ďalší spôsob zmeny veľkosti
- 6. Orezanie - Vyrezanie požadovanej oblasti obrázka
- 7. Aritmetické operácie na zosvetlenie a stmavenie obrázkov
V predchádzajúcom tutoriáli sme sa dozvedeli o OpenCV a vykonali sme základné spracovanie obrazu ako je škálovanie šedej, sýtosť farieb, histogram, farebné priestory, RGB komponent atď. Ako už bolo povedané v predchádzajúcom tutoriále, OpenCV je Open Source Commuter Vision Library, ktorá má Rozhrania C ++, Python a Java a podporuje Windows, Linux, Mac OS, iOS a Android. Dá sa teda ľahko nainštalovať na Raspberry Pi s prostredím Python a Linux. A Raspberry Pi s OpenCV a pripojenou kamerou možno použiť na vytvorenie mnohých aplikácií na spracovanie obrazu v reálnom čase, ako je detekcia tváre, zámok tváre, sledovanie objektov, detekcia ŠPZ automobilov, domáci bezpečnostný systém atď.
V tomto tutoriále sa dozvieme, ako budeme s obrázkom manipulovať pomocou OpenCV. Tu sa naučíme aplikovať na obrázok pomocou OpenCV nasledujúcu funkciu:
- Transformácie obrazu - afinná a neafinická transformácia
- Preklady obrázkov - Pohybujúci sa obrázok hore, dole, doľava a doprava
- Rotácia obrazu - Otáčanie obrázka
- Zmena mierky, zmena veľkosti a interpolácia
- Obrázkové pyramídy - ďalší spôsob zmeny veľkosti
- Orezanie - Vyrezanie požadovanej oblasti obrázka
- Aritmetické operácie na zosvetlenie a stmavenie obrázkov
1. Transformácie obrazu - afinná a neafinická transformácia
Transformácie sú geometrické skreslenia prijaté na obraze, skreslenia tu určite neznamenajú chyby, ale typ korekcie na nápravu problémov s perspektívou vyplývajúcich z bodu, v ktorom bol obrázok zachytený. Existujú dva typy transformácií obrázkov - Affine a Non-Affine
Afinné transformácie sú troch typov - zmena mierky, rotácia a preklad. Dôležitou vecou pri afinných transformáciách je to, že čiary sú paralelné pred a po transformácii obrazu.
Non-afinné transformácie alebo projektívne transformácie nezachovávajú rovnobežnosť, dĺžku alebo uhol, zachovávajú však kolinearitu a incidenciu, kolinearita znamená, že dva body ležia na rovnakej priamke.
Non-afinické transformácie sú v počítačovom videní veľmi časté a sú generované z rôznych uhlov kamery. Non-afinné alebo projektívne transformácie sa tiež nazývajú homografia.
2. Preklady obrázkov - Pohybujúci sa obrázok hore, dole, doľava a doprava
Preklad obrázkov posúva obraz hore, dole, doľava a doprava a dokonca aj diagonálne, ak implementujeme preklad xay súčasne.
Teraz na vykonávanie prekladov obrázkov používame funkciu warpAffine opencv, na implementáciu týchto prekladov sa používa cv2.warpAffine, ale na to potrebujeme prekladovú maticu.
Prekladová matica, T = 1 0 Tx
0 1 ty
T X, T y sú smery, v ktorých dochádza k posunom obrazu.
V čom je T X posunutý pozdĺž osi X (horizontálne)
T Y je posun pozdĺž osi Y (vertikálny)
# toto je afinná transformácia, ktorá jednoducho posúva pozíciu obrázka # na implementáciu týchto transformácií používame cv2.warpAffine. import cv2 import numpy ako np image = cv2.imread ('input.jpg') # uložiť výšku a šírku výšky obrázka , width = image.shape print (image.shape) quater_height, quater_width = výška / 4, šírka / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (obrázok, T, (šírka, výška)) tlač (T) cv2.imshow ('original_image', obrázok) cv2.waitKey (0) cv2.imshow (' Translation ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Výstup na konzolu - (183, 275) - výška a šírka
- T matica
]
3. Otočenie obrázka - Otočenie obrázka
Rotácia obrázka znamená otáčanie obrázka okolo bodu alebo bodu v strede obrázka, rovnako ako otočný bod funguje ako otočný bod.
Rovnako ako v preklade máme T maticu, pravdepodobne v rotácii máme M maticu
Rotačná matica, M matica = Cosθ-Sinin
Sinθ Cosθ
Kde θ je uhol rotácie, meraný v smere proti smeru hodinových ručičiek.
Je tiež potrebné poznamenať, že OpenCV vám umožňuje súčasne predávať a otáčať obrázky pomocou funkcie cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, uhol natočenia, mierka).
Na získanie rotácie obrazu stále používame funkciu warpAffine v opencv, ale namiesto prekladovej matice ako v predchádzajúcom prípade tu používame rotačnú maticu.
import CV2 import numpy ako np obrázok = cv2.imread ('input.jpg') výška, šírka = image.shape #divide je výška a šírka o 2 otočenie obrazu o vlastnej osi rotation_matrix = cv2.getRotationMatrix2D ((šírka / 2, výška / 2), 90,1) rotated_image = cv2.warpAffine (obrázok, rotation_matrix, (šírka, výška)) cv2.imshow ('pôvodný obrázok', obrázok) cv2.waitKey (0) cv2.imshow ('otočený obrázok ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Teraz je obrázok otočený o 90 stupňov, je orezaný kvôli veľkosti plátna, pretože veľkosť plátna zostáva rovnaká, ale kvôli rotácii sa veľkosť obrázka nezmestí do veľkosti plátna. Dalo by sa to upraviť nastavením mierky na záporné, ale umožňuje to čierne pozadie za obrazom.
Môžete teda nastaviť výšku a šírku obrázka tak, že ho predvídate alebo uhádnete, alebo existuje iná metóda otočenia obrázka, a to tak, že ho transponujete, ale obrázok by sa otočil o násobky 90 stupňov v smere proti smeru hodinových ručičiek.
4. Zmena mierky, zmena veľkosti a interpolácia
Zmena mierky a zmena veľkosti sú afinné transformácie, zmena veľkosti obrázka je to, čo sme robili dosť času a zaoberali sme sa tiež interpoláciou, napríklad keď meníte veľkosť obrázka na väčšiu veľkosť, v ktorej rozširujeme pixely, existujú určité medzery v pixelov a tu prichádza na rad interpolácia.
Môže k tomu dôjsť pri zväčšení obrázka z menšieho na väčší alebo pri zmenšení obrázka z väčšieho na menší.
Technicky je interpolácia metóda konštrukcie nových dátových bodov (pixelov) v rámci samostatnej množiny známych dátových bodov.
V OpenCV existujú rôzne typy interpolačných metód
cv2.INTER_AREA - dobré na zmenšenie alebo zmenšenie vzorkovania
cv2.INTER_NEAREST - najrýchlejší
cv2.LINEAR - dobré na zväčšenie alebo zväčšenie vzorkovania (predvolené)
cv2.CUBIC - lepšie
cv2.INTER_LANCZOS4 - najlepšie
# zmena veľkosti je pomocou funkcie cv2.resize veľmi jednoduchá, jej argumenty sú # cv2.resize (obrázok, dsize (veľkosť výstupného obrázka), x_scale, y_scale, interpolácia) import cv2 import numpy ako np image = cv2.imread ('vstup. jpg ') cv2.imshow (' Original_image ', obrázok) cv2.waitKey (0) # urobme obrázok 3/4 pôvodnej veľkosti, tj zmenší sa na 75% image_scaled = cv2.resize (obrázok, žiadny, fx = 0,75, fy = 0,75) # pretože lineárna interpolácia je predvolená metóda pre otvorený život, nemusíme ju implementovať ako funkciu. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # zdvojnásobme veľkosť nášho obrázku img_double = cv2.resize (obrázok, žiadny, fx = 2, fy = 2, interpolácia = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # urobme zmenu veľkosti podľa presných rozmerov image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Obrázkové pyramídy - ďalší spôsob zmeny veľkosti
Pyramídový obrázok označuje buď zväčšenie (zväčšenie), alebo zmenšenie (zmenšenie).
Je to jednoducho iný spôsob zmeny veľkosti, ktorý nám umožňuje ľahko a rýchlo meniť mierku obrázkov a zmenšiť tak zmenšenie výšky a šírky nového obrázka na polovicu.
To je užitočné pri výrobe detektorov objektov, ktoré zväčšujú obraz pri každom hľadaní objektu.
importovať obrázok cv2 = cv2.imread ('input.jpg') menší = cv2.pyrDown (obrázok) väčší = cv2.pyrUp (menší) cv2.imshow ('pôvodný', obrázok) cv2.waitKey (0) cv2.imshow („menšie“, menšie) cv2.waitKey (0) cv2.imshow („väčšie“, väčšie) cv2.waitKey (0) cv2.destroyAllWindows ()
Na väčšom obrázku si všimnete, že je stále rovnako veľký ako pôvodný obrázok, je trochu rozmazaný, pretože sa priamo prevádza z menšieho na väčší. Ale ak ju interpolujeme, kvalita obrazu sa oproti predchádzajúcemu zlepší, pretože interpolácia odhaduje pixely pri vyplňovaní medzier, keď je obrázok zväčšený.
Teraz spustenie rovnakého kódu, ale s kubickou interpoláciou, poskytuje lepšiu kvalitu veľkého obrázka. Nasledujúce obrázky zobrazujú porovnanie medzi pôvodným obrázkom, zväčšenou verziou obrázka, menším obrázkom a kubickou interpolovanou verziou menšieho obrázka.
importovať cv2 obrázok = cv2.imread ('input.jpg') menší = cv2.pyrDown (obrázok) väčší = cv2.pyrUp (menší) cv2.imshow ('pôvodný', obrázok) cv2.waitKey (0) cv2.imshow ('menšie', menšie) cv2.waitKey (0) cv2.imshow ('väčšie', väčšie) cv2.waitKey (0) # zvýšenie kvality prevedeného väčšieho obrázka z menšieho obrázka pomocou kubickej interpolácie img_double = cv2.resize (menšie, Žiadne, fx = 2, fy = 2, interpolácia = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
POZNÁMKA: Ak chcete vytvoriť viac malých kópií obrázkov, ktoré sa zmenšujú a zmenšujú, alebo viac veľkých kópií obrázkov, ktoré sa neustále zväčšujú, potom môžeme použiť pre slučky alebo zatiaľ čo slučky udržiavať vnútri funkcie pyrDown alebo pyrUp .
6. Orezanie - Vyrezanie požadovanej oblasti obrázka
Orezanie obrázkov znamená extrakciu segmentu obrázka.
OpenCV priamo nemá funkciu orezania, ale dá sa to ľahko urobiť pomocou numpy pomocou nižšie uvedeného kódu
Orezané = obrázok
Dali sme obrazové pole a pomocou indexovacích nástrojov alebo metódy do numpy definujeme začiatočný riadok na koncový riadok a začiatočný stĺpec na koniec stĺpca oddelený čiarkou, ktorá extrahuje obdĺžnik, ktorý chceme orezať, aby sme získali obrázok.
import cv2 import numpy ako np image = cv2.imread ('input.jpg') výška, šírka = image.shape # získajme začiatočné súradnice pixelov (vľavo hore od orezávacieho obdĺžnika) start_row, start_col = int (výška * 0,25), int (šírka *.25) # poďme na koniec súradníc pixelov (vpravo dole) end_row, end_col = int (výška *.75), int (šírka *.75) # jednoducho pomocou indexovania orezáme obdĺžnik, ktorý chceme orezať = obrázok cv2.imshow ("pôvodný obrázok", obrázok) cv2.waitKey (0) cv2.imshow ("orezaný obrázok", orezaný) cv2.waitKey (0) cv2.destroyAllWindows ()
Upozorňujeme, že hodnoty pixelov môžete použiť priamo namiesto parametra start_col alebo start_row. Uvádzajú sa iba kvôli ľahkej identifikácii používateľa.
7. Aritmetické operácie na zosvetlenie a stmavenie obrázkov
Aritmetické operácie v OpenCV v zásade spočívajú v pridaní alebo odčítaní matíc do obrázka, pričom pridanie alebo odčítanie matíc má vplyv na zvýšenie alebo zníženie jasu.
Takže aby sme pridali alebo odčítali matice, musíme ich vytvoriť a numpy má funkciu nazvanú ako np.ones, ktorá dáva maticiam rovnakej veľkosti ako náš obrázok.
import cv2 import numpy ako np image = cv2.imread ('input.jpg') #vytvorte svoju maticu a potom ju vynásobte škálovačom 100 ' # np.ones dáva maticu s rovnakou dimenziou ako náš obrázok so všetkými pričom v tomto prípade sú hodnoty 100 M = np.ones (image.shape, dtype = "uint8") * 100 # používame to na pridanie tejto matice M do nášho obrázka # všimnite si zvýšenie jasu added = cv2.add (obrázok, M) cv2.imshow ("Pridané", pridané) cv2.waitKey (0) # podobne môžeme tiež odčítať # všimnite si zníženie odčítaného jasu = cv2.subtract (obrázok, M) cv2.imshow ("odčítané", odčítané) cv2.waitKey (0) cv2.destroyAllWindows ()
Takto možno OpenCV použiť na použitie mnohých rôznych operácií spracovania obrazu na obrázku. V ďalšom návode budeme pokračovať s ďalšími funkciami manipulácie s obrázkami.