Naar inhoud
lightbulb Welkom op de nieuwe kennisbank | We hebben de docs volledig vernieuwd met meer dan 160 features. Bekijk wat nieuw isarrow_forward

Afbeeldingen analyseren met Gemini Vision

Gebruik Gemini Vision om afbeeldingen te beschrijven, objecten te detecteren, tekst te lezen (OCR) en visuele vragen te beantwoorden via de nieuwe google-genai SDK.

Gemini Vision: wat kan het

Gemini's visuele capaciteiten gaan verder dan simpele beeldbeschrijvingen. Het model begrijpt context, verbanden en abstracte concepten in afbeeldingen. De hele Gemini 3.5-familie accepteert multimodale invoer (tekst, beeld, audio en video) en geeft tekst terug. Veelvoorkomende toepassingen:

  • Objectdetectie en classificatie: identificeer producten, gebouwen, dieren of voertuigen.
  • OCR en tekstextractie: lees tekst uit foto's, documenten en whiteboards.
  • Grafiek- en diagramanalyse: interpreteer datavisualisaties, flowcharts en architectuurdiagrammen.
  • Sceneomschrijving: genereer alt-tekst, producttitels en toegankelijkheidsbeschrijvingen.
  • Visuele vraagbeantwoording (VQA): beantwoord specifieke vragen over de inhoud.
  • Documentverwerking: extraheer gestructureerde data uit formulieren en facturen.
warning

Gebruik de nieuwe google-genai SDK

De oude google.generativeai-bibliotheek is sinds 30 november 2025 volledig uitgefaseerd en krijgt geen nieuwe features meer. Gebruik de unified SDK google-genai, die je importeert met from google import genai. De voorbeelden hieronder gebruiken die SDK en het stabiele GA-model gemini-3.5-flash.

De client opzetten

Zet eerst je API-sleutel in de omgeving (GEMINI_API_KEY of GOOGLE_API_KEY) en maak een client aan. Die client hergebruik je in alle voorbeelden hieronder.

from google import genai
from google.genai import types
import PIL.Image

client = genai.Client()
MODEL = "gemini-3.5-flash"

Een afbeelding beschrijven

Je kunt een PIL-afbeelding rechtstreeks meegeven in de contents-lijst, samen met je tekstprompt.

image = PIL.Image.open("kantoor.jpg")

response = client.models.generate_content(
    model=MODEL,
    contents=[image, "Beschrijf gedetailleerd wat er op deze afbeelding te zien is."]
)
print(response.text)

Tekst lezen uit afbeeldingen (OCR)

Gemini presteert goed bij het lezen van gedrukte en handgeschreven tekst.

image = PIL.Image.open("factuur.jpg")

response = client.models.generate_content(
    model=MODEL,
    contents=[image, "Extraheer alle tekst uit deze afbeelding en bewaar de originele opmaak zoveel mogelijk."]
)
print(response.text)

Voor gestructureerde extractie (factuurvelden, formulierdata) vraag je JSON terug en forceer je dat met response_mime_type. Zo hoef je niet handmatig markdown of losse zinnen op te schonen.

import json

prompt = """Extraheer de volgende velden uit deze factuur en retourneer JSON:
{
  "factuurnummer": "",
  "datum": "",
  "klant": "",
  "totaalbedrag": "",
  "btw": ""
}"""

response = client.models.generate_content(
    model=MODEL,
    contents=[image, prompt],
    config=types.GenerateContentConfig(response_mime_type="application/json")
)

data = json.loads(response.text)

Objecten lokaliseren met bounding boxes

Gemini kan coordinaten teruggeven voor gedetecteerde objecten. Vraag het model expliciet om box_2d in het formaat [ymin, xmin, ymax, xmax], genormaliseerd naar 0 tot 1000. Reken de waarden daarna terug naar pixels met de werkelijke breedte en hoogte van je afbeelding.

import json

image = PIL.Image.open("winkel.jpg")
prompt = """Detecteer alle producten in deze afbeelding.
Geef per product een object met:
- "label": de naam van het product
- "box_2d": [ymin, xmin, ymax, xmax], genormaliseerd naar 0-1000
Retourneer een JSON-array."""

response = client.models.generate_content(
    model=MODEL,
    contents=[image, prompt],
    config=types.GenerateContentConfig(response_mime_type="application/json")
)

width, height = image.size
for item in json.loads(response.text):
    ymin, xmin, ymax, xmax = item["box_2d"]
    px = (xmin / 1000 * width, ymin / 1000 * height,
          xmax / 1000 * width, ymax / 1000 * height)
    print(item["label"], px)
lightbulb

Vraag altijd om JSON bij coordinaten

Stel response_mime_type="application/json" in en beschrijf de gewenste velden letterlijk in je prompt. Zo voorkom je dat het model uitleg of markdown toevoegt en kun je het antwoord direct met json.loads parsen.

Diagrammen en grafieken analyseren

response = client.models.generate_content(
    model=MODEL,
    contents=[
        PIL.Image.open("verkoop_grafiek.png"),
        """Analyseer deze grafiek:
        1. Wat is het type grafiek?
        2. Wat zijn de assen en eenheden?
        3. Wat is de trend over tijd?
        4. Wat zijn de hoogste en laagste waarden?
        5. Welke conclusie kun je trekken?"""
    ]
)
print(response.text)

Meerdere afbeeldingen vergelijken

Je kunt meerdere afbeeldingen en bijbehorende labels in een enkele contents-lijst plaatsen. De volgorde blijft behouden, dus het model weet welk label bij welke afbeelding hoort.

img1 = PIL.Image.open("product_oud.jpg")
img2 = PIL.Image.open("product_nieuw.jpg")

response = client.models.generate_content(
    model=MODEL,
    contents=[
        "Vergelijk deze twee productafbeeldingen:",
        "Oud ontwerp:", img1,
        "Nieuw ontwerp:", img2,
        "Wat zijn de visuele verschillen? Welk ontwerp oogt professioneler?"
    ]
)
print(response.text)

Een afbeelding via de Files API uploaden

Voor grotere afbeeldingen, hergebruik over meerdere verzoeken of bestanden boven de inline-limiet upload je het bestand eerst en geef je de referentie mee.

my_file = client.files.upload(file="hoge_resolutie_scan.png")

response = client.models.generate_content(
    model=MODEL,
    contents=[my_file, "Lees alle tekst uit dit gescande document."]
)
print(response.text)

Resolutie en kwaliteit afstemmen

Gemini 3 geeft je controle over hoeveel tokens een afbeelding mag kosten via de media_resolution-instelling. Een hogere resolutie kost meer tokens maar leest kleine tekst en details beter. De globale instelling staat in GenerateContentConfig.

Niveau Tokens per afbeelding Geschikt voor
media_resolution_low circa 280 snelle classificatie, grof beeld
media_resolution_medium circa 560 algemene beschrijving
media_resolution_high circa 1120 kleine lettertjes, dichte documenten
media_resolution_ultra_high maximaal extreem fijne details
config = types.GenerateContentConfig(
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_HIGH
)

response = client.models.generate_content(
    model=MODEL,
    contents=[PIL.Image.open("gebruiksaanwijzing.jpg"),
              "Lees alle kleine lettertjes in de gebruiksaanwijzing."],
    config=config
)
print(response.text)

Alt-tekst genereren voor toegankelijkheid

def generate_alt_text(image_path: str) -> str:
    image = PIL.Image.open(image_path)
    response = client.models.generate_content(
        model=MODEL,
        contents=[
            image,
            """Genereer beknopte alt-tekst voor deze afbeelding (maximaal 125 tekens).
            Beschrijf de essentiele visuele inhoud voor iemand die de afbeelding niet kan zien.
            Begin niet met 'Afbeelding van' of 'Foto van'."""
        ]
    )
    return response.text.strip()
Welke SDK en welk model gebruik ik in 2026?

Gebruik de unified google-genai SDK, die je importeert met from google import genai. De oude google.generativeai-bibliotheek is sinds 30 november 2025 uitgefaseerd. Het stabiele GA-model voor vision is gemini-3.5-flash, dat sinds 19 mei 2026 algemeen beschikbaar is.

Herkent Gemini gezichten van specifieke personen?

Nee. Gemini weigert gezichtsidentificatie van privepersonen om privacyredenen. Het kan wel gezichtsuitdrukkingen, emoties en het aantal mensen op een foto beschrijven.

Werkt Gemini Vision met handgeschreven tekst?

Ja, met wisselende nauwkeurigheid. Duidelijk handschrift leest het model goed, krabbelschrift is minder betrouwbaar. Zet media_resolution op een hoger niveau voor handgeschreven documenten.

Hoe nauwkeurig is de kleurherkenning?

Gemini herkent kleuren goed, maar is niet geschikt voor exacte kleurmeting zoals Pantone of hex-waarden. Gebruik daarvoor een computer-vision-bibliotheek zoals OpenCV.

Kan ik een afbeelding uit een URL analyseren zonder ze op te slaan?

Ja. Download de bytes en stuur ze als inline part mee met types.Part.from_bytes(data=image_bytes, mime_type='image/jpeg'). Voor grotere of herbruikte bestanden is de Files API met client.files.upload betrouwbaarder.

Hoeveel tokens kost een afbeelding?

Dat hangt af van media_resolution: ongeveer 280 tokens op laag, 560 op medium en 1120 op hoog. Kies een lager niveau voor grote batches en een hoger niveau wanneer kleine details ertoe doen.