Probleme und Gegenmaßnahmen zum Überlaufen der Binärisierung von Otsu in Python

Einführung

Die Binärisierung von Otsu ist ein Algorithmus, der automatisch den Schwellenwert für die Binärisierung eines Bildes ermittelt. Es wurde bereits in Bibliotheken wie OpenCV implementiert, aber ich habe eine Implementierung in Python gefunden und sie berührt. Es gibt ein Problem mit dem Titel, aber ich denke, es wurde wahrscheinlich durch meine schlechte Ausführungsumgebung verursacht.

Code

Der Code selbst wurde nicht von mir geschrieben, sondern aus einem Blog [1], das von anderen erstellt wurde. ist.

ots.py


#Binarisierung von Otsu (graues Argument ist ein Graustufenbild)
def threshold_otsu(gray, min_value=0, max_value=255):

    #Berechnung des Histogramms
    hist = [np.sum(gray == i) for i in range(256)]

    s_max = (0,-10)

    for th in range(256):
        
        #Berechnen Sie die Anzahl der Pixel in Klasse 1 und Klasse 2
        n1 = sum(hist[:th])
        n2 = sum(hist[th:])
        
        #Berechnen Sie den Durchschnitt der Pixelwerte der Klassen 1 und 2
        if n1 == 0 : mu1 = 0
        else : mu1 = sum([i * hist[i] for i in range(0,th)]) / n1   
        if n2 == 0 : mu2 = 0
        else : mu2 = sum([i * hist[i] for i in range(th, 256)]) / n2

        #Berechnen Sie das Molekül der Dispersion zwischen den Klassen
        s = n1 * n2 * (mu1 - mu2) ** 2

        #Notieren Sie das Dispersionsmolekül zwischen den Klassen und den Schwellenwert, wenn das Dispersionsmolekül zwischen den Klassen maximal ist
        if s > s_max[1]:
            s_max = (th, s)
    
    #Ermitteln Sie den Schwellenwert, wenn die Verteilung zwischen den Klassen maximal ist
    t = s_max[0]

    #Binarisierungsverarbeitung mit dem berechneten Schwellenwert
    gray[gray < t] = min_value
    gray[gray >= t] = max_value

    return gray

Problem

Ich habe eine Überlaufwarnung erhalten, als ich die Fotos unten polarisiert habe.

img5.jpg

RuntimeWarning: overflow encountered in long_scalars
  s = n1 * n2 * ((mu1 - mu2) ** 2)

Zu diesem Zeitpunkt wird der Schwellenwert 137, was weit von dem Wert 78 entfernt ist, der erhalten wird, wenn Otsu mit OpenCV binärisiert wird.

Ursache

Das Ausführen von Typ (n1) und Typ (n2) für n1 und n2 führte zu \ <class'numpy.int32 '>. Daher wird angenommen, dass die Ursache darin besteht, dass das Berechnungsergebnis den Bereich des Typs int32 (-2147483648 bis 2147483647) [2] überschreitet Verständnis-Datentypen.html).

Gegenmaßnahmen

Ich dachte über zwei Maßnahmen nach. Die erste besteht darin, die Typen von n1 und n2 schweben zu lassen. Durch Hinzufügen einer Zeile wie unten gezeigt ändert sich der Typ von hist, und infolgedessen ändern sich auch die Typen von n1 und n2.

python


#Berechnung des Histogramms
hist = [np.sum(gray == i) for i in range(256)]
hist = np.array(hist, dtype=np.float64)

Die zweite ist die Verwendung von Protokoll. Da die relative Größe von s wichtiger ist als der Wert selbst, wird das Protokoll auf beiden Seiten von s erstellt und die rechte Seite wird zerlegt (das Ergebnis der Protokollierung ist vom Typ float). Sofern der Inhalt nicht 1 und minus ist, ändert sich die Reihenfolge auch dann nicht, wenn Sie das Protokoll erstellen.

python


import math
...

#Berechnen Sie das Molekül der Dispersion zwischen den Klassen
#s = float(n1 * n2 * ((mu1 - mu2) ** 2))
        
if n1 == 0 or n2 == 0:
    continue
if mu2 >= mu1:
    s = math.log(n1)+math.log(n2)+2*math.log(mu2-mu1)
elif mu1 < mu2:
    s = math.log(n1)+math.log(n2)+2*math.log(mu1-mu2)
...

Ich konnte es sicher lösen. Das Bild unten ist das Ergebnis der Ausführung des Programms. otsu.jpg

Außerdem betrug der Schwellenwert 79 (OpenCV liegt unter dem Schwellenwert, und dieses Programm wird unterhalb des Schwellenwerts binärisiert), was bestätigt, dass die Programmierung normal funktioniert. Im ersten und zweiten ist das erstere überwältigend einfacher, aber da es interessant schien, habe ich auch das letztere gepostet.

abschließend

Es wird angenommen, dass die Ursache des Problems darin besteht, dass die Form nicht in Form ist. Es war eine gute Studie, da ich bei der Bildverarbeitung mit Python häufig unter Tippen leide.

Danke, dass du bis zum Ende zugesehen hast. Wenn Sie Kommentare oder Vorschläge haben, zögern Sie bitte nicht, uns zu kontaktieren.

Referenz-URL

[1]https://algorithm.joho.info/programming/python/opencv-otsu-thresholding-py/ [2]https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html

Recommended Posts

Probleme und Gegenmaßnahmen zum Überlaufen der Binärisierung von Otsu in Python
Probleme und Lösungen bei der Frage nach MySQL db in Python 3
Probleme in Python kombinieren
Janken Poi in Python für Anfänger (Antworten und Erklärungen)
Probleme und Gegenmaßnahmen bei der Entwicklung von Smartphone-App-Spielen Teil 1
Einstellungen für das Spielen von Wave in Python PyAudio und PortAudio
Suchen Sie rekursiv nach Dateien und Verzeichnissen in Python und geben Sie sie aus
Probleme und Gegenmaßnahmen bei der Entwicklung von Smartphone-App-Spielen Teil 2
Techniken zum Sortieren in Python
Stapel und Warteschlange in Python
Unittest und CI in Python
Lösen Sie Optimierungsprobleme mit Python
Über "für _ in range ():" von Python
Listet Methodenargumentinformationen für Klassen und Module in Python auf
Tipps zum Codieren kurz und einfach in Python zu lesen
Nützliche Tricks in Bezug auf Listen und Anweisungen in Python
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Überprüfen Sie Python auf Speicherlecks
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Unterschied zwischen list () und [] in Python
Suchen Sie mit Python nach externen Befehlen
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Zuweisungen und Änderungen in Python-Objekten
Überprüfen und verschieben Sie das Verzeichnis in Python
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
Führen Sie unittest in Python aus (für Anfänger)
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Erstellen und lesen Sie Messagepacks in Python
python> array> Bestimmen Sie die Nummer und initialisieren Sie> mylist = [idx für idx im Bereich (10)] / mylist = [0 für idx im Bereich (10)] >> mylist = [0] * 10
Erstellen Sie einen leichtgewichtigen Server in Python und hören Sie sich die HTTP-Erweiterungen von Scratch 2 an
Überlappende reguläre Ausdrücke in Python und Java
Unterschied in der Authentizität zwischen Python und JavaScript
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Unterschiede zwischen Ruby und Python im Umfang
AM-Modulation und Demodulation mit Python Part 2
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Echte Werte und Eigenvektoren: Lineare Algebra in Python <7>
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
Inject wird für DDD in Python empfohlen
Gefaltetes Liniendiagramm und Skalierungslinie in Python
Implementieren Sie den FIR-Filter in Python und C.
Unterschiede zwischen Python- und Java-Syntax
Überprüfen und empfangen Sie die serielle Schnittstelle in Python (Portprüfung)
Tipps zum Umgang mit Binärdateien in Python
Suchen und spielen Sie YouTube-Videos mit Python
Zusammenfassung verschiedener for-Anweisungen in Python
Geben Sie Anmerkungen für Python2 in Stub-Dateien ein!
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste