- 1. Transformace obrazu - transformace afinní a neafinická
- 2. Překlady obrázků - Pohyb obrazu nahoru, dolů, doleva a doprava
- 3. Rotace obrazu - Otáčení obrazu
- 4. Škálování, změna velikosti a interpolace
- 5. Obrázkové pyramidy - další způsob změny velikosti
- 6. Oříznutí - Vystřihněte požadovanou oblast obrazu
- 7. Aritmetické operace pro zesvětlení a ztmavení obrázků
V předchozím tutoriálu jsme se dozvěděli o OpenCV a provedli jsme některé základní zpracování obrazu, jako je škálování šedé, sytost barev, histogram, barevné prostory, komponenta RGB atd. Jak bylo řečeno v předchozím tutoriálu, OpenCV je Open Source Commuter Vision Library, Rozhraní C ++, Python a Java a podporuje Windows, Linux, Mac OS, iOS a Android. Lze jej tedy snadno nainstalovat na Raspberry Pi s prostředím Python a Linux. A Raspberry Pi s OpenCV a připojenou kamerou lze použít k vytvoření mnoha aplikací pro zpracování obrazu v reálném čase, jako je detekce obličeje, zámek obličeje, sledování objektu, detekce poznávací značky automobilu, domácí bezpečnostní systém atd.
V tomto kurzu se podíváme, jak budeme manipulovat s obrázkem pomocí OpenCV. Zde se naučíme použít následující funkci na obrázek pomocí OpenCV:
- Transformace obrazu - transformace afinní a neafinická
- Překlady obrázků - Pohyb obrazu nahoru, dolů, doleva a doprava
- Rotace obrazu - Otáčení obrazu
- Škálování, změna velikosti a interpolace
- Obrázkové pyramidy - další způsob změny velikosti
- Oříznutí - Vyříznutí požadované oblasti obrazu
- Aritmetické operace pro zesvětlení a ztmavení obrázků
1. Transformace obrazu - transformace afinní a neafinická
Transformace jsou geometrická zkreslení přijatá na obraz, zkreslení zde rozhodně neznamená chyby, ale typ korekce k opravě problémů s perspektivou vyplývajících z bodu, kde byl snímek zachycen. Existují dva typy transformací obrazu - Affine a Non-Affine
Afinní transformace jsou tří typů, škálování, rotace a překlad, důležitá věc v afinních transformacích je, že čáry jsou paralelní před a po transformaci obrazu.
Non-afinní transformace nebo projektivní transformace nezachovává rovnoběžnost, délku nebo úhel, zachovává však kolinearitu a incidenci, kolinearita znamená, že dva body leží na stejné přímce.
Non-afinní transformace jsou v počítačovém vidění velmi běžné a jsou generovány z různých úhlů kamery. Non-afinní nebo projektivní transformace se také nazývají homografie.
2. Překlady obrázků - Pohyb obrazu nahoru, dolů, doleva a doprava
Překlad obrazu posouvá obraz nahoru, dolů, doleva a doprava a dokonce i diagonálně, pokud implementujeme překlad xay současně.
Nyní pro provádění překladů obrázků používáme funkci warpAffine opencv, k implementaci těchto překladů se používá cv2.warpAffine, ale k tomu potřebujeme překladovou matici.
Překladová matice, T = 1 0 Tx
0 1 ty
T X, T y jsou směry, ve kterých dochází k posunům obrazu.
Přičemž T X se posouvá podél osy X (horizontálně)
T Y je posun podél osy Y (svisle)
# toto je afinní transformace, která jednoduše posune pozici obrázku # k implementaci těchto transformací používáme cv2.warpAffine. import cv2 import numpy jako np image = cv2.imread ('input.jpg') # uložit výšku a šířku výšky obrázku , width = image.shape print (image.shape) quater_height, quater_width = výška / 4, šířka / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (obrázek, T, (šířka, výška)) tisk (T) cv2.imshow ('original_image', obrázek) cv2.waitKey (0) cv2.imshow (' Translation ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Výstup konzoly - (183, 275) - výška a šířka
- T matice
]
3. Rotace obrazu - Otáčení obrazu
Rotace obrazu je otáčení obrazu kolem bodu nebo bodu ve středu obrazu, stejně jako rotační bod funguje jako otočný čep.
Stejně jako v překladu máme matici T, pravděpodobně v rotaci máme matici M.
Rotační matice, M matice = Cosθ -Sinθ
Sinθ Cosθ
Kde θ je úhel otáčení, měřeno proti směru hodinových ručiček.
Je třeba si také uvědomit, že OpenCV vám umožňuje prodávat a otáčet současně obraz pomocí funkce cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, úhel otáčení, měřítko)
K získání rotace obrazu stále používáme funkci warpAffine v opencv, ale místo matice překladu jako v předchozím případě zde používáme rotační matici.
import cv2 import numpy jako np image = cv2.imread ('input.jpg') height, width = image.shape # rozdělte výšku a šířku o 2, aby se obrázek otočil kolem středu , výška / 2), 90,1) rotated_image = cv2.warpAffine (obrázek, rotace_matice, (šířka, výška)) cv2.imshow ('původní obrázek', obrázek) cv2.waitKey (0) cv2.imshow ('otočený obrázek ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nyní je obrázek otočený o 90 stupňů, je oříznut kvůli velikosti plátna, protože velikost plátna zůstává stejná, ale kvůli rotaci se velikost obrázku nevejde do velikosti plátna. Lze jej upravit nastavením měřítka na záporné, ale umožňuje černé pozadí za obrazem.
Můžete tedy nastavit výšku a šířku obrazu tak, že jej předvídáte nebo uhodnete, nebo existuje jiný způsob otočení obrázku provedením, ale obraz by se otočil o násobky 90 stupňů proti směru hodinových ručiček.
4. Škálování, změna velikosti a interpolace
Změna měřítka a změna velikosti jsou afinní transformace, změna velikosti obrazu je to, co jsme udělali docela dlouho, a také jsme se zabývali interpolací, jako když měníte velikost obrázku na větší velikost, ve které rozšiřujeme pixely, existují určité mezery v pixelů a to je místo, kde přichází interpolace.
Může k tomu dojít při zvětšení velikosti obrázku z menšího na větší nebo zmenšení velikosti obrázku z většího na menší.
Technicky je interpolace metoda konstrukce nových datových bodů (pixelů) v rámci diskrétní sady známých datových bodů.
V OpenCV existují různé typy interpolačních metod
cv2.INTER_AREA - dobré pro zmenšování nebo zmenšování vzorků
cv2.INTER_NEAREST - nejrychlejší
cv2.LINEAR - dobré pro zvětšení nebo zvětšení vzorkování (výchozí)
cv2.CUBIC - lepší
cv2.INTER_LANCZOS4 - nejlepší
# změna velikosti je pomocí funkce cv2.resize velmi snadná, její argumenty jsou # cv2.resize (obrázek, dsize (velikost výstupního obrázku), x_scale, y_scale, interpolace) import cv2 import numpy jako np image = cv2.imread ('vstup. jpg ') cv2.imshow (' Original_image ', obrázek) cv2.waitKey (0) # udělejme obrázek 3/4 původní velikosti obrázku, tj. zmenší se na 75% image_scaled = cv2.resize (obrázek, žádný, fx = 0,75, fy = 0,75) # protože lineární interpolace je výchozí metoda pro open cv, nemusíme ji implementovat jako funkci. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # pojďme zdvojnásobit velikost našeho obrazu img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # udělejme změnu velikosti pomocí přesných rozměrů 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é pyramidy - další způsob změny velikosti
Pyramidový obrázek označuje buď upscaling (zvětšování obrázků) nebo downscaling (zmenšování obrázků).
Je to prostě jiný způsob změny velikosti, který nám umožňuje snadno a rychle měnit měřítko obrázků a zmenšit tak zmenšení výšky a šířky nového obrázku na polovinu.
To je užitečné při výrobě detektorů objektů, které mění měřítko obrázků pokaždé, když hledá objekt.
import cv2 obrázek = cv2.imread ('input.jpg') menší = cv2.pyrDown (obrázek) větší = cv2.pyrUp (menší) cv2.imshow ('originál', obrázek) cv2.waitKey (0) cv2.imshow ('menší', menší) cv2.waitKey (0) cv2.imshow ('větší', větší) cv2.waitKey (0) cv2.destroyAllWindows ()
Ve větším obrázku si všimnete, že je stále stejně velký jako původní obrázek, je trochu rozmazaný, protože se přímo převádí z menšího obrázku na větší. Pokud to však interpolujeme, kvalita obrazu se oproti předchozímu zlepší, protože interpolace odhaduje pixely při vyplňování mezer při zvětšení obrazu.
Nyní běží stejný kód, ale s kubickou interpolací poskytuje lepší kvalitu velkého obrazu. Níže uvedené obrázky ukazují srovnání mezi původním obrázkem, zvětšenou verzí obrázku, menším obrázkem a kubickou interpolovanou verzí menšího obrázku.
import cv2 obrázek = cv2.imread ('input.jpg') menší = cv2.pyrDown (obrázek) větší = cv2.pyrUp (menší) cv2.imshow ('originál', obrázek) cv2.waitKey (0) cv2.imshow ('menší', menší) cv2.waitKey (0) cv2.imshow ('větší', větší) cv2.waitKey (0) # zvýšení kvality převedeného většího obrázku z menšího obrazu pomocí kubické interpolace img_double = cv2.resize (menší, Žádné, fx = 2, fy = 2, interpolace = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
POZNÁMKA: Pokud chcete vytvořit více malých kopií obrazů, které se zmenšují a zmenšují nebo více velkých kopií obrazů, které se neustále zvětšují, pak můžeme použít pro smyčky nebo zatímco smyčky udržují uvnitřfunkce pyrDown nebo pyrUp .
6. Oříznutí - Vystřihněte požadovanou oblast obrazu
Oříznutí obrázků znamená extrahování segmentu obrazu.
OpenCV přímo nemá funkci oříznutí, ale lze to snadno provést pomocí numpy pomocí níže uvedeného kódu
Oříznuto = obrázek
Vložili jsme obrazové pole a pomocí indexovacích nástrojů nebo metody do numpy definujeme počáteční řádek na konec řádku a začátek sloupce na konec sloupce odděleny čárkou, která extrahuje obdélník, který chceme oříznout, abychom získali obrázek.
import cv2 import numpy jako np image = cv2.imread ('input.jpg') výška, šířka = image.shape # pojďme získat počáteční souřadnice pixelů (vlevo nahoře od ořezového obdélníku) start_row, start_col = int (výška * 0,25), int (width *.25) # pojďme získat koncové pixelové souřadnice (vpravo dole) end_row, end_col = int (výška *.75), int (width *.75) # jednoduše použijte indexaci k oříznutí obdélníku, který si přejeme oříznout = obrázek cv2.imshow ("původní obrázek", obrázek) cv2.waitKey (0) cv2.imshow ("oříznutý obrázek", oříznutý) cv2.waitKey (0) cv2.destroyAllWindows ()
Všimněte si, že hodnoty pixelů můžete použít přímo namísto start_col nebo start_row , jsou uvedeny pouze pro snadnou identifikaci uživatele.
7. Aritmetické operace pro zesvětlení a ztmavení obrázků
Aritmetické operace v OpenCV v zásadě spočívají v přidávání nebo odečítání matic do obrazu, přidávání nebo odečítání matic má vliv na zvýšení nebo snížení jasu.
Chcete-li tedy přidat nebo odečíst matice, musíme je vytvořit a numpy má funkci nazvanou jako np.ones, která dává maticím stejné velikosti jako náš obrázek.
import cv2 import numpy jako np image = cv2.imread ('input.jpg') #vytvořte vlastní matici a poté ji vynásobte škálovačem 100 ' # np.ones dává matici se stejnou dimenzí jako náš obrázek se všemi hodnoty jsou v tomto případě 100 M = np.ones (image.shape, dtype = "uint8") * 100 # použijeme to pro přidání této matice M do našeho obrázku # všimněte si zvýšení jasu added = cv2.add (obrázek, M) cv2.imshow ("Přidáno", přidáno) cv2.waitKey (0) # podobně můžeme také odečíst # všimněte si snížení jasu odečteno = cv2.subtract (obrázek, M) cv2.imshow ("odečteno", odečteno) cv2.waitKey (0) cv2.destroyAllWindows ()
Takto lze OpenCV použít k aplikaci mnoha různých operací zpracování obrazu na obrázek. V dalším kurzu budeme pokračovat s dalšími funkcemi pro manipulaci s obrázky.