- 1. Trasformazioni di immagine - Trasformazione affine e non affine
- 2. Traduzioni di immagini - Spostamento di immagini su, giù, sinistra e destra
- 3. Rotazione dell'immagine - Rotazione dell'immagine
- 4. Scalatura, ridimensionamento e interpolazione
- 5. Piramidi di immagini - Un altro modo per ridimensionare
- 6. Ritaglio - Ritaglia la regione dell'immagine desiderata
- 7. Operazioni aritmetiche per schiarire e scurire le immagini
Nel tutorial precedente, abbiamo imparato a conoscere OpenCV e abbiamo eseguito alcune elaborazioni di immagini di base utilizzandolo come scala dei grigi, saturazione del colore, istogramma, spazi colore, componente RGB ecc. Come detto nel tutorial precedente, OpenCV è Open Source Commuter Vision Library che ha Interfacce C ++, Python e Java e supporta Windows, Linux, Mac OS, iOS e Android. Quindi può essere facilmente installato in Raspberry Pi con Python e ambiente Linux. E Raspberry Pi con OpenCV e telecamera collegata può essere utilizzato per creare molte applicazioni di elaborazione delle immagini in tempo reale come Face Detection, Face Lock, Object Tracking, Auto Number Plate Detection, Home Security System, ecc
In questo tutorial, vedremo come manipoleremo l'immagine usando OpenCV. Qui impareremo ad applicare la seguente funzione su un'immagine utilizzando OpenCV:
- Trasformazioni di immagini: trasformazione affine e non affine
- Traduzioni di immagini - Spostamento dell'immagine su, giù, sinistra e destra
- Rotazione dell'immagine: rotazione dell'immagine
- Ridimensionamento, ridimensionamento e interpolazione
- Piramidi di immagini: un altro modo per ridimensionare
- Ritaglio: ritaglia la regione dell'immagine desiderata
- Operazioni aritmetiche per schiarire e scurire le immagini
1. Trasformazioni di immagine - Trasformazione affine e non affine
Le trasformazioni sono distorsioni geometriche attuate su un'immagine, le distorsioni qui non significano certamente errori ma un tipo di correzione per correggere i problemi di prospettiva derivanti dal punto in cui l'immagine è stata catturata. Esistono due tipi di trasformazioni dell'immagine : Affine e Non-Affine
Le trasformazioni affini sono di tre tipi: ridimensionamento, rotazione e traslazione, la cosa importante nelle trasformazioni affini è che le linee siano parallele prima e dopo le trasformazioni dell'immagine.
Trasformazioni non affini o trasformazioni proiettive non preserva il parallelismo, la lunghezza o l'angolo, ma preserva la collinearità e l'incidenza, collinearità significa che i due punti giacciono sulla stessa retta.
Le trasformazioni non affini sono molto comuni nella visione artificiale e vengono generate da diverse angolazioni della telecamera. Le trasformazioni non affini o proiettive sono anche chiamate omografia.
2. Traduzioni di immagini - Spostamento di immagini su, giù, sinistra e destra
La traduzione dell'immagine sta spostando l'immagine su, giù, sinistra e destra e persino in diagonale se implementiamo la traduzione x e y allo stesso tempo.
Ora per eseguire traduzioni di immagini utilizziamo la funzione warpAffine di opencv, cv2.warpAffine viene utilizzata per implementare queste traduzioni ma per questo abbiamo bisogno di una matrice di traduzione.
Matrice di traduzione, T = 1 0 Tx
0 1 ty
T X, T y sono le direzioni in cui avviene lo spostamento dell'immagine.
In cui la T X è spostata lungo l'asse X (orizzontale)
T Y è spostato lungo l'asse Y (verticale)
# questa è una trasformazione affine che sposta semplicemente la posizione di un'immagine # usiamo cv2.warpAffine per implementare queste trasformazioni. import cv2 import numpy come np image = cv2.imread ('input.jpg') # memorizza l'altezza e la larghezza dell'immagine height, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (width, height)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Traduzione ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Uscita console - (183, 275) - altezza e larghezza
- Matrice T.
]
3. Rotazione dell'immagine - Rotazione dell'immagine
La rotazione dell'immagine è la rotazione di un'immagine attorno a un punto o al punto al centro dell'immagine, proprio come il punto rotante agisce come un perno.
Come nella traduzione abbiamo una matrice T, probabilmente in rotazione abbiamo una matrice M.
Matrice di rotazione, matrice M = Cosθ -Sinθ
Sinθ Cosθ
Dove θ è l'angolo di rotazione, misurato in senso antiorario.
Inoltre c'è una cosa da notare che OpenCV ti consente di vendere e ruotare l'immagine contemporaneamente utilizzando la funzione, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angolo di rotazione, scala)
Usiamo ancora la funzione warpAffine di opencv per ottenere la rotazione dell'immagine ma invece della matrice di traslazione come nel caso precedente qui usiamo la matrice di rotazione.
import cv2 import numpy come np image = cv2.imread ('input.jpg') height, width = image.shape #divide l'altezza e la larghezza per 2 per ruotare l'immagine attorno al suo centro rotation_matrix = cv2.getRotationMatrix2D ((width / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('original image', image) cv2.waitKey (0) cv2.imshow ('immagine ruotata ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Ora l'immagine viene ruotata di 90 gradi, viene ritagliata a causa delle dimensioni della tela, poiché la dimensione della tela rimane la stessa ma a causa della rotazione la dimensione dell'immagine non si adatta alle dimensioni della tela. Potrebbe essere regolato impostando il fattore di scala su negativo, ma consente uno sfondo nero dietro l'immagine.
Quindi puoi impostare l'altezza e la larghezza dell'immagine anticipandola o indovinandola o c'è un altro metodo per ruotare l'immagine trasponendola, ma ruoterebbe l'immagine per multipli di 90 gradi in senso antiorario.
4. Scalatura, ridimensionamento e interpolazione
Il ridimensionamento e il ridimensionamento sono trasformazioni affini, il ridimensionamento dell'immagine è ciò che abbiamo fatto un bel po 'di tempo e ci siamo anche occupati dell'interpolazione, come quando ridimensioniamo l'immagine a una dimensione maggiore in cui stiamo espandendo i pixel, ci sono alcune lacune nel pixel ed è qui che entra in gioco l'interpolazione.
Può verificarsi aumentando la dimensione dell'immagine da più piccola a più grande o diminuendo la dimensione dell'immagine da più grande a più piccola.
Tecnicamente, l' interpolazione è un metodo per costruire nuovi punti dati (pixel), all'interno di un insieme discreto di punti dati noti.
Esistono vari tipi di metodi di interpolazione in OpenCV come
cv2.INTER_AREA - buono per restringere o ridurre il campionamento
cv2.INTER_NEAREST - il più veloce
cv2.LINEAR - buono per lo zoom o il campionamento verso l'alto (predefinito)
cv2.CUBIC - meglio
cv2.INTER_LANCZOS4 - migliore
# il ridimensionamento è molto semplice usando la funzione cv2.resize, i suoi argomenti sono # cv2.resize (image, dsize (output image size), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # rendiamo l'immagine 3/4 della dimensione originale dell'immagine, cioè ridimensiona al 75% image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) # poiché l'interpolazione lineare è il metodo predefinito per cv aperto, non è necessario implementarlo come funzione. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # raddoppia la dimensione della nostra immagine img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # ridimensioniamo in base alle dimensioni esatte image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', 'scaling_exact' image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Piramidi di immagini - Un altro modo per ridimensionare
L'immagine piramidale si riferisce all'upscaling (ingrandimento delle immagini) o al downscaling (riduzione delle immagini).
È semplicemente un modo diverso di ridimensionare che ci consente di ridimensionare facilmente e rapidamente le immagini, ridimensionando riducendo l'altezza e la larghezza della nuova immagine della metà.
Ciò è utile quando si realizzano rilevatori di oggetti che ridimensionano le immagini ogni volta che cerca un oggetto.
importa immagine cv2 = cv2.imread ('input.jpg') più piccolo = cv2.pyrDown (immagine) più grande = cv2.pyrUp (più piccolo) cv2.imshow ('originale', immagine) cv2.waitKey (0) cv2.imshow ('più piccolo', più piccolo) cv2.waitKey (0) cv2.imshow ('più grande', più grande) cv2.waitKey (0) cv2.destroyAllWindows ()
Nell'immagine più grande noterai che essendo ancora della stessa dimensione dell'immagine originale è leggermente sfocata perché viene convertita direttamente da un'immagine più piccola in un'immagine più grande. Ma se la interpoliamo, la qualità dell'immagine migliora rispetto alla precedente perché l'interpolazione stima i pixel riempiendo gli spazi quando l'immagine viene ingrandita.
Ora l'esecuzione dello stesso codice ma con l'interpolazione cubica offre una migliore qualità dell'immagine di grandi dimensioni. Le immagini seguenti mostrano il confronto tra l'immagine originale, la versione ingrandita dell'immagine, l'immagine più piccola e la versione cubica interpolata dell'immagine più piccola.
importa immagine cv2 = cv2.imread ('input.jpg') più piccolo = cv2.pyrDown (immagine) più grande = cv2.pyrUp (più piccolo) cv2.imshow ('originale', immagine) cv2.waitKey (0) cv2.imshow ('più piccolo', più piccolo) cv2.waitKey (0) cv2.imshow ('più grande', più grande) cv2.waitKey (0) # aumenta la qualità dell'immagine più grande convertita da un'immagine più piccola usando l'interpolazione cubica img_double = cv2.resize (più piccolo, Nessuno, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOTA: Se si desidera creare più copie piccole di immagini sempre più piccole o più copie grandi di immagini in continua crescita, è possibile utilizzare icicli for o while mantenendo lafunzione pyrDown o pyrUp .
6. Ritaglio - Ritaglia la regione dell'immagine desiderata
Ritagliare immagini si riferisce all'estrazione di un segmento di immagine.
OpenCV direttamente non ha la funzione di ritaglio ma può essere facilmente fatto da numpy usando il codice seguente
Ritagliata = immagine
Mettiamo l'array di immagini e utilizzando gli strumenti o il metodo di indicizzazione in numpy, definiamo la riga iniziale alla riga finale e la colonna iniziale alla fine della colonna separati da una virgola che estrae il rettangolo che vogliamo ritagliare per ottenere l'immagine.
import cv2 import numpy come np image = cv2.imread ('input.jpg') height, width = image.shape # otteniamo le coordinate dei pixel iniziali (in alto a sinistra del rettangolo di ritaglio) start_row, start_col = int (height *.25), int (width *.25) # otteniamo le coordinate dei pixel finali (in basso a destra) end_row, end_col = int (height *.75), int (width *.75) #semplicemente usa l'indicizzazione per ritagliare il rettangolo che desideriamo ritagliare = immagine cv2.imshow ("immagine originale", immagine) cv2.waitKey (0) cv2.imshow ("immagine ritagliata", ritagliata) cv2.waitKey (0) cv2.destroyAllWindows ()
Nota che puoi usare i valori dei pixel direttamente invece di start_col o start_row , sono dati solo per ottenere una facile identificazione per l'utente.
7. Operazioni aritmetiche per schiarire e scurire le immagini
Le operazioni aritmetiche in OpenCV sono fondamentalmente l'aggiunta o la sottrazione di matrici all'immagine, l'aggiunta o la sottrazione di matrici ha effetto sull'aumento o la diminuzione della luminosità.
Quindi per aggiungere o sottrarre matrici dobbiamo crearle e numpy ha una funzione chiamata np.ones che fornisce matrici della stessa dimensione di 1 della nostra immagine.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #crea una matrice della propria, quindi moltiplicala per uno scaler di 100 ' # np.ones dà una matrice con la stessa dimensione della nostra immagine con tutto i valori sono 100 in questo caso M = np.ones (image.shape, dtype = "uint8") * 100 # usiamo questo per aggiungere questa matrice M alla nostra immagine # nota l'aumento di luminosità aggiunto = cv2.add (immagine, M) cv2.imshow ("Aggiunto", aggiunto) cv2.waitKey (0) # analogamente possiamo anche sottrarre #notice la diminuzione della luminosità sottratta = cv2.subtract (immagine, M) cv2.imshow ("sottratto", sottratto) cv2.waitKey (0) cv2.destroyAllWindows ()
Questo è il modo in cui OpenCV può essere utilizzato per applicare molte diverse operazioni di elaborazione delle immagini sull'immagine. Continueremo con altre funzioni di manipolazione delle immagini nel prossimo tutorial.