Een beginnershandleiding voor beeldverwerking met OpenCV en Python

Bronknooppunt: 1074439

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon

Introductie

Er kan veel informatie in een afbeelding verborgen zijn en we kunnen deze op verschillende manieren en perspectieven interpreteren. Dus, wat is een beeld en hoe ga je om met een beeld? In eenvoudige bewoordingen kunnen we zeggen dat een afbeelding een visuele weergave van iets is en dat het gemakkelijk kan worden behandeld met behulp van computervisie (vanuit een machine learning-perspectief). Hoe zit het met video's? Een video kan worden omschreven als een opname van een bewegende reeks beelden of continue frames. Maar video's die computervisie gebruiken, kunnen we in een andere blog behandelen! 🙂

Sommigen van jullie kennen Computer Vision misschien al en kunnen deze paragraaf overslaan, en voor degenen die er geen idee van hebben, zou Computer Vision, meestal bekend in de afgekorte vorm 'CV', kunnen worden gezegd als een veld in Kunstmatige intelligentie die nuttig is voor bijna alle domeinen in dit moderne tijdperk, inclusief het medische veld, de automobielindustrie, productie, landbouw, enz.

Beeldverwerking met OpenCV | computer visie

Afbeelding 1

Als mens, die momenteel dit bericht leest, zou je onderscheid kunnen maken tussen de dingen of elementen die in een afbeelding aanwezig zijn. Maar hoe zit het met machines? Konden ze het zelf zien en bedenken om het te onderscheiden? NEE? dan laten we uw machine het doen.

In deze blog maak je jezelf vertrouwd met de basisprincipes van computervisie met python.

Ik geloof dat je Python Shell/Jupyter Notebook/PyCharm of Visual Studio Code (om er maar een paar te noemen) al hebt geïnstalleerd om in python te programmeren. Laten we om te beginnen het veelgebruikte pakket (OpenCV) installeren en we gaan de codes in elke cel in een Jupyter Notebook uitvoeren.

OpenCV-pakket installeren voor voorverwerking van afbeeldingen

OpenCV is een vooraf gebouwde, open-source CPU-only bibliotheek (pakket) die veel wordt gebruikt voor computervisie, machine learning en beeldverwerkingstoepassingen. Het ondersteunt een groot aantal programmeertalen, waaronder Python.

Installeer het OpenCV-pakket met:

pip installeer opencv-python

OR

pip installeer opencv-contrib-python

Voer een van deze opdrachten uit op uw terminal of als u Anaconda Navigator - Jupyter Notebook gebruikt, kunt u "pip" wijzigen met de "conda" -opdracht en hetzelfde installeren.

Het pakket importeren

Wat is een pakket in Python? Een pakket in Python is een verzameling modules die vooraf geschreven scripts bevatten. Deze pakketten helpen ons om modules geheel of zelfs afzonderlijk te importeren. We kunnen het pakket importeren door de module “cv2” als volgt aan te roepen:

importeer cv2

Een afbeelding lezen

Digitale afbeeldingen kunnen worden ingedeeld in; kleurenafbeeldingen, grijswaardenafbeeldingen, binaire afbeeldingen en multispectrale afbeeldingen. Een kleurenafbeelding bevat de kleurinformatie voor elke pixel. Afbeeldingen met grijstinten als enige kleur zijn grijswaardenafbeeldingen, terwijl een binaire afbeelding precies twee kleuren heeft, meestal zwarte en witte pixels. Multispectrale afbeeldingen zijn afbeeldingen die beeldgegevens vastleggen die zich over het elektromagnetische spectrum binnen een bepaalde golflengte uitstrekken.

Laten we teruggaan naar het coderingsgedeelte en een afbeelding lezen, de afbeelding wordt bijvoorbeeld hieronder weergegeven:

afbeelding lezen | Beeldverwerking met OpenCV

Dit is een afbeelding van een mandril. Ik lees momenteel de afbeelding uit mijn lokale map.

# cv2.imread(path_to_image_with_file_extension, vlag)

De gebruikscode ziet er als volgt uit:

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

Hier gebruiken we de "imread" -methode van het cv2-pakket om de afbeelding te lezen en de eerste parameter komt overeen met het pad van de afbeelding met zijn bestandsnaam en extensie, en de tweede is de vlag die u kunt instellen die de weg aangeeft, hoe te lezen in de afbeelding. Als je wilt, kun je het absolute pad naar de afbeelding hier vervangen en het proberen te lezen vanaf je lokale computer of zelfs van internet! Als de afbeelding aanwezig is in uw huidige werkmap, hoeft u alleen de afbeeldingsnaam met het extensietype op te geven.

Wat de tweede parameter betreft, als u deze graag als een grijswaardenafbeelding wilt lezen, kunt u de parameter specificeren op 0, -1 om de afbeelding als ongewijzigd te lezen (lees de afbeelding als alfa- of transparantiekanaal als het er is) en standaard is dit 1, als kleurenafbeelding. U kunt ook andere parameters proberen via deze link:

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

onder de ImreadModes.

Eigenschappen van een afbeelding

Vorm:

Elk beeld heeft een vorm. De lengte van de begrenzingen die door de afbeelding worden getoond, kan worden aangeduid als de vorm, dat wil zeggen de hoogte en breedte. Nu u weet hoe u een afbeelding moet lezen, kunnen we de vorm van de afbeelding eens controleren?

print(afb.vorm)

is de basismanier om de vorm van de afbeelding af te drukken, maar we kunnen de vorm extraheren met:

h, w, c = img.shape print("Afmetingen van de afbeelding is:nnHoogte:", h, "pixelsnBreedte:", w, "pixelsnAantal kanalen:", c)

om een ​​beter begrip te krijgen.

Voor de kleur en ongewijzigde modus zou het 3 waarden retourneren, inclusief de hoogte, breedte en het aantal kanalen dat in de afbeelding aanwezig is. Als u de grijswaardenmodus hebt gebruikt, zou de vorm 2 zijn, wat de hoogte en breedte van de afbeelding retourneert, maar dan hoeft u alleen de h en w-variabelen te gebruiken (uitsluiten van het gebruik van "c"), anders krijgt u mogelijk een waardefout die zegt "niet genoeg waarden om uit te pakken (verwachte 3, kreeg 2)".

Type:

We kunnen het type afbeelding weten met behulp van de "type" -methode. Door deze methode te gebruiken, weten we hoe de afbeeldingsgegevens worden weergegeven. Voer de code als volgt uit:

afdrukken(type(img))

Het resultaat kan als volgt zijn:

als het afbeeldingstype. Het is een multidimensionale container met items van hetzelfde type en dezelfde grootte. U kunt meer verwijzen naar de N-dimensionale array op de volgende link:

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

Het gegevenstype van de afbeelding die u zojuist hebt gelezen:

Aangezien de afbeelding een N-dimensionale array is, kunnen we het gegevenstype van de afbeelding controleren:

afdrukken(img.dtype)

Afbeeldingspixelwaarden:

We kunnen een afbeelding zien als een reeks kleine voorbeelden. Deze voorbeelden worden pixels genoemd. Probeer voor een beter begrip zoveel mogelijk in te zoomen op een afbeelding. We kunnen hetzelfde zien verdeeld in verschillende vierkanten. Dit zijn de pixels en wanneer ze met elkaar worden gecombineerd, vormen ze een afbeelding.

Een van de eenvoudige manieren om een ​​afbeelding weer te geven is in de vorm van een matrix. We kunnen zelfs een afbeelding maken met behulp van een matrix en deze opslaan! Hoe dat moet, laat ik je verderop in dit bericht zien. Kijk eens naar deze foto hieronder:

Afbeelding pixelwaarden | Beeldverwerking met OpenCV

Afbeelding 2

Deze afbeelding is eerder een voorbeeld van hoe de matrixweergave van een afbeelding eruitziet. Aan de linkerkant is een afbeelding van Lincoln, in het midden zijn de pixelwaarden gelabeld met getallen van 0 tot 255, die hun intensiteit of helderheid aangeven, en aan de rechterkant vormen de getallen in matrix zichzelf. Elke waarde in de matrix komt overeen met een pixel, het kleinste informatie-element dat in een afbeelding aanwezig is. Bekijk de pixelwaarden van de afbeelding door gewoon de variabele af te drukken waarmee u de afbeelding hebt geladen!

afdrukken (afb)

Foto resolutie:

Beeldresolutie kan worden gedefinieerd als het aantal pixels dat aanwezig is in een afbeelding. De kwaliteit van de afbeelding neemt toe naarmate het aantal pixels toeneemt. We hebben eerder de vorm van de afbeelding gezien die het aantal rijen en kolommen geeft. Dit zou kunnen worden gezegd als de resolutie van dat beeld. Enkele van de standaardresoluties zijn waarvan bijna iedereen weet dat ze 320 x 240 pixels zijn (meestal geschikt voor apparaten met een klein scherm), 1024 x 768 pixels (geschikt voor weergave op standaard computermonitoren), 720 x 576 pixels (goed om te bekijken op standaarddefinitie-tv's) sets met een beeldverhouding van 4:3), 1280 x 720 pixels (voor weergave op breedbeeldmonitoren), 1280 x 1024 pixels (goed voor weergave op volledig scherm op LCD-monitoren met een beeldverhouding van 5:4), 1920 x 1080 pixels (voor weergave op HD-tv's) en nu hebben we zelfs 4K-, 5K- en 8K-resoluties die respectievelijk 3840 x 2160 pixels, 5120 × 2880 pixels en 7,680 x 4,320 pixels zijn, ondersteund door ultra high definition-monitoren en televisies.

Wanneer we het aantal kolommen en het aantal rijen vermenigvuldigen, kunnen we het totale aantal pixels in de afbeelding verkrijgen. In een afbeelding van 320 x 240 is het totale aantal aanwezige pixels bijvoorbeeld 76,800 pixels.

De afbeelding bekijken

Laten we eens kijken hoe we de afbeelding in een venster kunnen weergeven. Daarvoor moeten we een GUI-venster maken om de afbeelding op het scherm weer te geven. De eerste parameter moet de titel zijn van het GUI-vensterscherm, gespecificeerd in tekenreeksformaat. We kunnen de afbeelding in een pop-upvenster tonen met behulp van de cv2.imshow() methode. Maar wanneer u het probeert te sluiten, kunt u het gevoel hebben dat u vastzit aan het venster. Dus om dat te bestrijden, kunnen we een eenvoudige "waitKey" -methode gebruiken. Probeer dit codegedeelte uit in een nieuwe cel:

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

Hier hebben we de parameter '0' in de “waitKey” gespecificeerd om het venster open te houden totdat we het sluiten. (Je kunt de tijd ook in milliseconden geven, in plaats van 0, door op te geven hoeveel tijd het moet worden geopend.) Daarna kunnen we de variabele toewijzen om het venster te sluiten wanneer we op de 'ESC'-toets of de toets ' drukken Q'. De methode cv2.destroAllWindows() wordt gebruikt voor het sluiten of verwijderen van de GUI-vensters van het scherm/geheugen.

De afbeelding opslaan

Hoe zit het met het converteren van de afbeelding naar grijswaarden en vervolgens opslaan voordat u de afbeelding opslaat? Converteer de afbeelding naar grijswaarden met:

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

Nu kunnen we de afbeelding opslaan:

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

en controleer de afbeelding die wordt opgeslagen in de huidige werkmap. De eerste parameter komt overeen met de naam van het bestand waarin de afbeelding moet worden opgeslagen en de tweede parameter is de variabele die de afbeelding bevat (pixelinformatie).

De beeldbitvlakken extraheren en reconstrueren

We kunnen een afbeelding opdelen in verschillende niveaus van bitvlakken. Verdeel een afbeelding bijvoorbeeld in 8-bits (0-7) vlakken, waarbij de laatste paar vlakken de meeste informatie voor een afbeelding bevatten.

beetje plannen

Afbeelding 3

Hiervoor kunnen we nog twee pakketten importeren:

importeer matplotlib.pyplot als plt importeer numpy als np

Als u een foutmelding krijgt tijdens het importeren van een van de pakketten, kunt u deze installeren met:

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

Nu definiëren we een functie om elk van de 8 niveaubitvlakken van de afbeelding te extraheren.

def extract_bit_plane(cd): # extractie van alle bits één voor één # van 1e tot 8e in variabele # van c1 tot c8 respectievelijk c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.vloer(cd/4), 2) c4 = np.mod(np.vloer(cd/8), 2) c5 = np.mod(np.vloer(cd/16) ), 2) c6 = np.mod(np.vloer(cd/32), 2) c7 = np.mod(np.vloer(cd/64), 2) c8 = np.mod(np.vloer(cd/ 128), 2) # beeld opnieuw combineren om equivalent aan origineel grijswaardenbeeld te vormen cc = 2 * (2 * (2 * c8 + c7) + c6) # beeld reconstrueren met 3 meest significante bitvlakken to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, assen = 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='gray') plt.tight_layout() plt.show() return cc

Nu zijn we klaar om de functie aan te roepen.

reconstructed_image = extract_bit_plane (grijs)

We hebben het beeld gereconstrueerd (bijna vergelijkbaar) met gebruikmaking van de laatste drie bitvlakken, dwz het zesde, zevende en achtste vlak. En het resultaat ziet er als volgt uit:

afbeelding reconstrueren | Beeldverwerking met OpenCV

Zullen we zelf een kleine afbeelding construeren? Laten we het nu proberen!

Een kleine synthetische afbeelding construeren

We kunnen proberen een synthetisch beeld te genereren met vier concentrische vierkanten met vier verschillende pixelintensiteitswaarden,

40, 80, 160 en 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # bovenste rij con_img[:, :32] = 40 #linkerkolom con_img[:, 224:256] = 40 # rechterkolom con_img[224:, :] = 40 # onderste rij con_img[32:64, 32:224] = 80 # bovenste rij con_img[64:224, 32:64] = 80 # linkerkolom con_img[64:224, 192: 224] = 80 # rechterkolom con_img[192:224, 32:224] = 80 # onderste rij con_img[64:96, 64:192] = 160 # bovenste rij con_img[96:192, 64:96] = 160 # linkerkolom con_img[96:192, 160:192] = 160 # rechterkolom con_img[160:192, 64:192] = 160 # onderste rij con_img[96:160, 96:160] = 220 plt.imshow(con_img)

De resulterende afbeelding ziet er als volgt uit:

uitgang

We kunnen kijken naar het gebruik van verschillende filters en transformaties op afbeeldingen in een ander artikel.

Bedankt voor het lezen van het artikel.

meme

Afbeelding 4

Voel je vrij om je suggesties toe te voegen onder de opmerkingen en deel het als je dit artikel leuk vindt. De volledige Python-programmeercode in Jupyter Notebook, die in dit artikel wordt genoemd, is beschikbaar in mijn Github-repository:

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

Referenties:

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

De media die in dit artikel worden getoond, zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.

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

Tijdstempel:

Meer van Analytics Vidhya