Non hai mai sentito prima la Libreria OpenCv ?
Ti spieghiamo subito a cosa serve e che progetti permette di fare
OpenCV è un ottimo strumento per l'elaborazione delle immagini e l'esecuzione di attività di visione artificiale. È una libreria open source che può essere utilizzata per eseguire attività come il rilevamento dei volti, il rilevamento delle obiezioni, il rilevamento dei punti di riferimento e molto altro. Supporta più lingue tra cui Python, Java C++. Anche se, per questo articolo, ci limiteremo solo a Python.
La libreria è dotata di centinaia di funzioni e algoritmi utili, tutti a nostra disposizione gratuitamente. Alcune di queste funzioni sono molto comuni e vengono utilizzate in quasi tutte le attività di visione artificiale. Mentre molte delle funzioni sono ancora inesplorate e non hanno ancora ricevuto molta attenzione.
In questo articolo, vedremo alcune delle funzioni più sorprendenti di OpenCV che puoi utilizzare per molte fantastiche applicazioni.
Prerequisiti :
Se non sai perchè utilizzeremo python, clicca qui
Se non hai ancora installato Python, clicca qui
Se non sai come scaricare e gestire le librerie, clicca qui
Se non sai cosa sia un Dataset, clicca qui
Indice :
Rimuovere Watermark usando OpenCV, Python
Le filigrane potrebbero essere davvero fastidiose e arriva un momento nella vita di tutti in cui cerchiamo in tutto Internet un programma per rimuovere quel piccolo pezzo di testo. Per fortuna, la tua ricerca finisce qui. Usando OpenCV, possiamo consentire questo compito con meno di 10 righe di codice.
Iniziamo importando le librerie richieste (che sono OpenCV e Numpy) e leggendo l'immagine, contenente la filigrana. Quindi cambiamo lo spazio colore da BGR a HSV. Stiamo utilizzando il formato colore HSV in quanto aiuta a ottenere un'immagine maschera migliore che creeremo nel passaggio successivo. Una maschera è un'immagine che ha solo due valori che sono bianco e nero. Lo scopo della maschera è applicare modifiche solo nelle parti specifiche di un'immagine. Per il nostro scopo, l'immagine della maschera dovrebbe contenere valori bianchi ovunque sia presente la filigrana e neri ovunque.
Per creare la nostra immagine maschera, utilizzeremo la sogliatura che ho già eseguito per questa immagine. Che cosa fa la soglia è, dice se un valore si trova nell'intervallo dato o meno. Se desideri utilizzare un'altra immagine, puoi trovare i tuoi valori di soglia utilizzando questo pezzo di codice. Ora, abbiamo l'immagine della maschera, possiamo chiamare la funzione principale richiesta per eseguire questo compito. Useremo la funzione cv2.inpaint() sull'immagine della nostra maschera per rimuovere la filigrana. Ciò che fa realmente la funzione è che consente di rimuovere piccoli disturbi dall'immagine utilizzando un metodo chiamato inpainting.
La funzione può essere utilizzata con due algoritmi. Uno si basa sul metodo di marcia mentre l'altro si basa sulla meccanica dei fluidi. Puoi leggere di più su di loro e sulla funzione cv2.inpaint() qui . Per fortuna, non dobbiamo scrivere quegli algoritmi da soli. Possiamo abilitare un oggetto flag all'interno della funzione cv2.inpaint() e scegliere qualsiasi algoritmo che vogliamo usare.
import cv2
import numpy as np
img=cv2.imread(path) # inserisci il percorso dell'immagine
hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
l_b=np.array([0,0,220])
u_b=np.array([255,255,255])
maschera=cv2.inRange(hsv,l_b,u_b)
dst = cv2.inpaint(img,maschera,5,cv2.INPAINT_TELEA)
#dst = cv2.inpaint(img, maschera, 5, cv2.INPAINT_NS)
Puoi controllare i risultati dall'immagine sotto. La nostra funzione di ridipintura ha funzionato bene. Se pensi di dover ottenere risultati migliori, puoi provare a regolare i valori di soglia. È inoltre possibile utilizzare metodi come la sfocatura gaussiana per migliorare la qualità dell'immagine della maschera.
Rimozione dello sfondo utilizzando OpenCV e python
Quando si tratta di immagini, il rumore di fondo è molto comune. Utilizzando questa funzione di OpenCV, puoi estrarre solo informazioni utili dall'immagine e scartare tutto ciò che è presente in background. Una cosa buona è che ti permette di inserire la forma di output della tua immagine finale in modo da non dover indovinare quale sarà la dimensione della tua immagine. Per questo compito, utilizzerò l'immagine fornita.
Il nostro compito è rimuovere lo sfondo ed estrarre il primo piano (il taccuino) dall'immagine. La funzione che useremo richiede due insiemi di punti. Il primo set conterrà 4 punti che copriranno la regione in primo piano. Nell'immagine sopra, se guardi da vicino, sarai in grado di vedere 4 punti. Il primo set saranno le coordinate di questi punti. L'altro insieme di punti saranno i punti di confine della nostra immagine di output. Successivamente, useremo la funzione cv2.getPerspective() che ci darà la matrice di output e la funzione cv2.warpPerspective convertirà quella matrice nella forma desiderata.
import cv2
import numpy as np
img = cv2.imread(path) # inserisci il percorso dell'immagine
pts1 = np.float32([[57 , 49],[419 , 45],[414 , 477],[56 , 475]])
pts2 = np.float32([[0,0],[img.shape[0],0],[img.shape[0],img.shape[1]],[0,img.shape[1]] ])
matrice = cv2.getPerspectiveTransform(pts1,pts2)
risultato = cv2.warpPerspective(img, matrice, (512,512))
cv2.imshow("risultato",risultato)
cv2.waitKey(0)
Crea filtri alle immagini usando OpenCV
A differenza dei dati testuali, le immagini possono essere utilizzate per estrarre diverse funzionalità. Queste caratteristiche evidenziano le proprietà dell'immagine. Possiamo usare queste funzionalità per sfocare l'immagine, rendere più nitida l'immagine, estrarre i bordi dall'immagine e molto altro. Per eseguire questo compito utilizzeremo il concetto di convoluzione. La convoluzione è fondamentalmente il processo di applicazione del kernel su ogni pixel dell'immagine. nocciolo? Un kernel è una piccola matrice costituita da numeri che di solito si sommano all'unità. A seconda dei valori del kernel, possiamo estrarre diverse funzionalità da un'immagine.
In questo compito, andremo semplicemente a sfocare un'immagine usando le convoluzioni. Useremo il filtro sottostante (kernel) per il nostro compito. Questo kernel è anche chiamato filtro della media. Come suggerisce il nome, fa la media dei pixel circostanti e assegna il valore al pixel centrale. Puoi anche scegliere un diverso insieme di valori come preferisci, assicurati solo che tutti i valori si sommano a 1.
Dopo aver letto l'immagine, creeremo il nostro kernel e ne faremo un array NumPy. Quindi chiameremo la funzione cv2.filter2d(), che prenderà l'immagine di input, la profondità e il kernel. E questo è tutto. Possiamo semplicemente mostrare i nostri risultati.
import cv2
import numpy as np
img = cv2.imread(path) # inserisci il percorso dell'immagine
kernel = np.array([[1,1,1],
[1,1,1],
[1,1,1]])
kernel = kernel/9
res = cv2.filter2D(img, -1, kernel)
cv2.imshow("img",res)
cv2.waitKey(0)
Puoi usare questo link per trovare filtri più sorprendenti che puoi applicare alle tue immagini preferite.
Converti immagini in cartoni usando OpenCV
Tutti amano i cartoni animati e cosa c'è di meglio quando puoi crearne uno con la tua foto preferita. Con OpenCV, puoi svolgere facilmente questo compito utilizzando alcune delle funzioni di base. Fondamentalmente, l'intero processo include tre passaggi.
Estrai i bordi dall'immagine.
Applicare l'uniformità dell'immagine all'immagine in ingresso.
Aggiungi i risultati dei passaggi 1 e 2.
Iniziamo leggendo la nostra immagine e convertendola in scala di grigi. Possiamo usare questa versione in scala di grigi dell'immagine e inviarla alla funzione cv2.adaptiveThreshold per ottenere i bordi dell'immagine. Puoi anche usare l'applicazione precedente per estrarre i bordi dall'immagine. Quindi dobbiamo applicare il livellamento alla nostra immagine. L'arrotondamento di un'immagine si riferisce alla creazione di una versione meno pixelata dell'immagine. In parole più semplici, stiamo solo riducendo il numero di pixel distinti nella nostra immagine. Ciò può essere ottenuto utilizzando la funzione di filtro bilaterale presente in OpenCV. Quindi possiamo semplicemente aggiungere l'immagine levigata e i bordi usando l'operatore 'bitwise_and' in OpenCV per ottenere la nostra immagine del fumetto.
import cv2
import numpy as np
img = cv2.imread("images/lena.jpg")
grigio = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
grigio = cv2.GaussianBlur(grigio,(5,5),-1)
bordi = cv2.adaptiveThreshold(grigio, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,9,10)
color = cv2.bilateralFilter(img, 20, 245, 245)
cartoon = cv2.bitwise_and (color, color, mask = bordi)
cv2.imshow("cartone animato",cartoon)
cv2.waitKey(0)
Puoi aggiungere più passaggi intermedi per migliorare i risultati come cambiare lo spazio colore, utilizzare filtri diversi, ecc.
Conclusione
OpenCV è una parte essenziale per lavorare nella visione artificiale e utilizzandola possiamo creare migliaia di fantastiche applicazioni. Potresti aver pensato che alcune di queste applicazioni vengono utilizzate da noi nella vita di tutti i giorni. Qual è stata l'ultima volta che hai usato Cam Scanner per scansionare una copia dei tuoi compiti? Pensi che la seconda applicazione possa aver avuto un ruolo in questo? L'immagine animata che abbiamo creato non sembra in qualche modo una versione Snapchat dell'immagine. Attraverso queste applicazioni, lo scopo era incoraggiarti a esplorare le soluzioni ai problemi della vita reale utilizzando strumenti semplici ed efficienti come OpenCV.
Le applicazioni che abbiamo trattato in questo articolo sono solo la punta dell'iceberg. Quando inizi a scavare più a fondo nel campo della visione artificiale, imparerai a conoscere concetti più interessanti e sorprendenti. Imparerai gli approcci di deep learning per risolvere problemi complessi. Imparerai a conoscere modelli pre-addestrati che potrebbero dare risultati eccellenti per un numero enorme di problemi. Addestrerai i tuoi modelli, creerai set di dati e troverai soluzioni a problemi che all'inizio sembrano irrealistici anche solo da chiedere.
Grazie. Spero che ti sia piaciuto leggere questo articolo. Condividilo ai tuoi colleghi o amici
Già, è solo la punta dell'iceberg... per esempio, in meno di cinquanta righe di programma si può fare in modo di rilevare un volto umano, ma non bastano cinquanta giorni per cercare di capire cosa c'è sotto:
#!/usr/bin/env python3
# -*- coding: latin-1 -*-
# import the necessary packages
# -----------------------------
from imutils.video import VideoStream
import argparse
import imutils
import time
import cv2
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-c", "--cascade", type=str,
default="haarcascade_frontalface_default.xml",
help="path to haar cascade face detector")
args = vars(ap.parse_args())
# load the haar cascade face detector from
print("[INFO] loading face detector...")
detector = cv2.CascadeClassifier(args["cascade"])
# initialize the video stream and allow the camera sensor to warm up
print("[INFO] starting video stream...")