Un ghid pentru începători pentru procesarea imaginilor cu OpenCV și Python

Nodul sursă: 1074439

Acest articol a fost publicat ca parte a Blogathon Data Science

Introducere

Ar putea exista o mulțime de informații ascunse în interiorul unei imagini și am putea-o interpreta în moduri și perspective diferite. Deci, ce este o imagine și cum să tratăm cu o imagine? Cu cuvinte simple, putem spune că o imagine este o reprezentare vizuală a ceva și ar putea fi tratată cu ușurință folosind viziunea computerizată (din perspectiva învățării automate). Dar videoclipurile? Un videoclip ar putea fi descris ca o înregistrare a unui set în mișcare de imagini sau cadre continue. Dar ne putem ocupa de videoclipuri folosind viziunea computerizată într-un alt blog! 🙂

Unii dintre voi s-ar putea să știe deja despre Computer Vision până acum și pot sări peste acest paragraf și, dar pentru cei care nu au o idee despre el, Computer Vision, cunoscută mai ales sub forma prescurtată „CV”, ar putea fi spus ca un domeniu în Inteligența artificială care extrage util în aproape toate domeniile din această eră modernă, inclusiv domeniul medical, auto, producție, agricultură etc.

Procesarea imaginii cu OpenCV | viziune computerizată

Imagine 1

Ca om, care citește în prezent această postare, ai putea face distincția între lucrurile sau elementele prezente într-o imagine. Dar, cum rămâne cu mașinile? Ar putea ei să vadă și să se gândească să-l distingă singuri? NU? atunci haideți să vă facem mașina să o facă.

În acest blog, vă veți familiariza cu elementele de bază ale vederii computerizate folosind python.

Cred că ați instalat deja Python Shell/Jupyter Notebook/PyCharm sau Visual Studio Code (pentru a numi câteva) pentru a programa în python. Să instalăm pachetul utilizat pe scară largă (OpenCV) pentru a începe și vom rula codurile din fiecare celulă într-un notebook Jupyter.

Instalarea pachetului OpenCV pentru preprocesarea imaginilor

OpenCV este o bibliotecă (pachet) pre-construită, open-source numai pentru CPU, care este utilizată pe scară largă pentru viziunea computerizată, învățarea automată și aplicațiile de procesare a imaginilor. Acceptă o varietate bună de limbaje de programare, inclusiv Python.

Instalați pachetul OpenCV folosind:

pip install opencv-python

OR

pip install opencv-contrib-python

Rulați oricare dintre aceste comenzi pe terminalul dvs. sau dacă utilizați Anaconda Navigator – Jupyter Notebook, puteți schimba „pip” cu comanda „conda” și instalați același lucru.

Importul pachetului

Ce este un pachet în Python? Un pachet în Python este o colecție de module care conțin scripturi pre-scrise. Aceste pachete ne ajută să importam module în întregime sau chiar individual. Putem importa pachetul apelând modulul „cv2” astfel:

import cv2

Citirea unei imagini

Imaginile digitale pot fi clasificate în; imagini color, imagini în tonuri de gri, imagini binare și imagini multispectrale. O imagine color include informațiile de culoare pentru fiecare pixel. Imaginile care au nuanțe de gri ca singura culoare sunt imaginile în tonuri de gri, în timp ce o imagine binară are exact două culori, majoritatea pixeli alb și negru. Imaginile multispectrale sunt imagini care captează date de imagine care variază de-a lungul spectrului electromagnetic într-o anumită lungime de undă.

Să revenim la partea de codificare și să citim o imagine, de exemplu, imaginea este afișată mai jos:

lectură imagine | Procesarea imaginii cu OpenCV

Aceasta este o imagine a unui mandril. În prezent citesc imaginea din directorul meu local.

# cv2.imread(calea_la_imagine_cu_extensia_fișierului, semnalizare)

Codul de utilizare arată astfel:

img = cv2.imread("mandrill.jpg", 1)

Aici folosim metoda „imread” a pachetului cv2 pentru a citi imaginea, iar primul parametru corespunde căii imaginii cu numele și extensia sa, iar cel de-al doilea este steag-ul pe care îl puteți seta și care spune calea, cum se citește în imagine. Dacă doriți, puteți înlocui calea absolută către imagine aici și încercați să o citiți de pe computerul local sau chiar de pe internet! Dacă imaginea este prezentă în directorul de lucru curent, trebuie doar să specificați numele imaginii cu tipul de extensie.

În ceea ce privește cel de-al doilea parametru, dacă doriți să îl citiți ca imagine în tonuri de gri, puteți specifica parametrul la 0, -1 pentru a citi imaginea ca neschimbată (citește imaginea ca canal alfa sau de transparență dacă există) iar implicit, este 1, ca imagine color. Puteți încerca și alți parametri din acest link:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

sub ImreadModes.

Proprietățile unei imagini

Formă:

Fiecare imagine are o formă. Lungimea limitelor prezentate de imagine poate fi denumită formă, adică înălțimea și lățimea. Acum că știi să citești o imagine, ce zici să verificăm forma imaginii?

imprimare(forma imagine)

este modalitatea de bază de a imprima forma imaginii, dar putem extrage forma folosind:

h, w, c = img.shape print("Dimensiunile imaginii sunt:nnHeight:", h, "pixelsnWidth:", w, "pixelsnNumber of Channels:", c)

pentru a obține o mai bună înțelegere.

Pentru modul de culoare și neschimbat, ar returna 3 valori, inclusiv înălțimea, lățimea și numărul de canale prezente în imagine. Dacă ați folosit modul în tonuri de gri, forma ar fi 2, ceea ce va returna înălțimea și lățimea imaginii, dar atunci trebuie doar să utilizați doar variabilele h și w (excludeți utilizarea „c”), altfel s-ar putea să obțineți o eroare de valoare care spune „nu sunt suficiente valori pentru a despacheta (se așteaptă 3, am primit 2)”.

Tip:

Putem cunoaște tipul imaginii folosind metoda „tip”. Folosirea acestei metode ne ajută să știm cum sunt reprezentate datele imaginii. Rulați codul după cum urmează:

imprimare(tip(img))

Rezultatul ar putea fi astfel:

ca tip de imagine. Este un container multidimensional de articole de același tip și dimensiune. Puteți consulta mai multe la matricea N-dimensională la următorul link:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

Tipul de date al imaginii pe care tocmai ați citit-o:

Deoarece imaginea este o matrice N-dimensională, putem verifica tipul de date al imaginii:

print(img.dtype)

Valorile pixelilor imaginii:

Ne putem gândi la o imagine ca la un set de mostre mici. Aceste mostre se numesc pixeli. Pentru o mai bună înțelegere, încercați să măriți o imagine cât mai mult posibil. Îl putem vedea împărțit în pătrate diferite. Aceștia sunt pixelii și când sunt combinați împreună formează o imagine.

Una dintre modalitățile simple de a reprezenta o imagine este, sub formă de matrice. Putem chiar să creăm o imagine folosind o matrice și să o salvam! Vă va arăta cum, mai târziu în această postare. Aruncă o privire la această poză de mai jos:

Valorile pixelilor imaginii | Procesarea imaginii cu OpenCV

Imagine 2

Această imagine este mai degrabă un exemplu al modului în care arată reprezentarea matriceală a unei imagini. În stânga, este o imagine a lui Lincoln, în mijloc, valorile pixelilor sunt etichetate cu numere de la 0 la 255, indicând intensitatea sau luminozitatea lor, iar în dreapta, numerele în matrice se formează. Fiecare valoare din matrice corespunde unui pixel, care este cel mai mic element de informație prezent într-o imagine. Verificați valorile pixelilor imaginii prin imprimarea variabilei pe care ați încărcat imaginea!

print(img)

Rezoluția imaginii:

Rezoluția imaginii poate fi definită ca numărul de pixeli prezenți într-o imagine. Calitatea imaginii crește atunci când numărul de pixeli crește. Am văzut mai devreme, forma imaginii care dă numărul de rânduri și coloane. Aceasta ar putea fi spusă drept rezoluția acelei imagini. Unele dintre rezoluțiile standard pe care aproape toată lumea le știe sunt 320 x 240 pixeli (de cele mai multe ori potrivite pe dispozitive cu ecran mic), 1024 x 768 pixeli (potrivit pentru vizualizare pe monitoarele de computer standard), 720 x 576 pixeli (bun de vizionat pe un televizor cu definiție standard). seturi cu raport de aspect 4:3), 1280 x 720 pixeli (pentru vizualizare pe monitoare cu ecran lat), 1280 x 1024 pixeli (bun pentru vizualizare pe ecran complet pe monitoarele LCD cu raport de aspect 5:4), 1920 x 1080 pixeli (pentru vizionare pe televizoare HD) și acum avem chiar și rezoluții 4K, 5K și 8K care sunt 3840 x 2160 pixeli, 5120 x 2880 pixeli și, respectiv, 7,680 x 4,320 pixeli, suportate de monitoare și televizoare de ultra înaltă definiție.

Când înmulțim numărul de coloane și numărul de rânduri, putem obține numărul total de pixeli prezenți în imagine. De exemplu, într-o imagine de 320 x 240, numărul total de pixeli prezenți în ea este de 76,800 pixeli.

Vizualizarea imaginii

Să vedem cum să afișam imaginea într-o fereastră. Pentru asta, trebuie să creăm o fereastră GUI pentru a afișa imaginea pe ecran. Primul parametru trebuie să fie titlul ecranului ferestrei GUI, specificat în format șir. Putem arăta imaginea într-o fereastră pop-up folosind metoda cv2.imshow(). Dar, când încerci să-l închizi, s-ar putea să te simți blocat cu fereastra. Deci, pentru a combate acest lucru, putem folosi o metodă simplă „waitKey”. Încercați această parte de cod într-o celulă nouă:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) dacă k == 27 sau k == ord('q'): cv2.destroyAllWindows()

Aici, am specificat parametrul „0” în „waitKey” pentru a menține fereastra deschisă până când o închidem. (De asemenea, puteți da timpul în milisecunde, în loc de 0, specificând cât timp trebuie deschis.) După aceea, putem atribui variabilei să acționeze pentru închiderea ferestrei atunci când apăsăm tasta 'ESC' sau tasta ' q'. Metoda cv2.destroAllWindows() este folosită pentru închiderea sau ștergerea ferestrelor GUI de pe ecran/memorie.

Salvarea imaginii

Înainte de a salva imaginea, ce zici de a converti imaginea în tonuri de gri și apoi de a o salva? Convertiți imaginea în tonuri de gri folosind:

gri = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Acum putem salva imaginea:

cv2.imwrite('Mandrill_grey.jpg', gri)

și verificați imaginea care este salvată în directorul de lucru curent. Primul parametru corespunde numelui fișierului în care urmează să fie salvată imaginea, iar al doilea parametru este variabila care conține imaginea (informații pixeli).

Extragerea planurilor de biți a imaginii și reconstruirea acestora

Putem împărți o imagine în diferite niveluri de planuri de biți. De exemplu, împărțiți o imagine în planuri de 8 biți (0-7), unde ultimele planuri conțin majoritatea informațiilor pentru o imagine.

biți planuri

Imagine 3

Pentru a face acest lucru, putem importa încă două pachete:

import matplotlib.pyplot ca plt import numpy ca np

Dacă primiți o eroare în timp ce importați oricare dintre pachete, le puteți instala folosind:

conda install -c conda-forge matplotlib conda install -c anaconda numpy

Acum definim o funcție pentru a extrage fiecare dintre cele 8 planuri de biți de nivel ale imaginii.

def extract_bit_plane(cd): # extragerea tuturor biților unul câte unul # de la 1 la 8 în variabila # de la c1 la c8, respectiv c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.floor(cd/4), 2) c4 = np.mod(np.floor(cd/8), 2) c5 = np.mod(np.floor(cd/16) ), 2) c6 = np.mod(np.floor(cd/32), 2) c7 = np.mod(np.floor(cd/64), 2) c8 = np.mod(np.floor(cd/ 128), 2) # combinând imaginea din nou pentru a forma echivalentul imaginii inițiale în tonuri de gri cc = 2 * (2 * (2 * c8 + c7) + c6) # reconstruirea imaginii cu 3 planuri de biți cele mai semnificative pentru a_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, axes = plt.subplots(nrows=2, ncols=5,figsize=(10, 8), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=0.05, wspace=0.05) for ax, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='grey') plt.tight_layout() plt.show() return cc

Acum suntem gata să apelăm funcția.

imagine_reconstituită = extract_bit_plane(gri)

Am reconstruit imaginea (aproape similară) folosind ultimele trei planuri de biți, adică al șaselea, al șaptelea și al optulea plan. Și rezultatul arată așa:

reconstrui imaginea | Procesarea imaginii cu OpenCV

Ce zici să ne construim singuri o mică imagine? Să încercăm acum!

Construirea unei mici imagini sintetice

Putem încerca să generăm o imagine sintetică care să conțină patru pătrate concentrice cu patru valori diferite de intensitate a pixelilor,

40, 80, 160 și 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # rând de sus con_img[:, :32] = 40 #coloana stânga con_img[:, 224:256] = 40 # coloana din dreapta con_img[224:, :] = 40 # rândul inferior con_img[32:64, 32:224] = 80 # rândul superior con_img[64:224, 32:64] = 80 # coloana din stânga con_img[64:224, 192: 224] = 80 # coloana din dreapta con_img[192:224, 32:224] = 80 # rândul inferior con_img[64:96, 64:192] = 160 # rândul superior con_img[96:192, 64:96] = 160 # coloana din stânga con_img[96:192, 160:192] = 160 # coloana din dreapta con_img[160:192, 64:192] = 160 # rândul inferior con_img[96:160, 96:160] = 220 plt.imshow)(con_img)

Imaginea rezultată ar arăta astfel:

producție

Ne putem uita la utilizarea diferitelor filtre și transformări pe imagini într-un alt articol.

Vă mulțumim că ați citit articolul.

meme

Imagine 4

Simțiți-vă liber să adăugați sugestiile dvs. sub comentarii și să distribuiți dacă vă place acest articol. Codul complet de programare Python din Jupyter Notebook, menționat în acest articol, este disponibil în depozitul meu Github:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

Referinte:

  1. Imaginea 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Imaginea 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Imaginea 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

Mediile prezentate în acest articol nu sunt deținute de Analytics Vidhya și sunt utilizate la discreția autorului.

Sursa: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Timestamp-ul:

Mai mult de la Analize Vidhya