Traitement d'image à partir de zéro avec python (4) Extraction de contour

Une série d'étude du traitement d'image de base à partir de zéro (4).

Reportez-vous au tutoriel OpenCV-Python Livre de reconnaissance d'image https://www.amazon.co.jp/dp/4061529129/ Il s'agit d'une politique visant à promouvoir la compréhension du traitement qui est effectué dans.

table des matières

  1. Environnement
  2. Extraction de contour
  3. Approximation des contours
  4. Figure extérieure

environnement

Python 3.7.0 OpenCV 4.1.0 Jupyter Notebook

Extraction de contour

Effectuez une extraction de contour sur l'image de panda binarisée. La valeur de retour contours de findContours est le jeu de coordonnées pour chaque contour, et la hiérarchie est la structure hiérarchique du contour. Cette fois, le contour est composé de deux couches. Le contour a été dessiné sur l'image originale du panda.

rinkaku.py


import cv2
import numpy as np
from matplotlib import pyplot as plt
from pylab import rcParams #Changer la taille de l'affichage de l'image
%matplotlib inline
rcParams['figure.figsize'] = 25, 20  #Taille d'affichage de l'image

img = cv2.imread('/brabra/6.jpg',0)
#Gardez l'image compressée
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
#Binarisation(Le seuil est de la binarisation d'Otsu)
ret,thresh = cv2.threshold(img,59,255,0)
#Inverser
thresh= cv2.bitwise_not(thresh)

#Extraction de contour(RETR_CCOMP a deux couches)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #Convertir au format RVB

#Dessinez le contour trouvé sur l'image d'origine
for i in range(len(contours)):
    
    #Dessinez le calque supérieur (vert)
    if hierarchy[0][i][3] == -1:        
        cv2.drawContours(img, contours, i, (0, 255, 0), 2)
    #Dessinez le deuxième calque (bleu clair)
    else:
        cv2.drawContours(img, contours, i, (0, 255, 255), 2)        

plt.imshow(img)

rinkakua.png

Bien qu'il ne soit pas parfait, le contour est principalement extrait.

Approximation du contour

Le contour est dessiné avec de nombreux sommets lorsque l'attention est portée aux détails, mais lorsque les sommets jusqu'à ce point ne sont pas nécessaires, le contour peut être approché. Ici, j'ai essayé d'approcher le contour de la partie du pied.

rinkakukinzi.py


img = cv2.imread('/brabra/6.jpg',0)
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
ret,thresh = cv2.threshold(img,59,255,0)
thresh= cv2.bitwise_not(thresh)

#Extraction de contour
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #Convertir au format RVB

#Contour de la partie pied
cnt = contours[7]

#L'approximation du contour epsilon est le degré d'approximation
epsilon = 0.01*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

#Dessinez un contour approximatif sur l'image d'origine
cv2.drawContours(img, [approx], -1, (0, 255, 0), 2)

plt.imshow(img)

rink.png

C'était joli et anguleux.

Figure extérieure

Il est possible de dessiner une figure circonscrivant le contour. J'ai dessiné des lignes circonscrites, des cercles, des ellipses et des lignes similaires.

gaisetsu.py


img = cv2.imread('C:/brabra/6.jpg',0)
img = cv2.resize(img, dsize=None, fx=0.15, fy=0.15)
ret,thresh = cv2.threshold(img,59,255,0)
thresh= cv2.bitwise_not(thresh)

#Extraction de contour
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #Convertir au format RVB

#Dessinez le contour du pied
cv2.drawContours(img, contours, 7, (0, 255, 0), 2)

cnt = contours[7]

#Rectangle externe
x,y,w,h = cv2.boundingRect(cnt)
img0 = img.copy()
img0 = cv2.rectangle(img0,(x,y),(x+w,y+h),(0,255,0),2)

#Rectangle externe considérant la rotation
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
img00 = img.copy()
img00 = cv2.drawContours(img00,[box],0,(0,0,255),2)

#Cercle circonscrit minimum
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img1 = img.copy()
img1 = cv2.circle(img1,center,radius,(0,255,255),2)

#Raccord elliptique
ellipse = cv2.fitEllipse(cnt)
img2 = img.copy()
img2 = cv2.ellipse(img2,ellipse,(255,255,0),2)

#Raccord droit
rows,cols = img.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
img3 = img.copy()
img3 = cv2.line(img3,(cols-1,righty),(0,lefty),(255,255,255),2)

plt.subplot(231),plt.imshow(img0)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(img00)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(img1)
plt.title('en'), plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(img2)
plt.title('daen'), plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(img3)
plt.title('line'), plt.xticks([]), plt.yticks([])

plt.show()

gaisetsu.png

Résumé

J'ai approfondi ma compréhension de l'extraction de contours.

Les références

--Traitement d'image avec OpenCV (tutoriel OpenCV-Python) http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html#py-table-of-content-imgproc

Recommended Posts

Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Traitement d'image avec Python
Traitement d'image avec Python (partie 2)
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
[Python] Traitement d'image avec scicit-image
100 traitement d'image par Python Knock # 2 Échelle de gris
traitement d'image python
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
100 traitement d'image avec Python Knock # 8 Max Pooling
Efficacité commerciale à partir de zéro avec Python
Traitement d'image avec Python et OpenCV [Tone Curve]
Acquisition d'images depuis une caméra avec Python + OpenCV
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image léger avec Python x OpenCV
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Premier traitement d'image Python
Traitement d'image avec la configuration de l'environnement Python pour Windows
Traitement d'image avec PIL
Méthode d'extraction de zone à l'aide de l'automate cellulaire Essayez l'extraction de zone de l'image avec growcut (Python)
Comment récupérer des données d'image de Flickr avec Python
Remarques sur le traitement d'images HDR et RAW avec Python
Lire le code QR à partir du fichier image avec Python (Mac)
100 coups de traitement du langage avec Python 2015
Traitement d'image avec PIL (Pillow)
Traitement du signal acoustique avec Python (2)
Traitement du signal acoustique avec Python
Tri des fichiers image avec Python (2)
Tri des fichiers image avec Python (3)
Tweet avec image en Python
Tri des fichiers image avec Python
Traitement d'image par python (Pillow)
Collection de traitement d'image en Python
Avec skype, notifiez avec skype de python!
[Jouons avec Python] Traitement d'image en monochrome et points
Découpez une image avec python
Principes de base du traitement d'image en temps réel avec opencv
Appeler C depuis Python avec DragonFFI
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Traitement parallèle facile avec Joblib
Utilisation de Rstan de Python avec PypeR
100 traitements de langage avec Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Installez Python à partir des sources avec Ansible
Extraction de texte avec AWS Textract (Python3.6)
100 traitements de langage avec Python (chapitre 3)
Notes personnelles pour le traitement d'images python
Exécutez Aprili depuis Python sur Orange
Faisons du scraping d'images avec Python
Appelez python de nim avec Nimpy
Trouver la similitude d'image avec Python + OpenCV
Traitement d'image | prédire les espèces à partir d'images
Charger fbx depuis python avec cinema4d
Envoyer l'image avec python et enregistrer avec php
Génération d'images dégradées avec Python [1] | np.linspace
Essayez d'extraire une chaîne de caractères d'une image avec Python3