Bildverarbeitung mit Python (Teil 2)

Schreiben Sie den Code, um alle TIFF-Dateien im angegebenen Ordner zu binarisieren.

Ordner rekursiv durchsuchen

Es ist wirklich einfach, einen Ordner zu graben. Es gab eine Methode namens os.walk (). Es ist nicht erforderlich, eine Funktion wie finddir () zu erstellen und rekursiv aufzurufen.

import os
for root, dirs,files in os.walk("."):
    for f in files:
        print(os.path.join(root, f))

Deshalb konnte ich alle Dateien im aktuellen Ordner anzeigen.

Mit os.walk () können Sie alle Dateien und Unterverzeichnisse in dem Verzeichnis abrufen, das als Liste der Root-, Verzeichnis- und Dateidateien angegeben ist. In diesem Fall handelt es sich bei Dateien um eine Liste von Dateien. Rufen Sie sie daher nacheinander ab, während Sie sie in einer Variablen namens f speichern. Sie können es als Dateipfad von root aus verbinden, indem Sie os.path.join () ausführen.

Führen Sie eine Bildbinarisierung durch

Führt die Binärisierungsverarbeitung für alle Bilddateien im angegebenen Ordner aus.

import cv2
import os
import numpy as np
from matplotlib import pyplot as plt

for root,dirs,files in os.walk("img"):
    for f in files:
        if os.path.splitext(f)[1] == ".tiff":
            img = cv2.imread(os.path.join(root, f), 0)
            blur = cv2.GaussianBlur(img,(5,5),0)
            ret,imgb = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

Derzeit können alle Dateien im Ordner img mit der Erweiterung ".tiff" binärisiert werden. Durch Angabe von 0 als zweites Argument mit cv2.imread () wird die Bilddatei zunächst als graues Bild gelesen und anschließend mit cv2.GaussianBlur () die Gaußsche Unschärfe angewendet. Binärisieren Sie danach mit cv2.THRESH_BINARY + cv2.THRESH_OTSU.

Holen Sie sich das Signal

Der Rückgabewert von cv2.threshold () ist diesmal ein binärisiertes Bild, es handelt sich also um ein zweidimensionales Array, und für jedes Pixel wird entweder 0 oder 255 gespeichert. So sieht beispielsweise ein 3x3-Schwarz-Weiß-Schachbrettmuster aus.

([255,0,255],
 [0,255,0]
 [255,0,255])

Das binärisierte Bild ist ein schwarzes Bild auf einem weißen Hintergrund. Ein schwarzes Pixel ist ein Pixel, dessen Element 0 ist. Wenn Sie also alle diese Pixel scannen und die Anzahl der Pixel zählen, die ein Signal haben, erhalten Sie die vertikale und horizontale Größe des Bildes und aus (x, y) = (0,0), (x, y) Der Vorgang wird wiederholt bis = (max (x), max (y)).

Die Koordinaten der Bilddatei sind irgendwie als (x, y) auf der horizontalen Achse X vertikale Achse Y geschrieben, aber die Pixelinformationen des Bildes, die als zweidimensionales Array von Numpy erfasst wurden, liegen in der Reihenfolge "Zeile" und "Spalte". Da es beschrieben ist, ist es beim Extrahieren des Signals des Pixels an der durch ImageJ usw. bestätigten Position von (x, y) = (300, 200) aus dem Numpy-Array erforderlich, es als Array anzugeben [200, 300]. .. Wenn Sie darüber nachdenken, können Sie es verstehen, aber ich mache oft einen Fehler.

Das Folgende ist eine Anzeige, die die Anzahl der schwarzen Pixel eines schwarzen binärisierten Bildes auf einem weißen Hintergrund zählt.

cnt=0
for x in range(0, imgb.shape[0]):
    for y in range(0, imgb.shape[1]):
        if imgb[x,y] == 0:
            cnt += 1
print(cnt)

In Wirklichkeit handelt es sich um ein numpy-Array. Wenn Sie also nur alle Elemente scannen möchten, ist dies etwas einfacher.

cnt =0
for val in imgb.flat:
    if val == 0:
        cnt += 1
print(cnt)

Ich habe eine Fehlermeldung erhalten, als ich cnt-Inkrement wie andere Sprachen als cnt ++ geschrieben habe.

Binarisieren Sie das Bild unter einem bestimmten Ordner und zählen Sie die Anzahl der Pixel mit einem Signal

Der bisherige Code kann wie folgt zusammengefasst werden. Nur für die Datei ".tiff" im Ordner "img" wird das Bild binärisiert und die Anzahl der Pixel mit einem Signal von 0 gezählt.

import numpy as np
import cv2
from matplotlib import pyplot as plt
import os

for root,dirs,files in os.walk("img"):
    for f in files:
        if os.path.splitext(f)[1] == ".tiff":
            img = cv2.imread(os.path.join(root, f), 0)
            blur = cv2.GaussianBlur(img,(5,5),0)
            ret,imgb = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
            cnt = 0
            for val in imgb.flat:
                if val == 0:
                    cnt += 1
            print( f + ":\t" + str(cnt) )

Erstellen Sie eine Funktion

Da die obige Verarbeitung fest img Ordner oder .tiff Erweiterung fest ist, wird eine Reihe von Verarbeitung als Funktion zusammengefasst, so dass dies frei angegeben werden kann. Das erste Argument ist der Zielordner und das zweite Argument ist die Erweiterung der Zieldatei.

import numpy as np
import cv2
from matplotlib import pyplot as plt
import os

def convert_and_count( dir, ext ):
    for root,dirs,files in os.walk(dir):
        for f in files:
            if os.path.splitext(f)[1] == ext:
                img = cv2.imread(os.path.join(root, f), 0)
                blur = cv2.GaussianBlur(img,(5,5),0)
                ret,imgb = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
                cnt = 0
                for val in imgb.flat:
                    if val == 0:
                        cnt+=1
                msg = f + ":\t" + str(cnt)
                print( msg )

if __name__ == "__main__":
    convert_and_count( "img", ".tiff" )

Wenn Sie dies bisher tun, wird das Nest tiefer und die Aussichten etwas schlechter. Da Python Blöcke durch die Anzahl der Einrückungen ausdrückt, wird das Nest immer tiefer, wenn Sie versuchen, etwas Kompliziertes zu tun. Möglicherweise müssen Sie den Code in entsprechende Blöcke schreiben, damit er nicht zu tief geht. Gelegentlich werden beim Bearbeiten über mehrere Editoren hinweg Tabulatoren und Leerzeichen gemischt, und die Ebene des Nestes, die aussieht, und das Nest, das der Python-Interpreter versteht, sind inkonsistent, was zu einem Fehler führt.

Es macht nicht viel Sinn, aber wie viel Prozent des gesamten "schwarzen Bereichs" im binärisierten Bild? Wenn Sie danach fragen möchten, fügen Sie eine Zeile hinzu, um die Sohle in der definierten Variablen convert_and_count () zu berechnen.

def convert_and_count( dir, ext ):
    for root,dirs,files in os.walk(dir):
        for f in files:
            if os.path.splitext(f)[1] == ext:
                img = cv2.imread(os.path.join(root, f), 0)
                blur = cv2.GaussianBlur(img,(5,5),0)
                ret,imgb = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
                cnt = 0
                for range in imgb.flat:
                    if val == 0:
                        cnt += 1
                ratio = cnt / imgb.size
                msg = f  + ":\t" + str(ratio)
                print( msg )

Was ist, wenn Sie das berechnete Verhältnis mit bis zu 3 Stellen anzeigen möchten? Ein Bild wie printf ("% .3f", Verhältnis) in C-Sprache. Als ich darüber nachdachte, sah es wie folgt aus.

msg = "%s:\t%.3f" % (f, ratio)

Wie oben erwähnt, war es mit Python möglich, die Binärisierung von Bildern einfach durchzuführen.

Recommended Posts

Bildverarbeitung mit Python (Teil 2)
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Bildverarbeitung mit Python
[Python] Bildverarbeitung mit Scicit-Image
Python-Bildverarbeitung
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
Bildverarbeitung mit MyHDL
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Erste Python-Bildverarbeitung
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Leichte Bildverarbeitung mit Python x OpenCV
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter
Bildverarbeitung mit PIL
Bildverarbeitung von Grund auf mit Python (5) Fourier-Transformation
Bildverarbeitung von Grund auf mit Python (4) Konturextraktion
Bildverarbeitung mit Python Environment Setup für Windows
100 Sprachverarbeitungsklopfen mit Python 2015
Python mit freeCodeCamp Teil1 studieren
Angrenzende Bilder mit Python Teil 1
Bildverarbeitung mit PIL (Pillow)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Schaben mit Selen + Python Teil 1
Bildbearbeitung mit Python OpenCV
Akustische Signalverarbeitung mit Python (2)
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Python studieren mit freeCodeCamp part2
Tweet mit Bild in Python
Bilddateien mit Python sortieren
Nampre mit Python lösen (Teil 2)
Bildverarbeitung mit Python (Pillow)
Bildverarbeitungssammlung in Python
Schaben mit Selen + Python Teil 2
Hinweise zur HDR- und RAW-Bildverarbeitung mit Python
Schneiden Sie ein Bild mit Python aus
Grundlagen der Echtzeit-Bildverarbeitung mit opencv
Spielen Sie handschriftliche Zahlen mit Python Part 1
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Einfache Parallelverarbeitung mit Joblib
[Mit Python automatisiert! ] Teil 1: Datei einstellen
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
Persönliche Notizen für die Python-Bildverarbeitung
Lassen Sie uns mit Python Image Scraping durchführen
Finden Sie Bildähnlichkeit mit Python + OpenCV
Automatisieren Sie einfache Aufgaben mit Python Part0
[Mit Python automatisiert! ] Teil 2: Dateivorgang
Sende Bild mit Python und speichere mit PHP