Schreiben Sie den Code, um alle TIFF-Dateien im angegebenen Ordner zu binarisieren.
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ü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.
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.
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) )
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