Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe

Introduction Ich wollte so etwas ↓ ↓ ↓ 01.png

Die Figur ist zu billig.

Wenn verbalisiert, ** Erkennen Sie Objekte einer bestimmten Farbe und Größe anhand von Bildern, auf denen Objekte verschiedener Farben und Größen angezeigt werden. ** Ich wollte das machen.

Ich denke, es gibt bereits viele ausgezeichnete Kommentarartikel, aber wenn ich diese nicht schreibe, werde ich sie bald vergessen und sie als Memorandum schreiben.

Zunächst aus der Schlussfolgerung

Das Bild wird in den folgenden 4 Schritten verarbeitet

  1. Binarisierung basierend auf Farbinformationen 02.png

  2. Kontur erkennen 03.png

  3. Fallklassifizierung nach Größe 04.png

  4. Überlagern Sie den Umriss des Originalbilds 05.png

Code

** 1. Binarisierung basierend auf Farbinformationen ** ** 2. Kontur erkennen **

import cv2
import numpy as np

#Bild"hoge.jpg "Lesen
#Das gleiche Bild wird zweimal mit verschiedenen Variablen gelesen. Eins (img_c) für "Bildverarbeitung",
#Der andere (img_c_Da Ursprung) ist "zur Anzeige über dem Umriss".

filename = "hoge.jpg "

input_img = filename
img_c = cv2.imread(input_img)
img_c_origin = cv2.imread(input_img)

#Vorbehandlung (Unschärfe)
#Zahlen sind angemessen
for i in range(2):
	img_c = cv2.GaussianBlur(img_c,(5,5),0)

#Separate Bildkanäle. cv2.Beachten Sie, dass die von imread gelesenen Bilder in der Reihenfolge "BGR" anstelle von "RGB" sind!
B, G, R = cv2.split(img_c)

#Es ist in jedem RGB-Kanal binärisiert.
#Es ist 1, wenn das Pixel die gewünschte Farbe hat, und andernfalls 0.

# -------- color condition ----------
R_low = 0
R_high = 100
G_low = 100
G_high = 200
B_low = 200
B_high = 250
# -----------------------------------

img_r_th = np.where((R < R_high) & (R > R_low), 1, 0)
img_g_th = np.where((G < G_high) & (G > G_low), 1, 0)
img_b_th = np.where((B < B_high) & (B > B_low), 1, 0)

#Multiplikation jedes Elements, keine Matrixmultiplikation. Ich mag es, weil ich das kann.
#Logisches UND(AND)Es ist ein Bild zu machen. Um das erkannte Objekt weiß zu machen, wird es am Ende mit 255 multipliziert.
img_th = img_r_th * img_g_th * img_b_th * 255

#Cast to uint8 zur Verwendung als Argument für die nächsten findCOntours.
img_th = np.uint8(img_th)

#Erkennt Konturen.
contours = cv2.findContours(img_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

Aus dem Grund, warum Bildunschärfe (Vorverarbeitung) erforderlich ist, war die "Vorverarbeitung" im folgenden Artikel hilfreich. Einführung in OpenCV für maschinelles Lernen

Dieses Mal verwende ich RGB aus verschiedenen Gründen, aber es gibt auch eine Möglichkeit, es mit HSV zu erkennen. Es ist intuitiv, nicht wahr? Objektkonturerkennung

Klicken Sie hier für Details zur Konturerkennung Gliederung: Erster Schritt

Obwohl ich verschiedene Dinge geschrieben habe, wird der Bereich um die Konturerkennung fast kopiert. Weil es dumm ist ...

** 3. Fall nach Größe ** ** 4. Auf dem Originalbild überlagert angezeigt **


# -------- scale condition ----------
Area_th_min = 1
Area_th_max = 1000
# -----------------------------------

#Definieren Sie eine Liste zum Speichern der gewünschten Konturen
Active_contours = []

#Wenn Sie eine Kontur in contourArea eingeben, wird der Bereich des von der Kontur umgebenen Bereichs zurückgegeben.
#Damit nur aktive Objekte einer bestimmten Größe (Gliederung)_In Konturen lagern.
for cont in contours:
	if cv2.contourArea(cont) > Area_th_min and cv2.contourArea(cont) < Area_th_max:
		Active_contours.append(cont)

#Mit drowContours können Sie Konturen auf einem Bild überlagern.
#Einzelheiten finden Sie oben unter "Gliederung: Erster Schritt".
cont_img = cv2.drawContours(img_c_origin, Active_contours, -1, (255,0,0), 3)

#Konvertieren Sie "BGR" zur Anzeige in "RGB".
cont_img = cv2.cvtColor(cont_img, cv2.COLOR_BGR2RGB)

** Ganzer Code **

detect_color.py


import cv2
import numpy as np
import matplotlib.pyplot as plt

#[[User specified parameters]]

# ------- color condition ----------
R_low = 200
R_high = 250
G_low = 60
G_high = 110
B_low = 80
B_high = 120
# -----------------------------------

# ------- scale condition -----------
Area_th_min = 1200
Area_th_max = 10000
# -----------------------------------


# Step 1 ---------------------------
filename = "hoge.jpg "

input_img = filename
img_c = cv2.imread(input_img)
img_c_origin = cv2.imread(input_img)

for i in range(2):
	img_c = cv2.GaussianBlur(img_c,(5,5),0)

B, G, R = cv2.split(img_c)

img_g_th = np.where((G < G_high) & (G > G_low), 1, 0)
img_b_th = np.where((B < B_high) & (B > B_low), 1, 0)
img_r_th = np.where((R < R_high) & (R > R_low), 1, 0)

img_th = img_r_th * img_g_th * img_b_th * 255
img_th = np.uint8(img_th)

# Step 2 ---------------------------
contours = cv2.findContours(img_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

# Step 3 ---------------------------
Active_contours = []

for cont in contours:
	if cv2.contourArea(cont) > Area_th_min and cv2.contourArea(cont) < Area_th_max:
		Active_contours.append(cont)

# Step 4 ---------------------------
cont_img = cv2.drawContours(img_c_origin, Active_contours, -1, (255,0,0), 3)

cont_img = cv2.cvtColor(cont_img, cv2.COLOR_BGR2RGB)
img_c_origin = cv2.cvtColor(img_c_origin, cv2.COLOR_BGR2RGB)

# ------------- show images ------------- 
plt.gray()

plt.subplot(1,2,1)
plt.imshow(img_th, vmin=0, vmax=255, interpolation = 'none')
plt.title('Threshold')

plt.subplot(1,2,2)
plt.imshow(cont_img, interpolation = 'none')
plt.title('Contour')

plt.show()
# ----------------------------------------

Eigentlich verwenden

Der obige Code gibt bereits einen Bereich von R, G, B an. Wenn Sie hier das wahnsinnig coole Logo von "The Demon Girl Next Door", dem englischen Titel von "Machikado Mazoku", als Eingabebild angeben ... 06.PNG

Es wird nur das rosa "G" erkannt. Im Schwellenwertbild wurden alle rosa Bereiche erkannt, aber aufgrund der Klassifizierung nach Größe blieb nur G übrig.

Übrigens denke ich, dass dieses Logo schwarz für Shamiko und pink für Pfirsich steht, aber was ist mit ... Sie können Machikado Mazoku auf Amapura sehen, also lasst uns alle sehen.

Das Ende

Recommended Posts

Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
Installationsverfahren für Python und Ansible mit einer bestimmten Version
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Ein Memo mit Python2.7 und Python3 in CentOS
Verbinde viel Python oder und und
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Erstellen einer Python-Umgebung mit virtualenv und direnv
Löse A ~ D des Yuki-Codierers 247 mit Python
Starten Sie einen Webserver mit Python und Flask
TRIE-Baumimplementierung mit Python und LOUDS
[Python] Ein grobes Verständnis von Iterablen, Iteratoren und Generatoren
Berücksichtigung der Stärken und Schwächen von Python
Fortsetzung der Multi-Plattform-Entwicklung mit Electron und Python
Beispiel für das Lesen und Schreiben von CSV mit Python
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
A4 Größe mit Python-Pptx
Memo mit Python mit HiveServer2 von EMR verbunden
Empfehlung zum Erstellen einer tragbaren Python-Umgebung mit conda
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Ein schneller Vergleich der Testbibliotheken von Python und node.js.
Füllen Sie den Hintergrund mit einer einzigen Farbe mit OpenCV2 + Python
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
[Python] Webkamera-Rahmengröße und FPS-Einstellungen mit OpenCV
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
Versionsverwaltung von Node, Ruby und Python mit anyenv
Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus
PhytoMine-How zur effizienten Erfassung von Gensequenzdaten einer bestimmten Pflanzenart mit Python
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Programmieren mit Python und Tkinter
Python-Implementierung des CSS3-Mischmodus und Diskussion über den Farbraum
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Als Ergebnis der Montage und Abstimmung mit POH! Lite
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
Führen Sie mit Python und Matplotlib eine Isostromanalyse offener Wasserkanäle durch
NumPy-Nullen können auch bei einer Größe von 0 definiert werden
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Objektäquivalenzbeurteilung in Python
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 A.
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Machen Sie eine Lotterie mit Python
Sammeln Sie Tweets über "Corona" mit Python und erkennen Sie automatisch Wörter, die aufgrund des Einflusses von "Corona" zu einem heißen Thema geworden sind.
Hasch mit Python und entkomme dem Ego eines bestimmten Ministers
Python: Erstellen Sie ein Wörterbuch aus einer Liste von Schlüsseln und Werten
Lassen Sie uns rote Objekte mit Python erkennen
Python mit Pyenv und Venv
Holen Sie sich eine Liste der CloudWatch-Metriken und eine Entsprechungstabelle der Einheiteneinheiten mit Python boto
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython