Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"

Einführung

Bei der Bildverarbeitung sind Farbbilder oft zu viele Informationen, um die benötigten Informationen zu erhalten. Daher denke ich, dass der allgemeine Ablauf darin besteht, die erforderlichen Informationen wie Zeichen und Kanten in Graustufen oder Binärdateien zu speichern, um das Abrufen zu erleichtern. Dieses Mal werden wir Python verwenden, um das Bild mit OpenCV zu binarisieren.

Was ist Binarisierung?

Bei der Binarisierung wird ein Bild in zwei Abstufungen umgewandelt, Weiß und Schwarz. Bei der Binarisierung wird ein Schwellenwert (Schwellenwert) im Voraus bestimmt, und wenn der Pixelwert größer als der Schwellenwert ist, wird er in Weiß konvertiert, und wenn er kleiner ist, wird er in Schwarz konvertiert. Referenz: Was ist Binarisierung? Weblio Dictionary

Vorbereitung

Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.

import platform
print("python " + platform.python_version())
# python 3.6.9

Lassen Sie uns das Bild anzeigen

Jetzt schreiben wir den Code. Importieren Sie zunächst OpenCV.

import cv2

Importieren Sie außerdem Folgendes, um das Bild in Colaboratory anzuzeigen.

from google.colab.patches import cv2_imshow

Bereiten Sie auch ein Beispielbild vor. Dieses Mal werde ich das kostenlose Bild von Pixabay verwenden.

Lassen Sie uns nun das vorbereitete Beispielbild anzeigen.

img = cv2.imread(path) #Pfad gibt an, wo das Bild platziert wird
cv2_imshow(img)

image.png

Graustufen

Graustufen (Graustufen oder Graustufen) sind eine Art Farbdarstellung. Die Graustufe repräsentiert das Bild, einschließlich des Grautons zwischen dem stärksten Weiß und dem schwächsten Schwarz. Referenz: [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%B1%E3 % 83% BC% E3% 83% AB)

Graustufenbilder können unten angezeigt werden.

img_gray = cv2.imread(path, 0)
cv2_imshow(img_gray)

image.png

Allgemeine Binärisierung

Bei der Binarisierung wird ein Bild in zwei Werte (binär) umgewandelt, Weiß und Schwarz. Es unterscheidet sich von der Graustufe, die schrittweise zwischen Weiß und Schwarz angezeigt wird. Ein Wert, der als Schwelle (Schwelle) bezeichnet wird, wird bestimmt, und wenn der Pixelwert größer als dieser ist, wird er in Weiß umgewandelt, und wenn er kleiner ist, wird er in Schwarz umgewandelt.

Lassen Sie uns nun das binärisierte Bild anzeigen. Zum Binärisieren müssen Sie ein ** Graustufenbild verwenden. ** ** ** Als Test setzen wir den Schwellenwert auf 100.

threshold = 100
ret, img_th = cv2.threshold(img_gray, threshold, 255, cv2.THRESH_BINARY)
print(ret)
# 100.0
cv2_imshow(img_th)

image.png

Es gibt zwei Rückgabewerte für cv2.threshold. Der erste ist der Schwellenwert und der zweite ist das binärisierte Bild. Da diesmal 100 als Schwellenwert angegeben wird, wird 100 natürlich als erster Rückgabewert zurückgegeben.

Lassen Sie uns nun das Bild mit einigen Schwellenwerten anzeigen.

_, img1 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY)
_, img2 = cv2.threshold(img_gray, 50, 255, cv2.THRESH_BINARY)
_, img3 = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)
_, img4 = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
_, img5 = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)
_, img6 = cv2.threshold(img_gray, 250, 255, cv2.THRESH_BINARY)
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)

image.png

Die Bilder werden mit Schwellenwerten von 0, 50, 100 (oben), 150, 200, 250 (unten) in der Reihenfolge von links oben binärisiert.

Binarisierung von Otsu

Bei der obigen Binarisierung wurden verschiedene Schwellenwerte festgelegt und das Bild ausgegeben. Es scheint, dass wir Versuch und Irrtum wiederholen müssen, um herauszufinden, welcher Wert als Schwellenwert angemessen ist. Die Binärisierung von Otsu ist die Lösung für solche Probleme. Die Binärisierung von Otsu (oder "Otsu-Methode") ist eine Methode zum Festlegen eines Schwellenwerts basierend auf dem Bildhistogramm (Helligkeitsverteilung). Grob gesagt ist es "** es wird einen schönen Schwellenwert ohne Erlaubnis setzen **".

Das Bild der Binärisierung von Otsu kann unten angezeigt werden.

ret, img_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU)
print(ret)
cv2_imshow(img_otsu)
# 126.0

image.png

Der erste Rückgabewert von cv2.threshold ist der Schwellenwert. Diesmal beträgt der durch Otsus Binarisierung festgelegte Schwellenwert 126.

adaptive threshold Sowohl die allgemeine Binarisierung als auch die Otsu-Binarisierung wurden mit einem bestimmten Schwellenwert für das gesamte Bild durchgeführt. Andererseits besteht der adaptive Schwellenwert (auf Japanisch als "adaptive Schwellenwertverarbeitung" bezeichnet) darin, den Schwellenwert abhängig vom Ort zu ändern und eine Binärisierung durchzuführen. Je nach Standort kann es besonders dunkel oder hell sein, und es ist möglicherweise nicht angebracht, mit einem bestimmten Schwellenwert für das gesamte Bild zu binarisieren. Eine wirksame Methode in solchen Fällen ist die adaptive Schwelle.

Bilder mit adaptivem Schwellenwert können unten angezeigt werden.

img_adap = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 1)
cv2_imshow(img_adap)

image.png

Hier geben das 3. und 4. Argument von cv2.adaptiveThreshold die Berechnungsmethode des Schwellenwerts an. In diesem Fall werden cv2.ADAPTIVE_THRESH_MEAN_C und cv2.THRESH_BINARY verwendet. Einzelheiten entnehmen Sie bitte dem offiziellen Dokument.

Das 5. Argument 3 gibt die Blockgröße an, dh wie groß der zu zielende Bereich sein soll. Dies muss eine ungerade Zahl größer als ** 1 angeben. Das sechste Argument 1 heißt Subtraktionskonstante, eine Konstante, die von der berechneten Schwelle subtrahiert wird.

Versuchen wir, Bilder in verschiedenen Blockgrößen anzuzeigen.

img1 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 1)
img2 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 1)
img3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 1)
img4 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 1)
img5 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 1)
img6 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 13, 1)
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)

image.png

Von links oben sind die Blockgrößen 3, 5, 7 (oben), 9, 11, 13 (unten).

Zusammenfassung

Dieses Mal habe ich Python verwendet, um das Bild mit OpenCV zu binarisieren.

Wenn Sie Zeichen, Kanten usw. aus dem Bild extrahieren möchten, versuchen Sie die Binärisierungsmethode.

Weitere Informationen zur Binarisierung finden Sie im Folgenden.

Recommended Posts

Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Bildbearbeitung mit Python OpenCV
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Ich mochte den Tweet mit Python. ..
Finden Sie Bildähnlichkeit mit Python + OpenCV
Versuchen Sie, das Bild mit opencv2 zu verwischen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildaufnahme von der Kamera mit Python + OpenCV
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Leichte Bildverarbeitung mit Python x OpenCV
Ich habe das Python Tornado Testing Framework ausprobiert
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe das Objekt gerade mit Image Repair (Inpaint) (OpenCV: Python) gelöscht.
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
vprof - Ich habe versucht, den Profiler für Python zu verwenden
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen