Détecter les objets d'une couleur et d'une taille spécifiques avec Python

Introduction Je voulais quelque chose comme ça ↓ ↓ ↓ 01.png

Le chiffre est trop bon marché.

Lorsqu'il est verbalisé, ** Détecter les objets d'une couleur et d'une taille spécifiques à partir d'images affichant des objets de différentes couleurs et tailles ** Je voulais le faire.

Je pense qu'il y a déjà beaucoup d'excellents articles de commentaires, mais si je ne les écris pas, je les oublierai bientôt, alors je les écrirai sous forme de mémorandum.

Premier de la conclusion

L'image est traitée dans les 4 étapes suivantes

  1. Binarisation basée sur les informations de couleur 02.png

  2. Détecter le contour 03.png

  3. Classement des cas par taille 04.png

  4. Superposez le contour sur l'image d'origine 05.png

code

** 1. Binarisation basée sur les informations de couleur ** ** 2. Détecter le contour **

import cv2
import numpy as np

#image"hoge.jpg "Lis
#La même image est lue deux fois avec des variables différentes. Un (img_c) pour le "traitement d'image",
#L'autre (img_c_Depuis l'origine) est "à afficher au-dessus du contour".

filename = "hoge.jpg "

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

#Prétraitement (flou)
#Les chiffres sont appropriés
for i in range(2):
	img_c = cv2.GaussianBlur(img_c,(5,5),0)

#Canaux d'image séparés. cv2.Notez que les images lues par imread sont dans l'ordre "BGR" au lieu de "RGB"!
B, G, R = cv2.split(img_c)

#Il est binarisé dans chaque canal RVB.
#Il sera 1 si le pixel est de la couleur souhaitée et 0 sinon.

# -------- 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)

#Multiplication de chaque élément, pas multiplication matricielle. Je l'aime parce que je peux le faire.
#ET logique(AND)C'est une image à prendre. Afin de rendre blanc l'objet détecté, il est multiplié par 255 à la fin.
img_th = img_r_th * img_g_th * img_b_th * 255

#Convertissez en uint8 pour l'utiliser comme argument pour le prochain findCOntours.
img_th = np.uint8(img_th)

#Détecte les contours.
contours = cv2.findContours(img_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

Pour la raison pour laquelle le flou d'image (prétraitement) est nécessaire, le "prétraitement" de l'article suivant a été utile. Introduction à OpenCV pour l'apprentissage automatique

Cette fois, j'utilise RVB pour diverses raisons, mais il existe également un moyen de le détecter avec HSV. C'est intuitif, n'est-ce pas? Détection de contour d'objet

Cliquez ici pour plus de détails sur la détection des contours Plan: première étape

Bien que j'aie écrit diverses choses, la zone autour de la détection de contour est presque en train de se copier. Parce que c'est stupide ...

** 3. Caisse par taille ** ** 4. Affiché en superposition sur l'image d'origine **


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

#Définissez une liste pour stocker les contours souhaités
Active_contours = []

#Lorsque vous saisissez un contour dans contourArea, la zone de la zone entourée par le contour est renvoyée.
#En utilisant cela, seuls les objets actifs d'une taille spécifique (contour)_Stocker dans les contours.
for cont in contours:
	if cv2.contourArea(cont) > Area_th_min and cv2.contourArea(cont) < Area_th_max:
		Active_contours.append(cont)

#Vous pouvez utiliser drowContours pour superposer des contours sur une image.
#Pour plus de détails, reportez-vous à la section «Plan: première étape» ci-dessus.
cont_img = cv2.drawContours(img_c_origin, Active_contours, -1, (255,0,0), 3)

#Convertissez "BGR" en "RVB" pour l'affichage.
cont_img = cv2.cvtColor(cont_img, cv2.COLOR_BGR2RGB)

** Code entier **

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()
# ----------------------------------------

En fait utiliser

Le code ci-dessus spécifie déjà une plage de R, G, B. Ici, si vous spécifiez le logo incroyablement cool de "The Demon Girl Next Door", qui est le titre anglais de "Machikado Mazoku", comme image d'entrée ... 06.PNG

Seul le "G" rose est détecté. Dans l'image de seuil, toutes les zones roses ont été détectées, mais à la suite de la classification par taille, seul G est resté.

Au fait, je pense que cette image de logo, le noir représente Shamiko et le rose représente la pêche, mais qu'en est-il ... Vous pouvez voir Machikado Mazoku sur Amapura, alors voyons tout le monde.

La fin

Recommended Posts

Détecter les objets d'une couleur et d'une taille spécifiques avec Python
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
Procédure d'installation pour Python et Ansible avec une version spécifique
Coexistence de Python2 et 3 avec CircleCI (1.0)
Un mémo contenant Python2.7 et Python3 dans CentOS
Connectez beaucoup de Python ou et et
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Construire un environnement python avec virtualenv et direnv
Résolvez A ~ D du codeur yuki 247 avec python
Lancer un serveur Web avec Python et Flask
Implémentation de l'arbre TRIE avec Python et LOUDS
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
Prise en compte des forces et faiblesses de Python
Poursuite du développement multi-plateforme avec Electron et Python
Exemple de lecture et d'écriture de CSV avec Python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Format A4 avec python-pptx
Mémo connecté à HiveServer2 d'EMR avec python
Recommandation de construction d'un environnement Python portable avec conda
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Essayez de créer un jeu simple avec Python 3 et iPhone
Visualisez la gamme d'insertions internes et externes avec python
Une comparaison rapide des bibliothèques de test Python et node.js
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Créez un lot d'images et gonflez avec ImageDataGenerator
J'ai essayé de faire LINE BOT avec Python et Heroku
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
[Python] Taille d'image de la caméra Web et paramètres FPS avec OpenCV
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Gestion des versions de Node, Ruby et Python avec anyenv
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
PhytoMine-Comment acquérir efficacement les données de séquence de gènes d'une espèce végétale spécifique avec Python
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Programmation avec Python et Tkinter
Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
À la suite du montage et du réglage avec POH! Lite
À propos des objets et des classes Python
À propos des variables et des objets Python
Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
Les zéros NumPy peuvent être définis même avec une taille de 0
Associez Python Enum à une fonction pour la rendre appelable
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Obtenez le nombre d'éléments spécifiques dans la liste python
Jugement d'équivalence d'objet en Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Débarrassez-vous des données sales avec Python et les expressions régulières
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Faites une loterie avec Python
Recueillez des tweets sur "Corona" avec python et détectez automatiquement les mots qui sont devenus un sujet brûlant en raison de l'influence de "Corona"
Hash avec python et échapper à l'égosa d'un certain ministre
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Reconnaissons les objets rouges avec python
python avec pyenv et venv
Obtenez une liste des métriques CloudWatch et une table de correspondance des unités unitaires avec Python boto
Exemple d'analyse HTTP GET et JSON avec Pepper Python