Python-biblioteker
10 beste biblioteker for bildebehandling i Python
Bildebehandling i Python omfatter alt fra daglig redigering og vitenskapelige målinger til videoanalyse, utvidelse av treningsdata for modeller og arbeidsflyter for store bilder. Disse oppgavene krever ulike verktøy. Et bibliotek som egner seg godt til miniatyrbilder, ivaretar kanskje ikke den romlige informasjonen som trengs i et forskningsvolum, mens et bibliotek for GPU-transformasjoner kan tilføre unødvendig kompleksitet i en liten nettjeneste.
Vi gjennomførte en uavhengig evaluering av disse 10 bibliotekene med hensyn til funksjonalitet, datakonvensjoner, integrasjonskrav og praktiske begrensninger, og kontrollerte den gjeldende offisielle dokumentasjonen. OpenCV utmerker seg innen generell datamaskinsyn, Pillow til vanlig redigering av rasterbilder og scikit-image til vitenskapelig analyse. Rangeringen bygger på redaksjonelle vurderinger på tvers av disse bruksområdene, ikke på en ny praktisk hastighetstest.
Flere av bibliotekene fungerer best sammen: ImageIO håndterer ressurser, SciPy tilbyr numeriske operasjoner, og et bibliotek på høyere nivå utfører analysen. Velg en liten kombinasjon som ivaretar bildenes betydning fra innlesing til utdata.
Sammenligning av de beste bibliotekene for bildebehandling i Python
| AI-verktøy | Best for | Funksjoner |
|---|---|---|
| OpenCV | Generell datamaskinsyn og arbeidsflyter for video | Filtrering; geometri; særtrekk; kalibrering; videoanalyse |
| Pillow | Daglig bilderedigering og filhåndtering | Beskjæring; endring av størrelse; komposisjon; tegning; modi; formatstøtte |
| scikit-image | Vitenskapelig bildeanalyse og måling | Segmentering; morfologi; restaurering; særtrekk; målinger av regioner |
| torchvision | Forbehandling av bilder i PyTorch-arbeidsflyter | Transforms v2; bilder; masker; bokser; videoer; nøkkelpunkter |
| Kornia | Differensierbar synsteknologi og behandling av grupperte tensorer | PyTorch-operatorer; geometri; filtre; farger; datautvidelse |
| AlbumentationsX | Omfattende datautvidelse med synkroniserte målverdier for trening | Sammensettbare transformasjoner; bilder; masker; bokser; nøkkelpunkter; volumer |
| SciPy ndimage | Flerdimensjonal filtrering og operasjoner på matrisenivå | Filtre; morfologi; interpolering; merking; målinger |
| ImageIO | Lesing og skriving av bilderessurser som matriser | v3-API; programtillegg; sekvenser; metadata; ressursinspeksjon |
| SimpleITK | Romlig bevisste volumer og arbeidsflyter for registrering | Bildegeometri; avstand; origo; retning; romlige transformasjoner |
| pyvips | Arbeidsflyter for store bilder med kontrollert minnebruk | Binding til libvips; late arbeidsflyter; sekvensiell tilgang; bildeoperasjoner |
1. OpenCV
OpenCV er vår første anbefaling når bildebehandling inngår i en større applikasjon for datamaskinsyn. Python-grensesnittet omfatter filtrering, geometriske transformasjoner, deteksjon av særtrekk, kamerakalibrering og videoanalyse. Denne bredden gjør biblioteket nyttig når det samme prosjektet må rense et bilde, finne strukturer og behandle en strøm av bilderammer, i stedet for bare å konvertere én enkelt fil.
En viktig detalj ved integrasjon er hvordan bildet er representert. Vanlige metoder for innlasting av fargebilder i OpenCV bruker BGR-rekkefølge, mens mange tilknyttede verktøy forventer RGB. Eksplisitt konvertering mellom biblioteker forebygger resultater som ser overbevisende ut, men er feil. Følg også med på om verdiene er heltall eller flyttall, og om en funksjon forventer gråtonebilder eller flere kanaler. En matrise med riktige dimensjoner er ikke nødvendigvis semantisk korrekt.
Vi anbefaler OpenCV til arbeidsflyter med kameraer og generell utvikling innen datamaskinsyn, mens Pillow som regel er enklere til grunnleggende bilderedigering. Test den installerte byggkonfigurasjonen mot de nødvendige videokildene, kodekene og valgfrie funksjonene før utrulling. At en operasjon fungerer på en lokal JPEG-fil, er ingen garanti for at et produksjonskamera eller en kodet strøm vil fungere på samme måte. Mål dekoding, behandling og utdata samlet når du vurderer ytelse i sanntid.
Fordeler og ulemper
- Omfattende verktøykasse for klassisk datamaskinsyn
- Arbeidsflyter for bilder og video i samme økosystem
- Tilgang til native implementasjoner via Python
- Krever oppmerksomhet på konvensjoner for farger og datatyper
- Tilgjengeligheten av kodeker og valgfrie funksjoner avhenger av byggkonfigurasjonen
2. Pillow
Pillow er et praktisk utgangspunkt for vanlige oppgaver med rasterbilder, som å lage miniatyrbilder, beskjære, konvertere filformater, sette sammen bilder og legge til tekst. Biblioteket har et oversiktlig grensesnitt for bildeobjekter som er enklere å følge enn en fullstendig pakke for datasyn i mange skript og nettjenester. Når målet er å klargjøre eller levere et bilde, er enkelheten ofte den største fordelen.
Bildemoduser og metadata fortjener like mye oppmerksomhet som selve endringen av bildestørrelsen. RGB-bilder, gråtonebilder, palettbilder og bilder med alfakanal kan kreve ulik behandling, og orienteringsmetadata kan påvirke hvordan et fotografi skal vises. Bestem hvordan arbeidsflyten skal håndtere gjennomsiktighet, fargeprofiler og utgangskvalitet. En fil som åpnes uten problemer, kan likevel se feil ut etter en ufullstendig konvertering.
Vi anbefaler Pillow til vanlige redigeringsarbeidsflyter med håndterbare bildestørrelser. Bruk representative inndata når du kontrollerer resultatet, blant annet gjennomsiktige ressurser og fotografier med orienteringsmetadata. Ta hensyn til grenser for dekomprimering og støttede kodeker ved opplasting fra brukere, og ikke gå ut fra at alle filformater bevarer alle typer metadata. Til omfattende vitenskapelige målinger, sporing i sanntid eller behandling av svært store bilder med strenge minnebegrensninger kan et annet bibliotek nedenfor være en bedre hovedkomponent.
Fordeler og ulemper
- Brukervennlig grensesnitt for bilderedigering
- Nyttige verktøy for filformater, tegning og bildekomposisjon
- Godt egnet for skript og nettressurser
- Ikke et komplett system for bildeanalyse
- Bildemoduser, metadata og store inndata krever bevisst håndtering
3. scikit-image
scikit-image er vårt foretrukne generelle utgangspunkt for vitenskapelig bildeanalyse i NumPy-økosystemet. Biblioteket tilbyr algoritmer for segmentering, morfologi, restaurering, uttrekking av bildetrekk og måling. En fordel er en oversiktlig analysearbeidsflyt der mellomliggende matriser kan undersøkes. Det gjør biblioteket nyttig for mikroskopi, eksperimentelle bilder og prosjekter der det er like viktig å forstå et resultat som å produsere det.
Konvensjonene for datatyper er avgjørende for riktig bruk. Å konvertere et heltallsbilde til flyttall er ikke alltid det samme som å skalere intensitetene til intervallet en algoritme forventer. Kontroller de dokumenterte forutsetningene for hver funksjon, og bruk egnede konverteringsverktøy. Et visuelt plausibelt resultat kan skjule en numerisk feil som endrer terskler, avstander eller etterfølgende målinger.
Velg scikit-image når du vil bygge og forklare en analysearbeidsflyt basert på velprøvde operasjoner. Valider segmentering og målinger mot representative eksempler i stedet for å vurdere bare en polert visualisering. Biblioteket er ikke et system for kamerainnhenting eller en erstatning for en spesialisert bildemodell med fysiske koordinater. For volumetriske data må du identifisere hvilke akser som er romlige, og hvilke som representerer kanaler eller tid, før du utfører en operasjon på matrisen.
Fordeler og ulemper
- Oversiktlige arbeidsflyter for vitenskapelig analyse
- Omfattende støtte for segmentering og måling
- Naturlig integrasjon med NumPy-matriser
- Konvensjoner for intensitetsområder kan føre til subtile feil
- Kamerainnhenting og fysiske metadata krever andre verktøy
4. torchvision
torchvision er det naturlige førstevalget når bildebehandling inngår i en PyTorch-modell for datasyn. Transformasjonene kan klargjøre bilder og tilhørende annotasjoner i samme treningsarbeidsflyt, slik at behovet for separat kode til forhåndsbehandling blir mindre. Det større biblioteket inneholder også datasett og synsmodeller, men den mest relevante delen her er transformasjonslaget rundt modellinndataene.
Den gjeldende dokumentasjonen anbefaler torchvision.transforms.v2. Disse transformasjonene håndterer både bilder og mål som avgrensningsbokser, masker, videoer og nøkkelpunkter. Dette er viktig når et utsnitt eller en vending må gjelde både piksler og etiketter. Bruk riktige inndatatyper, og kontroller de transformerte annotasjonene visuelt. Hvis bildet og masken får uavhengig tilfeldig valgte transformasjoner, blir treningsdataene mindre pålitelige.
Vi anbefaler torchvision når transformasjonene biblioteket støtter, dekker oppgaven, og prosjektet allerede er avhengig av PyTorch. Kontroller tensorens form, datatype, verdiområde og hvilken forhåndsbehandling de valgte modellvektene forventer. Sørg for at valideringstransformasjonene er deterministiske, med mindre evalueringen uttrykkelig krever en annen fremgangsmåte. Plasseringen på listen skyldes enkel integrasjon, ikke en universell hastighetsfordel; ytelsen avhenger av bildestørrelse, minneoppsett, datainnlasting og hvor transformasjonene utføres.
Fordeler og ulemper
- Passer naturlig inn i PyTorch-prosjekter
- Den anbefalte v2-API-en støtter flere typer mål
- Kan holde romlige transformasjoner på linje med annotasjonene
- Krever nøye håndtering av konvensjoner for mål og tensorer
- Ytelsen avhenger av hele datainnlastingsløpet
5. Kornia
Kornia er særlig nyttig når bildebehandlingsoperasjoner skal inngå i en PyTorch-beregning i stedet for å kjøres som et separat skript for forhåndsbehandling. Biblioteket tilbyr tensorbaserte operasjoner for synsdata innen geometri, filtrering, farger, matching av bildetrekk og datautvidelse. Mange av operasjonene støtter derivasjon, slik at et optimaliseringsmål kan avhenge av transformerte bilder, i stedet for at forhåndsbehandlingen behandles som et fast, eksternt trinn.
Kornias kjøringsmodell med grupperte data kan også være nyttig når dataene allerede ligger på en akselerator. Det er imidlertid ikke automatisk en fordel å flytte en operasjon til en GPU: dataoverføringer, gruppestørrelse, minneallokering og omkringliggende arbeid påvirker alle den samlede kjøretiden. Sammenlign en komplett arbeidsflyt med en realistisk arbeidsmengde. Kontroller hvordan derivasjon fungerer for de konkrete operasjonene og parameterne optimaliseringen din faktisk trenger.
Vi anbefaler Kornia for deriverbar geometri, læringssystemer og arbeidsflyter for synsdata som bruker tensorer direkte. Det er som regel unødvendig ekstraarbeid for et skript som bare lager noen få miniatyrbilder. Kontroller tensorenes oppbygning, intensitetsområder og koordinatkonvensjoner når du kobler biblioteket til et annet bibliotek. Selv når gradienter er tilgjengelige, kan en optimalisering mislykkes fordi målfunksjonen eller initialiseringen er dårlig. Deriverbarhet er en nyttig egenskap, ikke en garanti for korrekt registrering eller en innlært transformasjon.
Fordeler og ulemper
- Operasjoner for synsdata kan inngå i automatisk derivasjon
- Arbeidsflyter med grupperte tensorer og akseleratorer
- Nyttige komponenter for geometri og datautvidelse
- Krever PyTorch og bibliotekets tensor-konvensjoner
- Gevinster med GPU og derivasjonsegenskaper avhenger av operasjonen
6. AlbumentationsX
AlbumentationsX er et godt spesialverktøy for å lage varierte strategier for datautvidelse av treningsdata til datasyn. De sammensettbare transformasjonene kan utføre romlige endringer konsekvent på bilder og tilhørende mål, blant annet masker, avgrensningsbokser og nøkkelpunkter. Denne koordineringen er viktigere enn bare å ha mange visuelle effekter: Treningseksemplene må fortsatt være riktig merket etter beskjæring, rotasjon eller andre geometriske endringer.
Begynn med datautvidelser som gjenspeiler sannsynlige variasjoner i det tiltenkte miljøet. Undersøk transformerte eksempler, og kontroller hvordan beskårne objekter, tomme masker og delvis synlige annoteringer håndteres. Kraftigere datautvidelse er ikke alltid bedre: En operasjon kan fjerne signalet, endre betydningen av etiketten eller skape eksempler som ikke ligner på noe modellen vil møte. Mål effekten av strategien på et uavhengig valideringssett.
Den vedlikeholdte pakken har en annen lisensieringsmessig kontekst enn den eldre Albumentations. Den gjeldende offisielle dokumentasjonen tilbyr AlbumentationsX under AGPL-3.0-only eller på separate kommersielle vilkår. Ikke gå ut fra at en eldre beskrivelse av MIT-lisensen gjelder for en ny installasjon. Gå gjennom den nøyaktige pakken og versjonen før du tar den i bruk. Vi anbefaler den på grunn av den tekniske nytten, men anbefaler torchvision eller et annet egnet alternativ dersom funksjonene eller lisensvilkårene passer prosjektet bedre.
Fordeler og ulemper
- Omfattende arbeidsflyter med sammensettbar datautvidelse
- Koordinerer bilder og tilhørende mål
- Nyttig for flere oppgaver innen trening av modeller for synsdata
- Gjeldende lisensvilkår er annerledes enn i eldre beskrivelser
- Dårlig valgte strategier kan ødelegge treningseksempler
7. SciPy ndimage
SciPys ndimage-modul hører hjemme i et generelt verktøysett for bildebehandling fordi mange oppgaver begynner med operasjoner på flerdimensjonale matriser. Den tilbyr filtrering, matematisk morfologi, interpolering, merking og målinger uten at det kreves et rammeverk for modelltrening. Modulen er særlig nyttig når bilder inngår i en større vitenskapelig beregning som allerede bruker NumPy og SciPy.
Tilnærmingen på lavt nivå gir utviklere kontroll over numeriske detaljer som grensesnitt på høyere nivå kan skjule. Håndtering av grenser, interpolasjonsorden, datatype for utdata og aksene som behandles, kan endre betydningen av et resultat. Velg disse innstillingene eksplisitt i viktige arbeidsflyter. En fargekanal eller tidsakse bør ikke ved et uhell glattes ut som om den var en ekstra romlig dimensjon.
Vi anbefaler ndimage for gjenbrukbare numeriske byggeklosser, blant annet til volumetrisk behandling, og scikit-image for mange analysearbeidsflyter på et høyere nivå. De to kan utfylle hverandre i stedet for å konkurrere om å brukes alene. Modulen tilbyr ikke et komplett system for bildefiler eller romlige metadata, så sørg for å ivareta disse behovene andre steder i programmet. Test små matriser med kjente forventede resultater før du skalerer en operasjon opp til et stort datasett, særlig når grensehåndtering eller sammenheng mellom etiketter påvirker målingene.
Fordeler og ulemper
- Et bredt utvalg av grunnleggende operasjoner på flerdimensjonale data
- Passer inn i eksisterende arbeidsflyter med NumPy og SciPy
- Eksplisitte numeriske kontroller
- API-er på lavere nivå krever nøye valg av parametere
- Filinnlesing og -skriving og fysiske metadata må håndteres separat
8. ImageIO
ImageIO har en viktig støttefunksjon: å hente bildedata inn i og ut av en arbeidsflyt basert på matriser. v3-grensesnittet tilbyr funksjoner for lesing, skriving, iterering og inspeksjon, mens programtillegg håndterer de underliggende ressursene og formatene. Det kan koble filbaserte inndata til analyse i NumPy eller scikit-image, uten at analysekoden må håndtere alle detaljene ved hver enkelt dekoder.
Et enhetlig grensesnitt betyr ikke at alle programtillegg fungerer likt. Støtte for formater, metadata, valg av bilderamme og valgfrie avhengigheter kan variere. Angi og test programtillegget når reproduserbarhet er viktig, og skill mellom ett enkelt bilde og en bildesekvens eller et volum. Avhengig av formatet og den påfølgende operasjonen kan det være mer hensiktsmessig å iterere over bilderammene enn å laste en hel ressurs inn i minnet.
Vi anbefaler ImageIO som et tillegg for innlesing og utskriving, ikke som en erstatning for biblioteker for segmentering, filtrering eller geometri. Kontroller representative filer, inkludert filer med uvanlig bitdybde og flersidige inndata, i det faktiske produksjonsmiljøet. Sjekk at skriving og påfølgende innlesing av en utdatafil bevarer verdiene og metadataene programmet trenger. At en fil dekodes uten feil, er ikke i seg selv tilstrekkelig bevis på at resten av en vitenskapelig arbeidsflyt eller maskinlæringsarbeidsflyt har mottatt den tiltenkte representasjonen.
Fordeler og ulemper
- Praktisk grensesnitt for matrisebasert innlesing og utskriving
- Støtte for ressurser via programtillegg
- Nyttig iterering og inspeksjon av metadata
- Funksjonaliteten varierer etter programtillegg og installerte avhengigheter
- Tilbyr innlesing og utskriving, ikke et fullverdig analyseverktøy
9. SimpleITK
SimpleITK er vår spesialistanbefaling når et bilde representerer et fysisk område, ikke bare et rutenett av piksler på en skjerm. Bildemodellen omfatter opprinnelse, avstand mellom piksler og retning, i tillegg til størrelse og pikselverdier. Dette er spesielt viktig for medisinske og vitenskapelige volumer, der avstander og orientering påvirker hvordan bilder bør justeres, resamples og måles.
To matriser med samme form kan beskrive ulike fysiske posisjoner. Derfor er det like viktig å bevare geometrien under behandlingen som å bevare selve verdiene. Konvertering mellom SimpleITK-bilder og NumPy-matriser krever at man tar hensyn til aksekonvensjoner og metadata. En operasjon som ser riktig ut i en snittviser, kan likevel gi et volum med feil posisjon eller skalering hvis den romlige informasjonen går tapt.
Vi anbefaler SimpleITK for registrering og romlig analyse der den eksplisitte bildemodellen er nyttig. Biblioteket er mer spesialisert enn det som trengs for vanlige nettbilder. Bruk konsekvente måleenheter, inspiser geometrien etter transformering, og test resampling med kjente landemerker eller andre egnede referanser. Biblioteket tilbyr verktøy for bildeberegninger, men fastslår ikke om en vitenskapelig konklusjon er gyldig, og gjør ikke en arbeidsflyt klinisk egnet uten egen fagspesifikk validering.
Fordeler og ulemper
- Eksplisitt representasjon av bilder i fysisk rom
- Et nyttig grunnlag for registrering og resampling
- Egnet for vitenskapelige arbeidsflyter med volumdata
- Geometri og konvertering av matriser krever omtanke
- Mer spesialisert enn vanlig redigering av rasterbilder
10. pyvips
pyvips er verdt å vurdere når bildestørrelsen eller behandlingsvolumet gjør en enkel arbeidsflyt med innlasting, redigering og lagring for ressurskrevende. Biblioteket gir tilgang til libvips fra Python og bygger arbeidsflyter der pikslene behandles når et resultat etterspørres. Denne tilnærmingen kan redusere behovet for å materialisere hvert mellomliggende bilde, noe som gjør den attraktiv for omfattende arbeidsbelastninger knyttet til bildelevering eller satsvis behandling.
Tilgangsmønstrene er sentrale for hvordan biblioteket fungerer. Dokumentasjonen skiller mellom sekvensiell og vilkårlig tilgang og forklarer at den første innlastingen av en fil leser toppteksten, i stedet for å dekode alle pikslene umiddelbart. Velg en tilgangsmodus som passer til operasjonene som følger. Hvis et stort bilde konverteres til en komplett NumPy-matrise, kan minnefordelen som motiverte bruken av en behovsstyrt arbeidsflyt, gå tapt.
Vi anbefaler pyvips når målinger viser at dekoding, minnepress eller gjentatte bildeoperasjoner er en flaskehals. Kontroller hvilke libvips-funksjoner som er installert, og at nødvendige formater støttes på produksjonsmaskinen. Mål deretter maksimalt minneforbruk og samlet behandlingstid. Biblioteket er ikke automatisk det beste valget for alle algoritmer, særlig ikke algoritmer som krever ubegrenset tilgang til matriser. Her utvider det listen over aktuelle biblioteker utover modelltrening og små bilder, til også å omfatte de praktiske kostnadene ved å drifte bildearbeidsflyter i stor skala.
Fordeler og ulemper
- Behovsstyrt behandling kan redusere minnebruken til mellomliggende data
- Arbeidsflyter med sekvensiell tilgang egner seg for store bilder
- Tilgang til libvips-operasjoner fra Python
- Fordelene avhenger av tilgangsmønstre og operasjoner
- Det er nødvendig å kontrollere det native biblioteket og formatstøtten i distribusjonsmiljøet
Bildekonvensjoner som kan føre til feil i en datapipeline
- Farger og kanaler: Registrer om bildene bruker RGB eller BGR, er gråtonebilder eller fargebilder, og hvordan alfakanalen representeres. Gjør konverteringer bevisst ved grensene mellom biblioteker.
- Datatyper og verdiområder: Å konvertere en matrise til flyttall normaliserer den ikke nødvendigvis. Bevar meningsfulle vitenskapelige verdier, og følg forventningene til funksjonen som mottar dem.
- Akser og geometri: Skill mellom høyde, bredde, kanaler, tid og dybde. For romlige bilder må du bevare avstand, origo, retning og konsekvente enheter.
- Interpolering: Behandle kategoriske masker annerledes enn bilder med kontinuerlige intensitetsverdier. En interpoleringsmetode som passer for et fotografi, kan føre til ugyldige etikettverdier i en segmenteringsmaske.
- Metadata og orientering: Test fargeprofiler, orienteringskoder og gjennomsiktighet gjennom en fullstendig lese-, behandle- og skriveprosess. Definer hvilke metadata utdataene må bevare.
- Treningsmål: Visualiser bokser, masker og nøkkelpunkter etter dataaugmentering. Romlig konsistente transformasjoner kan likevel skape uegnede eksempler hvis policyen endrer betydningen av etikettene.
Slik sammenligner du ytelse og vedlikehold
Kjør ytelsestester på komplette arbeidsflyter med representative bildestørrelser og -formater. Ta med dekoding, kopiering, overføring mellom enheter, behandling og koding; registrer både maksimalt minneforbruk og medgått tid. Et raskt filter kan ha liten effekt når fildekodingen er den største flaskehalsen, og hvis du konverterer et bilde med behovsstyrt innlasting, til en fullstendig matrise, kan minnebruken endres betydelig.
Lås kompatible versjoner, og kontroller valgfrie kodeker eller programtillegg på maskinen der løsningen skal distribueres. For dataaugmentering er den offisielle lisensveiledningen for AlbumentationsX et naturlig utgangspunkt for å finne gjeldende vilkår for pakken. Ikke stol på lisensinformasjon som er kopiert fra en eldre pakke eller veiledning.
Når behandling av data brukes som inndata til en modell, kan du bruke veiledningen vår til maskinlæringsbiblioteker for Python til å velge modelleringslaget, eller sammenligningen vår av biblioteker for dyp læring for nevrale arbeidsflyter. Sørg for at forhåndsbehandlingen av bilder er konsekvent under trening og inferens.
Hvilket bildebibliotek bør du velge?
Begynn med OpenCV for generell bilde- og videobehandling, Pillow for vanlig bilderedigering eller scikit-image for vitenskapelig analyse. Legg til SciPy ndimage når du trenger eksplisitte flerdimensjonale numeriske operasjoner, og ImageIO når det er innlasting og skriving av ressurser du mangler.
For PyTorch-prosjekter kan du prøve torchvision for standard forhåndsbehandling og synkroniserte mål, og Kornia når deriverbare operasjoner eller operasjoner på grupper av tensorer er viktige. Vurder AlbumentationsX for mer omfattende augmenteringspolicyer etter at du har kontrollert pakkevilkårene og validert resultatene.
Bruk SimpleITK når fysisk geometri er grunnleggende for bildet, og pyvips når behandling av store bilder krever en annen minnestrategi. Det beste valget bevarer dataene programmet trenger, samtidig som kostnadene ved behandling og distribusjon er forståelige.












