Bonjour tout le monde,
Alors, je vais vous épargner les détails de mon programme MAIS : pour atteindre mon but, j'ai besoin d'extraire des suites de "pixels" d'un tableau numpy. Rien de très difficile me direz vous, là où ça se complique, c'est que chacun de ces pixels ne doit avoir au maximum que 2 voisins. Je m'explique : à chaque croisement(chaque fois que le nombre de voisins est supérieur à 2), je voudrais stopper l'extraction et commencer une nouvelle suite de pixel.
Dans mon cas, j'ai décidé de représenté chaque suite de pixel détecté d'une couleur différente. Exemple ci-dessous :
Comme vous pouvez le voir, mes fonctions marchent sur une image de 10x10 pixels. Malheureusement, le résultat n'est pas aussi grandiose sur du 100x100 :
Ici l'image en input :
Alors voilà, malgré mes efforts, je n'ai pas réussi à trouver l'erreur à l'origine de ce résultat certes très joli mais très peu utile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 import PILE import image import numpy as np from itertools import product
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 def scan (x, y, img, height=100, width=100) : #scan mon image de x, y jusqu'au prochain pixel rencontré for i, j in product(range(height), range(width)): if img[i][j] == 1 : return i,j return height-1, width-1
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 def nb_neighbor(x, y, img, height=100, width=100) : #check toutes les cases autour d'un pixel et vérifie la présence de voisins result = [0, x, y] for i in range(9) : x_prov = x y_prov = y if i%3 == 0 : if x == 0 : continue else : x_prov = x-1 elif i%3 == 2 : if x == height-1 : continue else : x_prov = x+1 if int(i/3) == 0 : if y == 0 : continue else : y_prov = y-1 elif int(i/3) == 2 : if y == width-1 : continue else : y_prov = y+1 if img[x_prov][y_prov] >= 0.5 : result[0] += 1 if result[0] > 1 : result[1] = x result[2] = y break result[1] = x_prov result[2] = y_prov return result
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 def almost_working(img, height=100, width=100) : scan_x = 0 scan_y = 0 color = 50 nimg = np.zeros((height, width), dtype = np.uint8) while scan_x != height-1 or scan_y != width-1 : scan_x, scan_y = scan(scan_x, scan_y, img, height, width) find_x = scan_x find_y = scan_y while img[find_x][find_y] >= 0.5 : img[find_x][find_y] = 0 nimg[find_x][find_y] = color next = nb_neighbor(find_x, find_y, img, height, width) if next[0] != 1 : color += 1 find_x = next[1] find_y = next[2] return nimgVoilà pour le code, si une âme charitable réussi à trouver la source du problème, je lui en serait infiniment reconnaissante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 img = np.array(Image.open('data/one_bw_data.jpg').convert('L')) result = almost_working(img) plt.imshow(result.T, cmap='tab20', origin='lower') plt.show()
Pleins de bisous,
Zelda
PS : une image à mettre en input, si jamais :
Partager