Dies ist ein Artikel von ZOZO Technologies # 1 Adventskalender 2019. Gestern war "Kenntnisse erforderlich, wenn ein Mac in einem Windows-Team verwendet wird" von @e_tyubo. Ich habe auch viele Möglichkeiten, mehrere Betriebssysteme richtig zu verwenden, daher war es sehr hilfreich. Ich wurde als "spielerischer Ingenieur, der eine Drohne ins Entwicklungslager bringt" vorgestellt, aber dieses Mal möchte ich einen soliden Inhalt schreiben, der näher an der Arbeit liegt lol
Das Smart Factory-Team, dem ich angehöre, ist für die Geschäftsverbesserung und -automatisierung im Bekleidungsproduktionsprozess verantwortlich. Unter ihnen gibt es viele bildverarbeitungsbezogene Projekte, und die Genres variieren von geschäftsorientierten Inhalten bis zu forschungsorientierten Inhalten.
Bei der Entwicklung auf der Grundlage derart unterschiedlicher Anforderungen wird der Entwicklung Vorrang eingeräumt, indem beurteilt wird, "ob Effizienz und Automatisierung überhaupt erforderlich sind", "ob sie sofort realisiert werden können" und "ob ein Geschäftsvorteil besteht". Sie müssen verschreiben.
Da es jedoch in der Bekleidungsindustrie ursprünglich nur wenige Fälle und Daten für die Automatisierung gibt, ist es nicht ungewöhnlich, herauszufinden, ob Sie es nicht versuchen. Daher muss es nicht 100% sein, daher ist es praktisch, einige Indexergebnisse zu haben.
Dieses Mal werde ich die Verarbeitung vorstellen, mit der die Ergebnisse beim Prototyping in den oben genannten Situationen angezeigt werden. Wenn Sie dem Unternehmen zu nahe stehen, kann es schwierig sein, den Inhalt zu veröffentlichen. In diesem Artikel wird daher nur auf die grundlegende Verarbeitung eingegangen.
Wenn ich die Bildverarbeitung experimentell versuche, erstelle ich im Arbeitsbereich einen "Datenordner" und einen "Ergebnisordner" sowie die Eingabe und Ausgabe in diesen Ordnern. Für mich persönlich ist es einfacher, nur die Bilder, die ich verarbeiten möchte, in einen Ordner zu legen und zu verarbeiten. Deshalb nehme ich dieses Formular an.
import os.path
import datetime
import cv2
#Konstante
#Datenordner
DATA_PATH = "data"
#Ergebnisordner
RESULT_PATH = "result"
def main():
#Holen Sie sich das aktuelle Verzeichnis
current_path = os.getcwd()
#Datenverzeichnis abrufen
data_path = os.path.join(current_path, DATA_PATH)
#Datenverzeichnis abrufen
result_path = os.path.join(current_path, RESULT_PATH)
#Holen Sie sich eine Liste der Dateien direkt unter dem Verzeichnis
data_list = os.listdir(data_path)
for file in data_list:
#Dateierweiterung abrufen
file_name, ext = os.path.splitext(file)
#Wenn die Erweiterung PNG oder JPEG ist
if ext == u'.png' or ext == u'.jpg' or ext == u'.jpeg':
#Bild laden
input_path = os.path.join(data_path, file)
image = cv2.imread(cv2.samples.findFile(input_path))
#Schreiben Sie hier etwas Verarbeitung
#Benannt nach Zeit, damit der Dateiname nicht abgedeckt wird
output_path = os.path.join(result_path, create_time_path(file_name, "Erweiterung"))
#Bild speichern
cv2.imwrite(output_path, "Ausgabebild")
return
#Geben Sie einen eindeutigen Dateipfad einschließlich der Zeit aus
def create_time_path(file_name, ext):
#Holen Sie sich die aktuelle Zeit
time = datetime.datetime.now()
#Erstellen Sie einen Pfad
path = file_name + time.strftime("%Y%m%d%H%M%S") + ext
return path
if __name__ == '__main__':
main()
Der Gaußsche Filter verwendet die Gaußsche Verteilung, um Gewichte hinzuzufügen, je nachdem, wie weit sie vom interessierenden Pixel entfernt sind. Je größer der Standardabweichungswert ist, desto größer ist der Effekt der Glättung.
Vor der Hauptverarbeitung eines verrauschten Bildes wird es als Vorbereitung angewendet. Passen Sie die Kernelgröße an die Art des zu verarbeitenden Bildes an.
#Gaußsche Filterkerngröße(Seltsam)
GAUSSIAN_KERNEL = (5, 5)
#Gaußscher Filter
def exc_gaussian_blur(image):
#Wenden Sie den Gaußschen Filter an
gaussian_image = cv2.GaussianBlur(image, GAUSSIAN_KERNEL, 0)
return gaussian_image
Um den Inhalt kurz zu erläutern, wird die Verarbeitung im Ablauf von "(1) Rauschreduzierung und -differenzierung", "(2) Erfassung der maximalen Position des Gradienten" und "(3) Schwellenwertverarbeitung" durchgeführt. Das Ausgabeergebnis ändert sich je nach Einstellwert. Passen Sie es daher an die Art des Bildes an, das Sie verarbeiten möchten.
#Mindestschwelle für die Erkennung kniffliger Kanten
CANNY_MIN = 100
#Maximaler Schwellenwert für die Erkennung kniffliger Kanten
CANNY_MAX = 150
#Funktion zur Erzeugung von Kantenbildern
def exc_canny_blur(image):
#Canny-Filter anwenden
edgeImg = cv2.Canny(image, CANNY_MIN, CANNY_MAX)
return edgeImg
Ein Prozess, der dem Zielpixel ein Pixel hinzufügt, das den Hintergrund oder das Loch des Bildes berührt. Es wird häufig zusammen mit der Schrumpfungsverarbeitung verwendet, hauptsächlich zur Geräuschreduzierung.
#Kernelgröße des Erweiterungs- / Reduktionsfilters
MAX_MIN_KERNEL = (10, 10)
#Ausführungszahl des Erweiterungs- / Reduktionsfilters
MAX_MIN_ITERATION = 10
#Erweiterungsverarbeitungsfunktion
def exc_dilate(image):
#Expansionsfilteranwendung
dstImg = cv2.dilate(image, MAX_MIN_KERNEL, MAX_MIN_ITERATION)
return dstImg
Ein Prozess, bei dem ein Pixel um das Zielpixel entfernt wird, das den Hintergrund oder das Loch des Bildes berührt. Es wird häufig zusammen mit der Schrumpfungsverarbeitung verwendet, hauptsächlich zur Geräuschreduzierung.
#Kernelgröße des Erweiterungs- / Reduktionsfilters
MAX_MIN_KERNEL = (10, 10)
#Ausführungszahl des Erweiterungs- / Reduktionsfilters
MAX_MIN_ITERATION = 10
#Schrumpfungsbearbeitungsfunktion
def exc_erode(image):
#Schrumpffilteranwendung
dstImg = cv2.erode(image, MAX_MIN_KERNEL, MAX_MIN_ITERATION)
return dstImg
Es bezieht sich auf eine Transformation, die eine beliebige lineare Transformation und eine parallele Bewegung kombiniert. Ich benutze es oft, um Bilder zu drehen.
#Affin-Konvertierung
def exc_affine(dx, dy, image):
#Affin-Konvertierung(Parallelbewegung)
affine_mat = np.float32([[1, 0, dx], [0, 1, dy]])
height, width = image.shape[:2]
image_affine = cv2.warpAffine(image, affine_mat, (width, height))
return image_affine
#Bilddrehung
def exc_rotation(angle, scale, image):
#Holen Sie sich die mittlere Position
center = tuple(np.array([image.shape[1] * 0.5, image.shape[0] * 0.5]))
#Berechnung der Rotationsumwandlungsmatrix
affine_mat = cv2.getRotationMatrix2D(center, angle, scale)
#Affin-Konvertierung(Drehung)
height, width = image.shape[:2]
rotation_image = cv2.warpAffine(image, affine_mat, (width, height), cv2.INTER_CUBIC)
return rotation_image
Wenn Sie 100 vertikal und horizontal bewegen.
Setzen Sie den Skalierungsstatus auf 10.
Die oben eingeführte Verarbeitung wird je nach Zielbild in verschiedenen Kombinationen verwendet. Sie können auf verschiedene Szenen reagieren, indem Sie die Kombination ändern. Passen Sie sie daher bitte selbst an.
ZOZO Technologies # 1 Adventskalender 2019 Morgen ist "Berechnen mit Rost" von @ niba1122.
Recommended Posts