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.
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
Die Umgebung verwendet Google Colaboratory. Die Python-Version ist unten.
import platform
print("python " + platform.python_version())
# python 3.6.9
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)
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)
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)
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)
Die Bilder werden mit Schwellenwerten von 0, 50, 100 (oben), 150, 200, 250 (unten) in der Reihenfolge von links oben binärisiert.
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
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)
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)
Von links oben sind die Blockgrößen 3, 5, 7 (oben), 9, 11, 13 (unten).
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