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.
Python 3.7.0 OpenCV 4.1.0 Jupyter Notebook
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)
Bien qu'il ne soit pas parfait, le contour est principalement extrait.
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)
C'était joli et anguleux.
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()
J'ai approfondi ma compréhension de l'extraction de contours.
--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