How to invert a negative pixel in Python?

Negativ Billedinversion i Python: En Komplet Guide

08/08/2024

Rating: 4.94 (9254 votes)

Billedbehandling er en fundamental del af moderne datalogi og programmering, med anvendelser der spænder fra medicinsk analyse til kreativt design. En af de mest grundlæggende, men alligevel kraftfulde operationer, er billedinversion, også kendt som at skabe et negativ. Denne proces vender billedets farver om, så lyse områder bliver mørke og mørke områder bliver lyse. I Python er denne opgave overraskende enkel takket være robuste biblioteker som Pillow (PIL), OpenCV og NumPy. Denne artikel vil guide dig igennem de forskellige metoder til at invertere pixels i et billede, forklare den underliggende logik og vise praktiske kodeeksempler, så du kan mestre denne teknik.

How to invert image in NumPy?
It considers that you have an image by the name of image.png in your working directory. This program will first load an image, invert it and save it in the working directory. After that, it will show both the original and the inverted images. NumPy has an invert() method, which performs bit-wise inversion or bit-wise NOT operation.
Indholdsfortegnelse

Hvad er Billedinversion Præcist?

For at forstå billedinversion skal vi først se på, hvordan digitale farver repræsenteres. I de fleste standardbilledformater, som JPEG og PNG, er et billede opbygget af pixels, hvor hver pixel har en farveværdi. Typisk bruges RGB-farvemodellen, hvor farven defineres af intensiteten af Rød (Red), Grøn (Green) og Blå (Blue). Hver af disse tre farvekanaler har en værdi, der normalt går fra 0 (ingen intensitet) til 255 (fuld intensitet) i et 8-bit farverum.

Et par eksempler:

  • Sort: R=0, G=0, B=0
  • Hvid: R=255, G=255, B=255
  • Rød: R=255, G=0, B=0

Farveinversion fungerer ved at tage hver farvekanals værdi og trække den fra den maksimale værdi, som er 255. Formlen er simpel:

Ny Værdi = 255 - Gammel Værdi

Anvender vi denne formel på vores eksempler:

  • Sort (0, 0, 0) bliver til Hvid (255, 255, 255).
  • Hvid (255, 255, 255) bliver til Sort (0, 0, 0).
  • Rød (255, 0, 0) bliver til Cyan (0, 255, 255).

Resultatet er et billede, der ligner et fotografisk negativ, hvor lys- og farveforholdene er vendt om. Denne teknik er ikke kun til kunstneriske effekter; den har også praktiske anvendelser, f.eks. inden for medicinsk billeddannelse for at fremhæve bestemte strukturer.

Metode 1: Brug af Pillow (PIL) Biblioteket

Pillow, en 'venlig' forgrening af det ældre Python Imaging Library (PIL), er et af de mest populære biblioteker til billedmanipulation i Python. Det er let at bruge og indeholder en bred vifte af funktioner, herunder en dedikeret funktion til inversion.

Funktionen hedder ImageOps.invert(). Den tager et Pillow-billedobjekt som input og returnerer et nyt, inverteret billedobjekt. Processen er ligetil: indlæs billedet, kald funktionen, og gem resultatet.

Kodeeksempel med Pillow

Her er et simpelt script, der viser, hvordan man gør:

from PIL import Image, ImageOps # Indlæs billedet fra en fil im = Image.open('sti/til/dit/billede.jpg') # Inverter billedet im_invert = ImageOps.invert(im) # Gem det inverterede billede im_invert.save('sti/til/dit/inverterede_billede.jpg', quality=95) print("Billedet er blevet inverteret og gemt.") 

Vigtig note om gennemsigtighed (RGBA)

En vigtig detalje at være opmærksom på er, hvordan Pillow håndterer billeder med en alfakanal (gennemsigtighed), såsom PNG-filer. Når du åbner et sådant billede, vil det have 'RGBA'-tilstand. De fleste operationer i ImageOps, inklusiv invert(), fungerer kun på 'L' (gråtoner) og 'RGB' billeder. Hvis du forsøger at invertere et RGBA-billede direkte, vil alfakanalen ikke blive behandlet korrekt, hvilket kan føre til uventede resultater. Løsningen er at konvertere billedet til 'RGB' før inversion.

from PIL import Image, ImageOps # Indlæs et PNG-billede med gennemsigtighed im_rgba = Image.open('sti/til/dit/billede.png') # Konverter til RGB (fjerner alfakanalen) im_rgb = im_rgba.convert('RGB') # Inverter RGB-billedet im_invert = ImageOps.invert(im_rgb) # Gem resultatet im_invert.save('sti/til/dit/inverterede_billede_rgb.png') 

Metode 2: Brug af OpenCV og NumPy

OpenCV (Open Source Computer Vision Library) er et ekstremt kraftfuldt bibliotek til computer vision og billedbehandling i realtid. I Python bruges det næsten altid sammen med NumPy, et bibliotek til numeriske operationer, da OpenCV repræsenterer billeder som NumPy-arrays. Denne tilgang er meget effektiv og giver mulighed for komplekse matematiske operationer direkte på billedets pixeldata.

Inversion med OpenCV's `bitwise_not`

OpenCV har en funktion kaldet cv2.bitwise_not(), som udfører en bitvis NOT-operation på hvert element i et array. For et 8-bit usigneret heltal (som er, hvad pixelværdier typisk er), er en bitvis NOT-operation matematisk ækvivalent med `255 - værdi`. Dette er præcis den formel, vi har brug for til billedinversion.

How to invert a negative pixel in Python?
In the ImageOps module of the Python image processing library Pillow (PIL), invert() for negative-positive inverting (inverting pixel values) of an image is provided. ImageChops module has the same function. See the following article for the installation and basic usage of Pillow (PIL).

Kodeeksempel med OpenCV

import cv2 # Indlæs billedet. Flaget '1' sikrer, at det indlæses i farver. # Brug '0' for gråtoner. image = cv2.imread('sti/til/dit/billede.jpg', 1) # Tjek om billedet blev indlæst korrekt if image is not None: # Anvend bitwise_not operation for at invertere inverted_image = cv2.bitwise_not(image) # Gem det nye billede cv2.imwrite('sti/til/dit/inverteret_opencv.jpg', inverted_image) # Vis billederne (valgfrit, kræver et GUI-backend) cv2.imshow('Original Image', image) cv2.imshow('Inverted Image', inverted_image) cv2.waitKey(0) # Vent på at en tast trykkes cv2.destroyAllWindows() else: print("Fejl: Kunne ikke indlæse billedet.") 

Inversion med ren NumPy

Da OpenCV-billeder allerede er NumPy-arrays, kan vi også bruge NumPy's egne funktioner til at udføre inversionen. Ligesom OpenCV har NumPy en `np.invert()` funktion, der udfører en bitvis inversion. Resultatet er identisk med `cv2.bitwise_not()`.

Kodeeksempel med NumPy

import cv2 import numpy as np # Indlæs billedet som et NumPy array via OpenCV image = cv2.imread('sti/til/dit/billede.jpg') if image is not None: # Anvend NumPy's invert funktion inverted_image = np.invert(image) # Gem og vis billedet som før cv2.imwrite('sti/til/dit/inverteret_numpy.jpg', inverted_image) cv2.imshow('Original Image', image) cv2.imshow('Inverted Image', inverted_image) cv2.waitKey(0) cv2.destroyAllWindows() else: print("Fejl: Kunne ikke indlæse billedet.") 

Alternativt kan du udføre den simple subtraktion direkte med NumPy, hvilket ofte er mere læseligt for dem, der ikke er bekendt med bitvise operationer:

inverted_image = 255 - image

Denne linje kode vil udføre operationen på hvert enkelt pixel i hele billedet utroligt hurtigt takket være NumPy's vektoriserede operationer.

Sammenligning af Metoderne

Hvilken metode skal du så vælge? Det afhænger af dit projekt og dine eksisterende afhængigheder. Her er en hurtig sammenligningstabel:

MetodeBibliotekFordeleUlemper / Vigtigt at vide
ImageOps.invert()Pillow (PIL)Meget brugervenlig, god til generelle billedmanipulationer, god integration med web-frameworks som Django/Flask.Kræver konvertering fra RGBA til RGB. Kan være langsommere end NumPy/OpenCV for store datasæt.
cv2.bitwise_not()OpenCVEkstremt hurtig, ideel til realtids-video og komplekse computer vision-pipelines.Kan være mere kompleks at installere. Farvekanaler læses som BGR som standard, ikke RGB (kræver konvertering for visning med andre biblioteker).
np.invert() eller 255 - arrayNumPyMeget hurtig og effektiv. Giver fuld kontrol over de numeriske data. God hvis du allerede arbejder med NumPy-arrays.Kræver et andet bibliotek (som OpenCV eller Pillow) til at indlæse/gemme billedfiler.

Ofte Stillede Spørgsmål (FAQ)

  • Hvorfor virker inversion ikke korrekt på mit gennemsigtige PNG-billede med Pillow?

    Det skyldes, at ImageOps.invert() er designet til at fungere på RGB- (farve) eller L- (gråtone) billeder. Et gennemsigtigt PNG er i RGBA-tilstand, hvor 'A' er alfakanalen for gennemsigtighed. Du skal konvertere billedet til RGB med image.convert('RGB'), før du kalder invert(). Dette vil fjerne gennemsigtigheden.

  • Er der en forskel i ydeevne mellem metoderne?

    Ja. For store billeder eller behandling af mange billeder i træk (f.eks. video) er OpenCV og NumPy markant hurtigere. Deres kerneoperationer er implementeret i C/C++, hvilket giver en stor ydeevnefordel i forhold til ren Python. Til simple, enkeltstående opgaver er Pollows ydeevne dog mere end tilstrækkelig.

  • Kan jeg invertere en video?

    Absolut. Du kan bruge OpenCV til at læse en videofil billede for billede (frame by frame). I en løkke kan du læse hver frame, anvende en af inversionsmetoderne (f.eks. cv2.bitwise_not()) på den pågældende frame, og derefter skrive den modificerede frame til en ny videofil. Processen er den samme, bare gentaget for hvert billede i videoen.

  • Hvad er forskellen mellem `cv2.bitwise_not()` og `np.invert()`?

    Funktionelt set, når de anvendes på et 8-bit billed-array, producerer de nøjagtigt det samme resultat. Begge udfører en bitvis NOT-operation. Forskellen ligger i, hvilket bibliotek de tilhører. Hvis du allerede bruger OpenCV intensivt, er det naturligt at bruge cv2.bitwise_not(). Hvis din kodebase primært er baseret på NumPy, er np.invert() et oplagt valg.

At invertere et billede i Python er en grundlæggende færdighed, der åbner døren til mere avanceret billedbehandling. Uanset om du vælger den enkle tilgang med Pillow eller den højtydende metode med OpenCV og NumPy, har du nu værktøjerne til at udføre opgaven effektivt. Ved at forstå principperne bag farveinversion kan du bedre anvende teknikken kreativt og analytisk i dine egne projekter.

Hvis du vil læse andre artikler, der ligner Negativ Billedinversion i Python: En Komplet Guide, kan du besøge kategorien Teknologi.

Go up