KI‑Kompass
Kompass

Ein Bild als Zahlenfeld

Pixel, Kanäle, Farbräume und Histogramme: was tatsächlich im Speicher liegt, wenn ein Bild geladen wird, und warum BGR die häufigste Fehlerquelle ist.

·2 Min. Lesezeit·Von Fachredaktion Technik
DETAILGRAD
3 Abschnitte

Die Idee

Ein Graustufenbild ist eine Tabelle: jede Zelle enthält eine Zahl zwischen 0 (schwarz) und 255 (weiß). Ein Farbbild sind drei solche Tabellen übereinander, je eine für Rot, Grün und Blau. Mehr ist es nicht.

Was daraus folgt

Alles, was mit Bildern gemacht wird, ist Rechnen mit diesen Zahlen. Heller machen heißt addieren. Kontrast erhöhen heißt multiplizieren. Weichzeichnen heißt jeden Wert durch den Mittelwert seiner Nachbarn ersetzen.

Die Farbräume

RaumKanäleWofür
RGB / BGRRot, Grün, BlauDarstellung, Standardformat
GraustufenHelligkeitKanten, Formen, Geschwindigkeit
HSVFarbton, Sättigung, WertFarbfilter, robust gegen Helligkeit
LABHelligkeit, zwei FarbachsenFarbabstände, die dem Auge entsprechen
YCrCbHelligkeit, zwei DifferenzenKompression, Hauttöne
import cv2, numpy as np

img = cv2.imread("regal.jpg")            # ACHTUNG: liefert BGR, nicht RGB
print(img.shape, img.dtype)              # (3000, 4000, 3) uint8
print(img.nbytes / 1e6, "MB")            # 36.0

rgb  = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
grau = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv  = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Alle roten Flaechen finden. In HSV ist Rot der Sonderfall:
# der Farbton laeuft ueber 0 hinweg, deshalb zwei Bereiche.
m1 = cv2.inRange(hsv, (0, 120, 70), (10, 255, 255))
m2 = cv2.inRange(hsv, (170, 120, 70), (180, 255, 255))
maske = cv2.bitwise_or(m1, m2)
print("roter Flaechenanteil:", round(float(maske.mean()) / 255, 4))
  • Nach imread prüfen, ob das Ergebnis None ist. Ein falscher Pfad wirft keine Ausnahme.
  • Vor jeder Anzeige oder jedem Modell die Kanalreihenfolge klären.
  • Für Modelle auf float32 und den Bereich 0 bis 1 normalisieren, mit den Werten des Vortrainings.
  • EXIF-Rotation beachten: viele Handybilder liegen physisch gedreht im Speicher.

Graustufenumrechnung

Luminanz nach ITU-R BT.601

Y = 0,299 · R + 0,587 · G + 0,114 · B

Grün wird am stärksten gewichtet, weil das Auge dafür am empfindlichsten ist; Blau am schwächsten.

R, G, B
die drei Farbkanäle, jeweils 0 bis 255
Y
die wahrgenommene Helligkeit

Der schlichte Mittelwert (R+G+B)/3 ist deshalb falsch: ein sattes Blau und ein sattes Grün gleicher Rechnung erscheinen im Ergebnis gleich hell, obwohl das Auge sie sehr unterschiedlich wahrnimmt.

Histogramm und Belichtung

Histogramm

h(k) = |{ (x,y) : I(x,y) = k }|, k = 0 … 255

Das Histogramm zählt für jeden möglichen Helligkeitswert, wie oft er im Bild vorkommt.

h(k)
Anzahl der Pixel mit Wert k
I(x,y)
der Wert an Position x, y

Drei Diagnosen aus einem Blick auf das Histogramm:

  • Spitze bei 255, überbelichtet, Information ist verloren und nicht rückholbar.
  • Alles zwischen 60 und 120, kontrastarm, ein Ausgleich hilft.
  • Zwei getrennte Berge, es gibt einen natürlichen Schwellwert, siehe Otsu in Vorverarbeitung mit OpenCV.

Speicher, durchgerechnet

Speicherbedarf eines Bildstapels

M = b · h · w · c · s

Der Bedarf wächst linear in allen Faktoren, und der Wechsel von uint8 auf float32 vervierfacht ihn.

b
Anzahl Bilder je Stapel
h, w
Höhe und Breite
c
Kanäle
s
Bytes je Wert: 1 für uint8, 4 für float32

Ein Stapel von 32 Bildern in 1024 × 1024 mit drei Kanälen belegt in uint8 32 × 1024 × 1024 × 3 × 1 = 100,7 MB und in float32 402,7 MB, und das ist nur die Eingabe, ohne die Aktivierungen des Netzes. Genau hier entsteht der Speicherdruck, der zur Wahl der Bildgröße zwingt.

War diese Seite hilfreich?
Ein Bild als Zahlenfeld