#!/usr/bin/python
#-*- coding: utf-8 -*-

# To define the path:
from morphee import *

import sys, os
pjoin = os.path.join

# To use Morphee
sys.path.append(pjoin(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),"Common","python"))
from morphee import *

def ImDisplay3d(im3d, start,M,N,value,filename):
	xsize = im3d.getXSize()
	ysize = im3d.getYSize()
	zsize = im3d.getZSize()
	xsize2 = im3d.getXSize()+2
	ysize2 = im3d.getYSize()+2
	imd = ImCreate(xsize2*M,ysize2*N,1,"UINT8")
	ImSetConstant(imd,value)
	type(imd)
	time = start
	for i in range(N):
		for j in range (M):
			if(time < zsize):
				imd.setActiveWindow(j*xsize2,i*ysize2,0, xsize, ysize, 1)
				im3d.setActiveWindow(0,0, time, xsize, ysize, 1)
				print ';',type(imd)
				ImCopy(im3d,imd)
				time = time + 1
	imd.resetActiveWindow()
	im3d.resetActiveWindow()
	ImDisplayX(imd,filename)


#--- SOLUTIONS

def Exercice2(nb_frames):
	"""
	
  	Segment a 3D grey level image with graphs
	
	"""
	print "II. Segment a 3D grey image"
	# Allocate images
	im = fileRead(pjoin(images_dir,"3D","brain.vis"))
	xsize = im.getXSize()
	ysize = im.getYSize()

	im2= ImCreate(xsize,ysize,nb_frames,"UINT8")
	im.setActiveWindow(0,0,0,xsize,ysize,nb_frames)
	ImCopy(im,im2)
	im = ImCreateSame(im2)
	ImCopy(im2,im)
	
	pdb.set_trace()
	ImDisplay3d(im,0,6,4,255,"ori")
	imFil = getSame(im)
	imTemp = getSame(im)
	imGrad = getSame(im)
	imLabel   = getSameOf(im,dataCategory.dtScalar,scalarDataType.sdtUINT32)
	imFineSeg = getSame(imLabel)
	imOut = getSame(imLabel)
	# Choice of the neighborhood graph
	nl = NeighborList.neighborsCubic63D
	
	# Alternate Sequential Filtering
	ImASFCloseOpen(im,nl,1,imFil)
	ImDisplay3d(imFil,0,6,4,255,"fil")
	
	# Gradient
	ImMorphoGradient(imFil,nl,imGrad)
	ImDisplay3d(imGrad,0,6,5,255,"gra")
	
	# Minima labelisation
	imMini = getSame(imGrad)
	ImMinima(imGrad,nl,imMini)
	ImLabel(imMini,nl,imLabel)
	ImDisplay3d(imLabel,0,6,4,255,"label")
    
	
	# Hierarchical segmentation:
	segmType = HierarchicalSegmentationType.Volumic
	graph = ImHierarchicalSegmentation(imGrad,imLabel,nl,segmType,imFineSeg)
	ImDisplay3d(imFineSeg,0,6,4,255,"fineseg")
	
	# Choice of a level in the hierarchy
	numberOfRegions = 2
	ImDisplayHierarchyLevel(imFineSeg,graph,numberOfRegions,imOut)
	imSeg = ImCreateSame(imOut)
	imSeg8 = ImCreateSame(imOut,"UINT8")
	ImLabelFlatZones(imOut,nl,imSeg)
	ImCopy(imSeg,imSeg8)
	ImDisplay3d(imSeg8,0,6,4,255,"seg")
	pdb.set_trace()
	


#--- GLOBAL SCRIPT

if __name__=='__main__':
	
	print "3D segmentation and tracking"
	nb_frames = 10
	Exercice2(nb_frames)
	
