HOWTO · Python

Invertieren eines Bildes mit dem OpenCV-Modul in Python

Erfahren Sie, wie Sie ein Bild mit dem OpenCV-Modul in Python invertieren

Auf dieser Seite

Invertiere ein Bild in Python, indem du cv2.bitwise_not() auf ein von OpenCV zurückgegebenes Array anwendest. Bei vorzeichenlosen 8-Bit-Bildkanälen wird jeder Wert v zu 255 - v. In den folgenden Abschnitten werden das Verhalten der Kanäle erläutert, die Berechnung anhand von Beispieldaten für Pixel gezeigt und das Verarbeiten sowie Speichern von Farb- und Graustufenbildern vorgeführt.

Voraussetzungen und ein Bild laden

Installiere Python und OpenCV in der Umgebung, in der das Skript ausgeführt wird. Das Paket heißt opencv-python; im Python-Code wird es als cv2 importiert. Falls es noch nicht verfügbar ist, installiere es mit pip install opencv-python. Für die NumPy-Alternative wird NumPy ebenfalls benötigt. Es wird als Abhängigkeit des üblichen OpenCV-Python-Pakets installiert.

Setze input_path auf eine lesbare Bilddatei. OpenCV lädt Farbbilder standardmäßig mit der Kanalreihenfolge BGR. Weise zum Laden image = cv2.imread(input_path) zu. Prüfe vor der Verarbeitung, ob image is not None gilt, denn bei einer fehlenden oder nicht lesbaren Datei gibt imread den Wert None zurück. Die folgenden Beispiele verwenden 8-Bit-Kanalwerte, wie sie bei gängigen Bilddateien üblich sind.

So funktioniert die Bildinvertierung

Bei der Invertierung wird jeder Kanalwert durch seinen Komplementwert ersetzt. Bei vorzeichenlosen 8-Bit-Werten von 0 bis 255 wird Schwarz zu Weiß, Weiß zu Schwarz und beispielsweise der Wert 40 zu 215. Die Operation wird unabhängig auf jeden Kanal angewendet; bei einem Farbpixel werden also die Blau-, Grün- und Rotwerte jeweils invertiert. Das standardmäßige Farbarray von OpenCV verwendet BGR statt RGB. Die Invertierung behält diese Kanalreihenfolge bei und vertauscht daher keine Farben.

Ein Bild mit OpenCV invertieren

OpenCVs cv2.bitwise_not() wendet auf jedes Array-Element ein bitweises NOT an. Bei vorzeichenlosen 8-Bit-Bilddaten ergibt das dasselbe wie die Subtraktion jedes Werts von 255. Dieses kleine Beispiel mit der Python-Standardbibliothek macht die Pixelberechnung sichtbar, ohne eine Bilddatei oder ein Bildverarbeitungspaket zu benötigen. Nutze es, um die Werte nachzuvollziehen. Für ein OpenCV-Bildarray rufe nach erfolgreichem Laden cv2.bitwise_not(image) auf.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

pixel = [10, 40, 200]
inverted_pixel = [255 - value for value in pixel]
print("original:", pixel)
print("inverted:", inverted_pixel)
original: [10, 40, 200]
inverted: [245, 215, 55]

Für einen Dateiablauf setze input_path und output_path auf dein Bild und den gewünschten Speicherort und führe dann dieses Beispiel aus. Installiere zuvor OpenCV. Die angegebenen Pfade sind konkrete Platzhalter, die du durch Dateien auf deinem Rechner ersetzen musst. Das Programm meldet einen Lade- oder Schreibfehler, ohne ein fehlendes Bild zu verarbeiten.

try:
    import cv2
except ImportError:
    print("Install opencv-python to run this example.")
else:
    input_path = "input.png"
    output_path = "inverted.png"
    image = cv2.imread(input_path)

    if image is None:
        print(f"Could not read {input_path}")
    else:
        inverted = cv2.bitwise_not(image)
        written = cv2.imwrite(output_path, inverted)
        if not written:
            print(f"Could not write {output_path}")

        show_preview = False
        if show_preview:
            cv2.imshow("Original", image)
            cv2.imshow("Inverted", inverted)
            cv2.waitKey(0)
            cv2.destroyAllWindows()

Das geladene Farbarray und das invertierte Ergebnis befinden sich in image beziehungsweise inverted. OpenCV gibt Farbkanäle standardmäßig in der Reihenfolge BGR zurück. Diese Operation invertiert jeden Kanal, ohne die Reihenfolge zu ändern. Die obige Pixelberechnung zeigt dasselbe Ergebnis für vorzeichenlose 8-Bit-Werte.

Ein Graustufenbild invertieren

Ein Graustufenbild enthält pro Pixel einen Intensitätswert statt drei Farbkanälen. Lade es direkt mit cv2.IMREAD_GRAYSCALE, prüfe, ob gray_image is not None gilt, und wende dieselbe bitweise Operation an. Das Ergebnis bleibt ein zweidimensionales Array mit einem Kanal und kann mit cv2.imwrite() gespeichert werden.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

try:
    import cv2
except ImportError:
    print("Install opencv-python to run this example.")
else:
    input_path = "input.png"
    gray_output_path = "inverted-gray.png"
    gray_image = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE)

    if gray_image is None:
        print(f"Could not read {input_path} as grayscale")
    else:
        inverted_gray = cv2.bitwise_not(gray_image)
        written = cv2.imwrite(gray_output_path, inverted_gray)
        if not written:
            print(f"Could not write {gray_output_path}")

Ein Bild mit NumPy invertieren

NumPy stellt numpy.invert als Alternative bereit, wenn die Bilddaten bereits in einem NumPy-Array vorliegen. Die Funktion führt auf jedes Element ein bitweises NOT aus. Bei vorzeichenlosen 8-Bit-Werten ergibt das dasselbe Kanal-Komplement wie mit OpenCV. Dieses Beispiel liest ein 8-Bit-Farbbild ein, invertiert es mit NumPy und prüft, ob das Ergebnis gespeichert wurde. Die Deutung 255 - v gilt hier nur für vorzeichenlose 8-Bit-Daten. Übertrage sie nicht auf vorzeichenbehaftete oder breitere Ganzzahl-Arrays; NumPy führt dort weiterhin ein bitweises Komplement aus.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

try:
    import cv2
    import numpy as np
except ImportError:
    print("Install opencv-python and numpy to run this example.")
else:
    input_path = "input.png"
    numpy_output_path = "inverted-numpy.png"
    image = cv2.imread(input_path)

    if image is None:
        print(f"Could not read {input_path}")
    else:
        inverted_numpy = np.invert(image)
        written = cv2.imwrite(numpy_output_path, inverted_numpy)
        if not written:
            print(f"Could not write {numpy_output_path}")

Bei gewöhnlichen 8-Bit-Bilddateien liefern cv2.bitwise_not(image) und numpy.invert(image) dasselbe Ergebnis für jeden Kanal. Verwende die OpenCV-Operation, wenn der übrige Arbeitsablauf bereits OpenCV nutzt. NumPy eignet sich, wenn du gezielt dessen Array-Funktion brauchst.

Das invertierte Bild speichern und anzeigen

Schreibe das Array, das zum invertierten Bild gehört: Verwende cv2.imwrite(output_path, inverted) für ein Farbergebnis oder cv2.imwrite(gray_output_path, inverted_gray) für Graustufen. Prüfe den zurückgegebenen booleschen Wert. False bedeutet, dass OpenCV die Datei nicht schreiben konnte, etwa weil der Zielpfad nicht verfügbar oder das Format nicht unterstützt ist. Die Beispiele prüfen das Ergebnis mit written und melden einen fehlgeschlagenen Schreibvorgang.

Das OpenCV-Beispiel enthält einen optionalen Vorschau-Block. Setze dort show_preview auf True, um beide Fenster zu öffnen. Für die GUI-Anzeige ist eine grafische Umgebung erforderlich; in einer Sitzung ohne grafische Oberfläche ist sie möglicherweise nicht verfügbar. Das Speichern mit cv2.imwrite() benötigt kein Fenster. Die OpenCV- und NumPy-Beispiele für Bilddateien setzen eine Umgebung mit den entsprechenden Paketen und einer lesbaren Datei input.png voraus. Die bereitgestellten Ausführungsnachweise für diesen Artikel beziehen sich nur auf die kleine Pixelberechnung weiter oben.