Bonjours à tous !

Je viens vous exposer mon problème : je me suis lancer dans un projet qui est de récupérer le tracé des routes à partir d'image satellite. Je me retrouve aujourd'hui à devoir faire un script python qui récupère une image en noir et blanc (je l'ai binarisé) et détecte chaque composante noire afin de les compter. Ceci va me permettre de réduire les impuretés de mon image. Dans le code suivant, je charge une image de test, j'ai juste fait des formes noires sur Paint. Pour cela, j'ai fait le code suivant :
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
import numpy as np
import cv2
import sys
sys.setrecursionlimit(35000)
 
img = cv2.imread('img_test.png') #on recupere l’image couleur
(height,width,channels)=img.shape 
print('Taille de l\'image couleur: {}x{}x{}'.format(height,width,channels)) 
print('Min={} et Max={}'.format(np.min(img),np.max(img)))  
 
imgB=np.zeros((height,width),dtype=np.uint8)    #Creer une matrice de taille height*width pour le bleu, pour le moment remplie que de 0
imgG=np.zeros((height,width),dtype=np.uint8)    #Pour le vert
imgR=np.zeros((height,width),dtype=np.uint8)    #Pour le rouge
imgmax=imgR=np.zeros((height,width),dtype=np.uint8)
imgmin=imgR=np.zeros((height,width),dtype=np.uint8)
imgBcpy=np.zeros((height,width),dtype=np.uint8)
 
for h in range(height) : 
    for w in range(width) : #on parcourt la matrice (le tableau) 
        imgB[h,w]=img[h,w,0]    #Tu remplies tes matrices avec la valeur de chaque pixel, à chaque fois avec un canal différent
        imgG[h,w]=img[h,w,1]    #Le resultat est une image en nuance de gris
        imgR[h,w]=img[h,w,2]
imgBcpy=np.copy(imgB)
cpt=0
 
def parcoursimg():
    global imgBcpy
    for h in range(height):
        for w in range(width):
            if(imgBcpy[h,w]==0):
                voisins(h,w)
    return
 
def voisins(h,w):
    global imgBcpy
    global cpt
    if(imgBcpy[h,w-1]==0):
        #print(h,w,imgBcpy[h,w],cpt)
        imgBcpy[h,w-1]=127
        cpt+=1
        voisins(h,w-1)
 
    if(imgBcpy[h-1,w]==0):
        #print(h,w,imgBcpy[h,w],cpt)
        imgBcpy[h-1,w]=127
        cpt+=1
        voisins(h-1,w)
 
    if(imgBcpy[h,w+1]==0):
        #print(h,w,imgBcpy[h,w],cpt)
        imgBcpy[h,w+1]=127
        cpt+=1
        voisins(h,w+1)
 
    if(imgBcpy[h+1,w]==0):
        #print(h,w,imgBcpy[h,w],cpt)
        imgBcpy[h+1,w]=127
        cpt+=1
        voisins(h+1,w)
 
    if(imgBcpy[h-1,w]!=0 and imgBcpy[h,w+1]!=0 and imgBcpy[h+1,w]!=0 and imgBcpy[h,w-1]!=0):
        return
 
parcoursimg()
cv2.imwrite("imagetraitee.png",imgBcpy)
cv2.imshow('imgBcpy',imgBcpy)
cv2.waitKey(0)
cv2.destroyAllWindows()
J'utilise donc les libraries Opencv et Numpy. Ma première fonction parcoursimg() va parcourir mon image et appeler la fonction voisins() quand elle rencontre un pixel noir. Cette dernière va regarder chaque pixel voisin et le mettre en gris, puis appeler récursivement cette même fonction pour parcourir toute notre zone noire. Comme on peut le voir, j'utilise des variables globales, c'est moche mais ce n'est pas important du tout pour le moment. Tout marche très bien, seul problème, lorsque je rencontre une zone noire trop grande, le programme s'arette sans laisser de message d'erreur. J'ai déja fait des recherches à ce sujet, d'où le "sys.setrecursionlimit(35000)" au début du programme, qui me permet d'augmenter la limite max de récursion. Cependant, le problème viendrais du fait que, comme il y a beaucoup d'appel récursif, ça demande une trop grosse quantité de mémoire.
J'ai trouvé quelqu'un sur le net qui avait à peu près le même problème que moi, et on lui a parlé des générateurs. Ça permettrais de résoudre notre problème car ils ne blindent pas l'espace mémoire. Or, je n'arrive pas à les utiliser, j'ai essayer de remplacer mes "return" par des "yield" et de mettre "yield from" quand j'appelle une fonction, mais l'image reste inchangée quand je lance mon programme.
La solution est peut-être simple mais je n'arrive pas à la trouver.
Merci d'avance