Aloittelijan opas kuvankäsittelyyn OpenCV: n ja Pythonin kanssa

Lähdesolmu: 1074439

Tämä artikkeli julkaistiin osana Data Science Blogathon

esittely

Kuvan sisällä voi olla paljon informaatiota ja voimme tulkita sitä eri tavoilla ja näkökulmista. Joten mikä on kuva ja kuinka käsitellä kuvaa? Yksinkertaisesti sanottuna voidaan sanoa, että kuva on visuaalinen esitys jostakin ja sitä voitaisiin käsitellä helposti tietokonenäön avulla (koneoppimisen näkökulmasta). Entä videot? Videota voitaisiin kuvata liikkuvan kuvasarjan tai jatkuvien kehysten tallennukseksi. Mutta voimme käsitellä videoita tietokonenäön avulla toisessa blogissa! 🙂

Jotkut teistä saattavat jo tuntea Computer Visionin tähän mennessä ja voivat ohittaa tämän kappaleen, mutta niille, joilla ei ole siitä käsitystä, Computer Vision, joka tunnetaan enimmäkseen lyhennetyssä muodossa "CV", voitaisiin sanoa alana Keinotekoinen älykkyys, joka poimii hyödyllisiä tietoja lähes kaikista tämän modernin aikakauden aloista, mukaan lukien lääketieteen ala, autoteollisuus, valmistus, maatalous jne.

Kuvankäsittely OpenCV:llä | konenäkö

Image 1

Ihmisenä, joka parhaillaan luet tätä viestiä, pystyt erottamaan kuvassa olevat asiat tai elementit. Mutta entä koneet? Voivatko he nähdä ja ajatella erottavansa sen itsestään? EI? laitetaan sitten koneesi tekemään se.

Tässä blogissa tutustuisit tietokonenäön perusteisiin pythonilla.

Uskon, että olet jo asentanut Python Shell/Jupyter Notebook/PyCharm tai Visual Studio Code (muutamia mainitakseni) ohjelmoidaksesi pythonissa. Asennamme laajalti käytetty paketti (OpenCV), jotta pääset alkuun, ja aiomme suorittaa koodit jokaisessa Jupyter-muistikirjan solussa.

OpenCV-paketin asentaminen kuvan esikäsittelyä varten

OpenCV on valmiiksi rakennettu, avoimen lähdekoodin CPU-kirjasto (paketti), jota käytetään laajalti tietokonenäköön, koneoppimiseen ja kuvankäsittelysovelluksiin. Se tukee useita ohjelmointikieliä, mukaan lukien Python.

Asenna OpenCV-paketti käyttämällä:

pip asennus opencv-python

OR

pip asennus opencv-contrib-python

Suorita mikä tahansa näistä komennoista päätteelläsi tai jos käytät Anaconda Navigator – Jupyter Notebookia, voit muuttaa "pip"-komentoa "conda"-komennolla ja asentaa saman.

Paketin tuonti

Mikä on paketti Pythonissa? Pythonin paketti on kokoelma moduuleja, jotka sisältävät valmiiksi kirjoitettuja komentosarjoja. Nämä paketit auttavat meitä tuomaan moduulit kokonaan tai jopa yksittäin. Voimme tuoda paketin kutsumalla "cv2"-moduulia seuraavasti:

tuo cv2

Kuvan lukeminen

Digitaaliset kuvat voitaisiin luokitella; värikuvat, harmaasävykuvat, binaarikuvat ja monispektrikuvat. Värikuva sisältää kunkin pikselin väritiedot. Kuvat, joiden ainoa väri on harmaan sävyt, ovat harmaasävykuvia, kun taas binäärikuvassa on täsmälleen kaksi väriä, enimmäkseen mustavalkoisia pikseleitä. Monispektrikuvat ovat kuvia, jotka tallentavat kuvadataa sähkömagneettisen spektrin yli tietyllä aallonpituudella.

Palataan koodausosaan ja luetaan esimerkiksi kuva, kuva näkyy alla:

lukeva kuva | Kuvankäsittely OpenCV:llä

Tämä on kuva mandrillista. Luen parhaillaan kuvaa paikallisesta hakemistostani.

# cv2.imread(polku_kuvaan_tiedostolaajennuksella, lippu)

Käyttökoodi näyttää tältä:

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

Tässä käytetään cv2-paketin “imread”-menetelmää kuvan lukemiseen ja ensimmäinen parametri vastaa kuvan polkua sen tiedostonimellä ja tunnisteella, ja toinen on asetettava lippu, joka kertoo tien, kuinka lukea kuvasta. Jos haluat, voit korvata kuvan absoluuttisen polun täällä ja yrittää lukea sen paikalliselta tietokoneeltasi tai jopa Internetistä! Jos kuva on nykyisessä työhakemistossasi, sinun tarvitsee vain määrittää kuvan nimi ja sen laajennustyyppi.

Mitä tulee toiseen parametriin, jos haluat lukea sen harmaasävykuvana, voit määrittää parametriksi 0, -1, jotta kuva luetaan muuttumattomana (lukee kuvan alfa- tai läpinäkyvyyskanavana, jos sellainen on) ja oletusarvoisesti se on 1, värikuvana. Voit myös kokeilla muita parametreja tästä linkistä:

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

ImreadModesin alla.

Kuvan ominaisuudet

Muuta:

Jokaisella kuvalla on muoto. Kuvassa näkyvien rajojen pituutta voidaan kutsua muodoksi eli korkeudeksi ja leveydeksi. Nyt kun osaat lukea kuvan, entäpä tarkistaisimme kuvan muodon?

tulostaa (kuvan muoto)

on perustapa tulostaa kuvan muoto, mutta voimme poimia muodon käyttämällä:

h, w, c = img.shape print("Kuvan mitat on:nnKorkeus:", h, "pikselinleveys:", w, "pikseliä kanavien lukumäärä:", c)

saadaksesi paremman käsityksen.

Värille ja muuttumattomalle tilalle se palauttaa 3 arvoa, mukaan lukien korkeuden, leveyden ja kuvassa olevien kanavien lukumäärän. Jos olet käyttänyt harmaasävytilaa, muoto olisi 2, joka palauttaa kuvan korkeuden ja leveyden, mutta silloin sinun on käytettävä vain muuttujia h ja w (ei käytä "c" ), muuten saatat saada arvovirhe, jossa lukee "ei tarpeeksi arvoja purkamiseen (odotettu 3, sain 2)".

Tyyppi:

Voimme tietää kuvan tyypin käyttämällä "tyyppi"-menetelmää. Tämän menetelmän käyttäminen auttaa meitä tietämään, kuinka kuvatiedot esitetään. Suorita koodi seuraavasti:

tulosta (tyyppi(kuva))

Tulos voi olla tällainen:

kuvan tyyppinä. Se on moniulotteinen säiliö, jossa on samantyyppisiä ja -kokoisia esineitä. Voit tutustua N-ulotteiseen taulukkoon tarkemmin seuraavasta linkistä:

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

Juuri lukemasi kuvan tietotyyppi:

Koska kuva on N-ulotteinen matriisi, voimme tarkistaa kuvan tietotyypin:

tulosta (kuva.dtyyppi)

Kuvan pikseliarvot:

Voimme ajatella kuvaa pienten näytteiden sarjana. Näitä näytteitä kutsutaan pikseleiksi. Paremman käsityksen saamiseksi yritä lähentää kuvaa mahdollisimman paljon. Voimme nähdä saman jaettuna eri neliöihin. Nämä ovat pikseleitä ja kun ne yhdistetään yhteen, ne muodostavat kuvan.

Yksi yksinkertaisista tavoista esittää kuva on matriisin muodossa. Voimme jopa luoda kuvan matriisin avulla ja tallentaa sen! Näytetään sinulle myöhemmin tässä viestissä. Katsokaa tätä kuvaa alla:

Kuvan pikseliarvot | Kuvankäsittely OpenCV:llä

Image 2

Tämä kuva on pikemminkin esimerkki siitä, miltä kuvan matriisiesitys näyttää. Vasemmalla on Lincolnin kuva, keskellä pikseliarvot on merkitty numeroilla 0-255, jotka osoittavat niiden voimakkuutta tai kirkkautta ja oikealla matriisin numerot muodostavat itsensä. Jokainen matriisin arvo vastaa pikseliä, joka on kuvan pienin informaatioelementti. Tarkista kuvan pikseliarvot tulostamalla vain muuttuja, jonka latasit kuvan!

tulosta (kuva)

Kuvan tarkkuus:

Kuvan resoluutio voidaan määritellä kuvassa olevien pikselien lukumääränä. Kuvan laatu paranee pikselien määrän kasvaessa. Olemme nähneet aiemmin kuvan muodon, joka antaa rivien ja sarakkeiden lukumäärän. Tämän voisi sanoa kuvan resoluutioksi. Jotkut vakioresoluutioista ovat, että melkein kaikki tietävät, että ne ovat 320 x 240 pikseliä (sopii enimmäkseen pieninäyttöisille laitteille), 1024 x 768 pikseliä (sopii katsottavaksi tavallisilla tietokoneen näytöillä), 720 x 576 pikseliä (hyvä katsoa tavallisilla televisioilla). sarjat, joiden kuvasuhde on 4:3), 1280 x 720 pikseliä (katseltavaksi laajakuvanäytöillä), 1280 x 1024 pikseliä (hyvä katseluun koko näytön koossa LCD-näytöissä 5:4 kuvasuhteella), 1920 x 1080 pikseliä (katseluun HD-televisioissa), ja nyt meillä on jopa 4K-, 5K- ja 8K-resoluutiot, jotka ovat 3840 x 2160 pikseliä, 5120 x 2880 pikseliä ja 7,680 4,320 x XNUMX XNUMX pikseliä, joita tukevat ultrateräväpiirtonäytöt ja -televisiot.

Kun kerromme sarakkeiden lukumäärän ja rivien lukumäärän, voimme saada kuvassa olevien pikselien kokonaismäärän. Esimerkiksi 320 x 240 kuvassa siinä olevien pikselien kokonaismäärä on 76,800 XNUMX pikseliä.

Kuvan katselu

Katsotaanpa, kuinka kuva näytetään ikkunassa. Tätä varten meidän on luotava GUI-ikkuna kuvan näyttämiseksi näytöllä. Ensimmäisen parametrin on oltava GUI-ikkunan näytön otsikko, joka on määritetty merkkijonomuodossa. Voimme näyttää kuvan ponnahdusikkunassa käyttämällä cv2.imshow()-menetelmää. Mutta kun yrität sulkea sen, saatat tuntea olevansa jumissa sen ikkunassa. Joten sen torjumiseksi voimme käyttää yksinkertaista "waitKey" -menetelmää. Kokeile tätä koodiosaa uudessa solussa:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) jos k == 27 tai k == ord('q'): cv2.destroyAllWindows()

Tässä olemme määrittäneet parametrin '0' "waitKeyssä" pitämään ikkunan auki, kunnes suljemme sen. (Voit myös antaa ajan millisekunteina 0:n sijaan, jolloin määritetään kuinka kauan se pitää avata.) Tämän jälkeen voimme määrittää muuttujan toimimaan ikkunan sulkemiseksi, kun painamme 'ESC'-näppäintä tai näppäintä ' q'. Cv2.destroAllWindows()-menetelmää käytetään GUI-ikkunoiden sulkemiseen tai poistamiseen näytöstä/muistista.

Kuvan tallentaminen

Entä ennen kuvan tallentamista, jos muuttaisit kuvan harmaasävyiksi ja tallennat sen sitten? Muunna kuva harmaasävyiksi käyttämällä:

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

Nyt voimme tallentaa kuvan:

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

ja tarkista nykyiseen työhakemistoon tallennettava kuva. Ensimmäinen parametri vastaa sen tiedoston nimeä, johon kuva tallennetaan, ja toinen parametri on muuttuja, joka sisältää kuvan (pikselitiedot).

Kuvan bittitasojen purkaminen ja niiden rekonstruoiminen

Voimme jakaa kuvan eri tasoisiin bittitasoihin. Jaa kuva esimerkiksi 8-bittisiksi (0-7) tasoiksi, joissa muutamat viimeiset tasot sisältävät suurimman osan kuvan tiedoista.

vähän suunnitelmia

Image 3

Tätä varten voimme tuoda kaksi muuta pakettia:

tuonti matplotlib.pyplot as plt tuonti numpy as np

Jos saat virheen tuodessasi jotakin paketeista, voit asentaa ne käyttämällä:

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

Nyt määrittelemme funktion kuvan jokaisen 8-tason bittitason poimimiseksi.

def extract_bit_plane(cd): # poimitaan kaikki bitit yksitellen # 1. - 8. muuttujassa # c1 - c8, vastaavasti 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) # kuvan yhdistäminen uudelleen alkuperäistä harmaasävykuvaa vastaavaksi cc = 2 * (2 * (2 * c8 + c7) + c6) # rekonstruoidaan kuva kolmella merkittävimmällä bittitasolla to_plot = [cd, c3, c1 , c2, c3, c4, c5, c6, c7, cc] fig, akselit = plt.subplots(nrows=8, ncols=2,figsize=(5, 10), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=8, wspace=0.05) for ax, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='grey') plt.tight_layout() plt.show() return cc

Nyt olemme valmiita kutsumaan funktiota.

rekonstruoitu_kuva = pura_bittitaso(harmaa)

Olemme rekonstruoineet kuvan (melkein samanlaisen) käyttämällä kolmea viimeistä bittitasoa eli kuudetta, seitsemää ja kahdeksatta tasoa. Ja tulos näyttää tältä:

rekonstruoida kuva | Kuvankäsittely OpenCV:llä

Entä jos rakentaisimme pienen kuvan itse? Kokeillaan nyt!

Pienen synteettisen kuvan rakentaminen

Voimme yrittää luoda synteettisen kuvan, joka sisältää neljä samankeskistä neliötä neljällä eri pikselivoimakkuusarvolla,

40, 80, 160 ja 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # ylempi rivi con_img[:, :32] = 40 #vasen sarake con_img[:, 224:256] = 40 # oikea sarake con_img[224:, :] = 40 # alempi rivi con_img[32:64, 32:224] = 80 # ylempi rivi con_img[64:224, 32:64] = 80 # vasen sarake con_img[64:224, 192: 224] = 80 # oikea sarake con_img[192:224, 32:224] = 80 # alempi rivi con_img[64:96, 64:192] = 160 # ylempi rivi con_img[96:192, 64:96] = 160 # vasen sarake con_img[96:192, 160:192] = 160 # oikea sarake con_img[160:192, 64:192] = 160 # alempi rivi con_img[96:160, 96:160] = 220 plt.imshow(con_img)

Tuloksena oleva kuva näyttäisi tältä:

ulostulo

Voimme tarkastella eri suodattimien ja muunnosten käyttöä kuvissa toisessa artikkelissa.

Kiitos artikkelin lukemisesta.

meme

Image 4

Voit vapaasti lisätä ehdotuksesi kommenttien alle ja jakaa, jos pidät tästä artikkelista. Tässä artikkelissa mainittu Jupyter Notebookin täydellinen Python-ohjelmointikoodi on saatavilla Github-arkistostani:

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

Viitteet:

  1. Kuva 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Kuva 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. Kuva 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

Tässä artikkelissa esitetyt tiedotusvälineet eivät ole Analytics Vidhyan omistuksessa ja niitä käytetään tekijän harkinnan mukaan.

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

Aikaleima:

Lisää aiheesta Analyysi Vidhya