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