OpenCV Grundlegende Bildoperationen
Dieser Artikel beschreibt ausführlich vier grundlegende Bildoperationen: Zugriff auf und Änderung von Pixelwerten, ROI-Operationen (Region of Interest) für Bilder, Aufteilen und Zusammenführen von Bildkanälen sowie Skalieren, Drehen, Verschieben und Spiegeln von Bildern.
Häufige Methoden:
| Aktion | Funktion/Methode | Beschreibung |
|---|---|---|
| Auf Pixelwerte zugreifen | image[y, x] | Pixelwerte abrufen oder ändern. |
| Bild-ROI | image[y1:y2, x1:x2] | Einen rechteckigen Bereich in einem Bild abrufen oder ändern. |
| Kanaltrennung und -zusammenführung | cv2.split() / cv2.merge() | Bildkanäle aufteilen oder zusammenführen. |
| Bildskalierung | cv2.resize() | Die Größe eines Bildes ändern. |
| Bildrotation | cv2.getRotationMatrix2D() | Ein Bild drehen. |
| Bildtranslation | cv2.warpAffine() | Ein Bild verschieben. |
| Bildspiegelung | cv2.flip() | Ein Bild spiegeln. |
| Bildaddition | cv2.add() | Additionsoperation auf zwei Bildern durchführen. |
| Bildsubtraktion | cv2.subtract() | Subtraktionsoperation auf zwei Bildern durchführen. |
| Bildüberblendung | cv2.addWeighted() | Gewichtete Überblendung auf zwei Bildern durchführen. |
| Schwellenwertverfahren | cv2.threshold() | Schwellenwertbildung auf einem Bild durchführen. |
| Glättung | cv2.blur() / cv2.GaussianBlur() | Ein Bild glätten. |
1. Zugriff auf und Ändern von Pixelwerten
Ein Bild ist eine Matrix aus Pixeln, und jedes Pixel hat einen oder mehrere Werte, die Farbe oder Graustufen repräsentieren. In einem Graustufenbild hat jedes Pixel nur einen Wert, der die Graustufenintensität repräsentiert; in einem Farbbild hat jedes Pixel typischerweise drei Werte, die die Intensitäten der roten, grünen und blauen (RGB-)Kanäle repräsentieren.
Zugriff auf Pixelwerte
In Python können Sie die OpenCV-Bibliothek verwenden, um auf Bildpixelwerte zuzugreifen. Angenommen, wir haben ein Graustufenbildimg, können Sie verwendenimg[y, x]um auf den Pixelwert an(x, y)Position zuzugreifen. Für Farbbilder können Sie verwendenimg[y, x, c]um auf einen bestimmten Kanal zuzugreifencdes Pixelwerts, wobeic0 (Blau), 1 (Grün) oder 2 (Rot) ist.
Beispiel
# Bild einlesen
img = cv2.imread('image.jpg')
# Auf Pixelwert zugreifen
pixel_value = img[100, 150] # Auf Pixelwert an Position (150, 100) zugreifen
print(pixel_value)
Pixelwerte ändern
Das Ändern von Pixelwerten ist ebenso einfach; weisen Sie einfach der entsprechenden Pixelposition einen neuen Wert zu.
Beispiel
img[100, 150] = [255, 255, 255] # Setze den Pixelwert an Position (150, 100) auf Weiß
2. Bild-ROI-Operationen (Region of Interest)
ROI bezeichnet den interessierenden Bereich in einem Bild. Durch Extrahieren einer ROI können wir nur einen bestimmten Teil des Bildes verarbeiten und dadurch die Verarbeitungseffizienz verbessern.
ROI extrahieren
In OpenCV können Sie Slicing verwenden, um eine ROI zu extrahieren. Angenommen, wir möchten den 100x100-Pixelbereich in der oberen linken Ecke des Bildes extrahieren:
Beispiel
roi = img[0:100, 0:100]
ROI ändern
Nach dem Extrahieren eines ROI-Bereichs können Sie diesen ändern und den geänderten ROI-Bereich dann wieder in das Originalbild einfügen.
Beispiel
roi[:, :] = [0, 255, 0] # Den ROI-Bereich auf Grün setzen
# Den geänderten ROI-Bereich wieder in das Originalbild einfügen
img[0:100, 0:100] = roi
3. Aufteilen und Zusammenführen von Bildkanälen
Farbbilder bestehen typischerweise aus mehreren Kanälen, wie den drei Kanälen eines RGB-Bildes. Manchmal müssen wir diese Kanäle trennen, um sie separat zu verarbeiten, und sie dann wieder in das Originalbild zusammenführen.
Kanaltrennung
In OpenCV können Sie diecv2.split()Funktion zum Trennen der Bildkanäle.
Beispiel
b, g, r = cv2.split(img)
Kanalzusammenführung
Die getrennten Kanäle können mithilfe dercv2.merge()Funktion.
Beispiel
merged_img = cv2.merge([b, g, r])
4. Bildskalierung, Rotation, Translation und Spiegelung
Die geometrische Transformation von Bildern ist eine häufige Operation in der Bildverarbeitung, einschließlich Skalierung, Rotation, Translation und Spiegelung.
Bildskalierung
Die Bildskalierung kann mithilfe dercv2.resize()Funktion erreicht werden. Sie können die Zielbildgröße oder den Skalierungsfaktor angeben.
Beispiel
resized_img = cv2.resize(img, (200, 200)) # Skaliere das Bild auf 200x200 Pixel
Bildrotation
Die Bildrotation kann mithilfe dercv2.getRotationMatrix2D()undcv2.warpAffine()Funktion. Sie müssen das Rotationszentrum und den Rotationswinkel angeben.
Beispiel
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0) # Um 45 Grad drehen
rotated_img = cv2.warpAffine(img, M, (w, h))
Bildtranslation
Bildtranslation kann erreicht werden mithilfe dercv2.warpAffine()Funktion. Sie müssen die Translationsmatrix angeben.
Beispiel
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 100 Pixel nach rechts und 50 Pixel nach unten verschieben
translated_img = cv2.warpAffine(img, M, (w, h))
Bildspiegelung
Das Spiegeln von Bildern kann mit dercv2.flip()Funktion erreicht werden. Sie können die Spiegelrichtung angeben (horizontal, vertikal oder beides).
Beispiel
flipped_img = cv2.flip(img, 1) # Horizontal spiegeln