Bonjour à tous,
je suis nouvelle sur ce forum et je débute avec Python (mon logiciel de prédilection est plutôt R). Mais voilà, R n'est pas taillé pour le traitement d'image.
Mon objectif : mesurer automatiquement des poissons posés sur une bâche blanche avec un indicateur d'échelle.
Pour l'instant, j'ai travaillé avec l'image d'un seul poisson. J'ai déjà réussi à
- passer mon image en nuances de gris
- enlever le bruit
- enlever l'arrière-plan (enfin à peu près)
- segmenter les éléments présents dans l'image
- les mesurer (en pixel)
Mon problème c'est que la mesure n'est pas associée à l'élément poisson ni à l'indicateur d'échelle. Il m'est donc difficile d'automatiser le processus. J'ai vu qu'il existait un module "keras" qui permettait d'identifier la catégorie de l'image mais je n'ai pas (encore) réussi à le faire fonctionner et surtout je ne vois pas comment faire le lien entre la forme reconnue (basée sur des features) et celle mesurée (basée sur des contours). Et existe-t-il un moyen pour s'assurer que le poisson a été entièrement pris en compte ? (Qu'il n'a pas été considéré comme 2 entités par exemple)
Je me pose aussi la question de la forme de l'indicateur d'échelle : carré ? rond ? Parce qu'il ne faut pas qu'il soit déformé lors de la prise de la photo (qui pourra être prise selon des angles et zooms différents).
Merci pour vos réponses :-), je vous mets en-dessous mon début de code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 import numpy as np import cv2 as cv from matplotlib import pyplot as plt from skimage import morphology from skimage import measure from scipy import ndimage as nd from matplotlib import pyplot as plt img = cv.imread('SAA_1.jpg') gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU) # noise removal kernel = np.ones((3,3),np.uint8) opening = cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel, iterations = 2) sure_bg = cv.dilate(opening,kernel,iterations=3) cv.imshow('labels',lab) mask = nd.morphology.binary_fill_holes(sure_bg) lab, n = nd.label(ret*mask) plt.title(str(n)+' objects detected') plt.imshow(lab) plt.show() props = measure.regionprops(lab) #donne le longueur max de l'element 1 props[0]['major_axis_length'] props[0].major_axis_length #donne le nombre d'elements len(props) #liste des longueurs trouvees liste_longueurs = list() for i in range(0, len(props)): liste_longueurs.append(props[i].major_axis_length) #on suppose que le poisson est la plus grande : print(max(liste_longueurs))
Partager