
import os
from pylab import *
from skimage import io

os.chdir("D:/IPT_MP/TD_IPT_MP/TD_Contour")

### QUESTION 1 ###

def Cases_Adj(tableau,x,y) :
    """ calcule la liste des cases adjacentes à [x,y] """
    dx,dy=tableau.shape[0:2]
    L=[]
    for i in range(max(x-1,0),min(x+2,dx)) :
        for j in range(max(y-1,0),min(y+2,dy)) :
            L.append([i,j])
    return L

tableau=zeros((4,4))
#print(Cases_Adj(tableau,0,0)) 

   
def Sphere(tableau,x,y) :
    """ calcule la sphère unité de centre [x,y] pour la norme N_1 """
    dx,dy=tableau.shape[0:2]
    L=[]
    if x>0 :
        L.append([x-1,y])
    if x<dx-1 :
        L.append([x+1,y])
    if y>0 :
        L.append([x,y-1])
    if y<dy-1 :
        L.append([x,y+1])
        
    return L

### QUESTION 2) ###
    
def Remplissage(bitmap,point_depart) :
    """ remplit en blanc le domaine inscrit dans la frontière  """
    L=[point_depart]
    Tab_Temp=bitmap.copy()
    dx,dy=bitmap.shape[0:2]
    
    while L !=[] :
        Point=L.pop() #on considère le dernier élément de L et on l"enlève
        i,j=Point[0],Point[1]
        Tab_Temp[i,j]=0.5 #on marque en gris
        L.extend([case for case in Sphere(Tab_Temp,i,j) if Tab_Temp[case[0],case[1]]==0]) #on se déplace dans la composante connexe noire
    return Tab_Temp
    
### QUESTION 3) ###

def Contour_Frontiere(fichier,seuil, dir=os.getcwd()) :
    os.chdir(dir)
    image=imread(fichier+".png")[:,:,0]
    dx,dy=image.shape
    X,Y=ogrid[0:dx,0:dy]
    Tab_Temp=zeros((dx,dy))
    for x in range(dx) :
        for y in range(dy) :
                L=Cases_Adj(image,x,y)
                L_Cases_Adj=[image[M[0],M[1]] for M in L]
                if max(L_Cases_Adj)-min(L_Cases_Adj) >seuil : # si trop de contraste
                    Tab_Temp[x,y]=1
                
    return Tab_Temp
    


### QUESTION 4) ###
    
def Seuil(fichier,dir=os.getcwd()) :
    """ renvoie le seuil s pour qu'un tiers des pixels soient inférieurs à s """
    os.chdir(dir) 
    image=imread(fichier+".png")[:,:,0]
    dx,dy=image.shape[0:2]
    L=[]
    for x in range(dx) :
        for y in range(dy) :
            L.append(image[x,y])
    L_Triee=sorted(L)
    return L_Triee[len(L_Triee)//3]
    
#print(Seuil("NY",dir="D:/IPT_MP/Traitement_Images"))
    
### QUESTION 5) ###

def Trace_Remplissage(fichier,point_depart,dir=os.getcwd()) :
    os.chdir(dir)
    image_init=imread(fichier+".png") 
    dx,dy=image_init.shape[0:2]
    X,Y=ogrid[0:dx,0:dy]
    seuil_image=Seuil(fichier,dir)
    image_Temp=Contour_Frontiere(fichier,seuil_image,dir=os.getcwd())
    image_remplie=Remplissage(image_Temp,point_depart)
    forme_retenue=image_init.copy()
    forme_retenue[image_remplie!=0.5]=1 # on cache en blanc tout sauf la composante connexe
    figure()
    io.imshow(image_init)
    title("Image initiale")
    axis('off')
    figure()
    io.imshow(image_remplie)
    title("Image traitée pour reconnaissance de forme")
    axis('off')
    figure()
    io.imshow(forme_retenue)
    title("forme retenue pour l'image : point de départ : ["+str(point_depart[0])+","+str(point_depart[1])+"] / seuil : "+str(round(seuil_image,3)))
    axis('off')
    
    show()   
    
# Trace_Remplissage("TD_Reconnaissance_Forme",[0,0],dir="D:/IPT_MP/Traitement_Images")       
   
# Trace_Remplissage("TD_Reconnaissance_Forme",[350,600],dir="D:/IPT_MP/Traitement_Images")       
  
# Trace_Remplissage("TD_Reconnaissance_Forme",[160,550],dir="D:/IPT_MP/Traitement_Images")       
  
# Trace_Remplissage("TD_Reconnaissance_Forme",[225,430],dir="D:/IPT_MP/Traitement_Images") 

       