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 :
Nom : output1.png
Affichages : 379
Taille : 5,0 Ko

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 :
Nom : output2.png
Affichages : 355
Taille : 7,2 Ko
Ici l'image en input :
Nom : output3.png
Affichages : 358
Taille : 6,8 Ko


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 nimg
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()
Voilà pour le code, si une âme charitable réussi à trouver la source du problème, je lui en serait infiniment reconnaissante.
Pleins de bisous,
Zelda

PS : une image à mettre en input, si jamais :
Nom : input.jpg
Affichages : 339
Taille : 3,6 Ko