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 :
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.
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 limage 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'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
Partager