Computer Vision in Python con OpenCV

Quanto conosci OpenCV? In questo articolo di mostro come usare la Computer Vision in Python con OpenCV attraverso 7 features essenziali.

Computer Vision in Python con OpenCV

OpenCV: Computer Vision in Python

OpenCV è una famossissima libreria open-source di Computer Vision in Python. Questa libreria è stata sviluppata addirittura da Intel e permette di utilizzare moltissime funzionalità molto utili in ambito Computer Vision.

Il nome di questo package è abbastanza evocativo: Open (come open-source ma anche aperto a tutti), Computer Vision!

La Computer Vision è quella branca del Machine Learning che si occupa di analizzare le immagini, che sono dati non strutturati. Se vuoi saperne di più, qui ho scritto un articolo sul tema.

Tra le operazioni di Computer Vision con Python che possiamo fare tramite OpenCV, ci sono più di 2500 algoritmi per differenti task come object detection, image classification, image preprocessing e molto altro.

Inoltre OpenCV supporta molti linguaggi di programmazione, non solo Python!

Nel tutorial di oggi ti mostro 7 operazioni di Computer Vision con Python sfruttando la potenza di OpenCV:

  • Region of Interest (ROI)
  • Black and White Conversion
  • Image Resizing
  • Image Rotation
  • Blur
  • Canny (edge detection)
  • Template Matching

Useremo l’immagine di queste bellissime cascate per testare le funzionalità di OpenCV. Solo per l’ultimo caso, quello del Template Matching, cambieremo immagine, in quanto la natura di questo task è diversa dagli altri e ha bisogno di un’immagine diversa.

Computer Vision in Python con OpenCV

Prima di iniziare, se hai un account Medium ti consiglio di dare un’occhiata al mio profilo Davide Nardini, ho iniziato a scriverci da poco ma ho già creato un bel corpus di articoli! Qui puoi anche iscriverti per ricevere una mail su ogni mio nuovo articolo.

Sul mio profilo LinkedIn invece cerco di parlare ogni giorno di AI e Machine Learning.

Partiamo!

Region of Interest (ROI)

La regione di interesse, o ROI, è una porzione di immagine che può essere identificata per ulteriori elaborazioni, come attività di rilevamento o analisi.

Definendo una ROI, è possibile concentrarsi su aree specifiche di un’immagine, riducendo la complessità computazionale e migliorando le prestazioni di attività come il rilevamento di oggetti o il riconoscimento di caratteristiche.

import cv2
import os

image = cv2.imread("image.jpg")
x,y,w,h = 0,0,3000,1500
roi = image[y:y+h, x:x+w]
cv2.imwrite(os.path.join("outputs","roi.jpg"),roi)

Computer Vision in Python con OpenCV

Black and White Conversion

La conversione di un’immagine da a colori a bianco e nero (o scala di grigi), semplifica l’immagine riducendola a sfumatore digrigio.

Questo processo riduce la complessità dell’immagine, rendendola più facile e veloce da elaborare per gli algoritmi di computer vision.

È particolarmente utile nelle applicazioni in cui le informazioni sul colore non sono fondamentali, come nel caso del rilevamento dei bordi o delle operazioni di sogliatura.

import cv2
import os

image = cv2.imread("image.jpg")
bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite(os.path.join("outputs","bw.jpg"),bw)

Computer Vision in Python con OpenCV

Image Resizing

Il ridimensionamento delle immagini comporta la modifica delle dimensioni di un’immagine, ingrandendola o rimpicciolendola.

Questa funzione è fondamentale per standardizzare le dimensioni dell’immagine di input per i modelli di apprendimento automatico o per ottimizzare le immagini per la visualizzazione su diversi dispositivi con schermi di dimensioni e risoluzioni diverse.

Non andiamo direttamente a modificare l’immagine, ma ne cambiamo solo le dimensioni totali.

import cv2
import os

image = cv2.imread("image.jpg")
resized_image = cv2.resize(image, (200, 200))
cv2.imwrite(os.path.join("outputs","resized_image.jpg"),resized_image)

Computer Vision in Python con OpenCV

Image Rotation

La rotazione dell’immagine è il processo di rotazione di un’immagine di un certo angolo.

Se ruotiamo per esempio di 180 gradi, capovolgiamo l’immagine!

Questa trasformazione è essenziale per correggere l’orientamento delle immagini o per creare scenari di aumento dei dati nell’apprendimento automatico, dove variare l’orientamento delle immagini di addestramento può contribuire a migliorare la robustezza del modello. Si parla in questo caso di Data Augmentation.

import cv2
import os

image = cv2.imread('image.jpg')
(h, w) = image.shape[:2]
center = (w / 2, h / 2)

## 180 degrees rotation
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated_image = cv2.warpAffine(image, M, (w, h))

cv2.imwrite(os.path.join("outputs","rotated_image.jpg"),rotated_image)

Computer Vision in Python con OpenCV

Blur

La sfocatura (blur) è una tecnica utilizzata per ridurre il rumore e i dettagli dell’immagine, spesso come fase di pre-elaborazione prima di ulteriori analisi, come il rilevamento dei bordi o il riconoscimento degli oggetti.

Può aiutare a rimuovere piccole imperfezioni o a levigare un’immagine.

Le tecniche di sfocatura comuni in OpenCV includono la sfocatura gaussiana, la sfocatura mediana e il filtraggio bilaterale.

import cv2
import os

image = cv2.imread("image.jpg")
blurred_image = cv2.blur(image, (50, 50))
cv2.imwrite(os.path.join("outputs","blurred_image.jpg"),blurred_image)

Computer Vision in Python con OpenCV

Canny (Edge Detection)

L’algoritmo di Canny è una tecnica di rilevamento dei bordi che identifica i confini degli oggetti all’interno di un’immagine.

Funziona rilevando le aree ad alto gradiente in cui l’intensità dell’immagine cambia in modo significativo.

Il rilevamento dei bordi Canny è ampiamente utilizzato perché è robusto, efficiente e in grado di marcare i bordi con grande precisione. Si tratta però solo di uno dei possibili algoritmi di Edge Detection, task molto importante per la Computer Vision in Python con OpenCV e non solo.

Computer Vision in Python con OpenCV

Template Matching

Il Template Matching è un metodo per cercare e trovare la posizione di un’immagine più piccola all’interno di un’immagine più grande.

L’immagine più piccola è chiamata template, ed è quello che vogliamo ricercare nell’immagine più grande.

L’algoritmo di Template Matching fa semplicemente scorrere il template sull’immagine di input (come nella convoluzione 2D) e confronta il template con ogni porzione di immagine input. In questo modo, quando c’è una certa similarità tra porzione di immagine input e template, l’algoritmo trova la corrispondenza.

E’ una sorta di Object Detection senza addestramento. Può essere utile quando la variazione è davvero minima, non ha infatti molta forza di generalizzazione.

Questa tecnica è comunque utile per riconoscere oggetti o caratteristiche all’interno di un’immagine che corrispondono a un template noto, soprattutto in applicazioni come il controllo qualità o la videosorveglianza, dove è necessario identificare modelli o oggetti specifici e predefiniti.

Ecco l’immagine originale:

template matching opencv

Questo è il template:

template matching opencv

import cv2
import os
import numpy as np

image = cv2.imread('image_tm.jpg')
template = cv2.imread('template.jpg')

w, h = template.shape[:-1]
res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

threshold = 0.5

loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 1)

cv2.imwrite(os.path.join("outputs","tm.jpg"),image)

template matching opencv

Computer Vision in Python con OpenCV: conclusioni

In questo tutorial vi ho mostrato come utilizzare algoritmi di computer vision in Python utilizzando OpenCV. Potete trovare tutto il codice e gli esempi nel mio repository di GitHub OpenCV Cookbook Snippets.

Spero che questo tutorial vi sia stato utile, se così fosse aiutami a far crescere Pulp Learning!