Project

General

Profile

Morph-M Python - Neighborhood Operator » History » Revision 2

Revision 1 (Serge Koudoro, 10/26/2009 01:38 PM) → Revision 2/3 (Serge Koudoro, 10/26/2009 02:45 PM)

h1. Morph-M Python - Neighborhood Operator 

 Example 1: Erosion. This generic function, create a list with all neighborhord values. These values are send to its operator and rthe return value will be put on center. 

 <pre><code class="ruby"> 
 def MyErode(imIn, nl, imOut): 
	 # version lambda: 
	 morphee.ImNeighborhoodUnaryOperation(imIn, nl, lambda l:min(l), imOut) 

	 # version that directly use the python function 'min': 
	 morphee.ImNeighborhoodUnaryOperation(imIn, nl, min, imOut) 

 if __name__=='__main__': 
   im8=morphee.fileRead(os.path.join(images_dir_gray,"foreman.png")) 
   imOut=morphee.getSame(im8) 
   imOut_2=morphee.getSame(im8) 
   nl=morphee.NeighborList.neighborsSquare2D 

   # version Python: 
   MyErode(im8,nl,imOut) 
   # version C++: 
   morphee.ImErode(im8,nl,imOut_2) 

   # vérification: 
   morphee.pngFileWrite(imOut,os.path.join(temp_dir,"ero1.png")) 
   morphee.pngFileWrite(imOut_2,os.path.join(temp_dir,"ero2.png")) 
   for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 
 </code></pre> 

 Filtre de rang: 

 <pre><code class="ruby"> 
 class RankOrder: 
	 def __init__(self, quantile): 
		 # on stocke la valeur du quantile: 
		 self.quantile=quantile 

	 def __call__(self, pyt): 
		 l=list(pyt) 
		
		 # l est la liste des valeurs des voisins 
		 l.sort() 
		 # conversion quantile/index: 
		 index=int(len(l)*self.quantile) 
		 if index >= len(l):# si on dépasse, on prend le dernier 
			 index=-1# -1 est le dernier élément de la liste 
		 return l[index] 

 def ImRankOrder(imIn, nl, quantile, imOut): 
	 op=RankOrder(quantile) 

	 morphee.ImNeighborhoodUnaryOperation(imIn,nl,op,imOut) 
	
 # min (erosion) 
 ImRankOrder(im8,nl,0,imOut) 
 # check results: 
 morphee.ImErode(im8,nl,imOut_2) 
 for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 

 # max (dilatation) 
 ImRankOrder(im8,nl,1,imOut) 
 # check results: 
 morphee.ImDilate(im8,nl,imOut_2) 
 for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 

 # quantile à 0.25: 
 ImRankOrder(im8,nl,0.25,imOut) 
 # check results: 
 for pOut,pIn in zip(imOut.imageData(), im8.imageData()): 
	 try: 
		 assert(pOut<=pIn) 
	 except: 
		 pass 
		 #print "Opérateur non anti-extensif: ",pOut, pIn 

 </code></pre> 

 Filtre de rang, avec [anti]extensivité garantie 

 <pre><code class="ruby"> 
 class RankOrderWithExtensivity: 
	 def __init__(self, quantile): 
		 self.quantile=quantile 
		 if quantile > 0.5: 	
			 self.f=max 
		 elif quantile < 0.5: 
			 self.f=min 
		 else: 
			 self.f=None 

	 def __call__(self, pyt,center): 
		 l=list(pyt) 
		 l.sort() 
		 index=int(len(l)*self.quantile) 
		 if index == len(l): 
			 index=-1 

		 if self.f: 
			 # selon que l'on a choisi un quantile 
			 # dans la moitié supérieure ou inférieure, 
			 # on prend le max (resp. min) avec le centre, 
			 # pour garantir imOut>=imIn (resp <=) 
			 return self.f(center, l[index]) 
		 else: 
			 return l[index] 

 def ImRankOrderWithExtensivity(imIn, nl, quantile, imOut): 
	 op=RankOrderWithExtensivity(quantile) 

	 morphee.ImNeighborhoodUnaryOperationWithCenter(imIn,nl,op,imOut) 

 # Filtre de rang: 
	
 # min (erosion) 
 ImRankOrder(im8,nl,0,imOut) 
 # vérification: 
 morphee.ImErode(im8,nl,imOut_2) 
 for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 

 # max (dilatation) 
 ImRankOrder(im8,nl,1,imOut) 
 # vérification: 
 morphee.ImDilate(im8,nl,imOut_2) 
 for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 

 # quantile à 0.25: 
 ImRankOrder(im8,nl,0.25,imOut) 
 # vérification: 
 for pOut,pIn in zip(imOut.imageData(), im8.imageData()): 
	 try: 
		 assert(pOut<=pIn) 
	 except: 
		 pass 
		 #print "Opérateur non anti-extensif: ",pOut, pIn 


 # quantile à 0.25 sauf si on est pas en-dessous 
 ImRankOrderWithExtensivity(im8,nl,0.25,imOut) 
 # Check results vérification: 
 for pOut,pIn in zip(imOut.imageData(), im8.imageData()): 
	 try: 
		 assert(pOut<=pIn) 
	 except: 
		 print "Opérateur complexe non anti-extensif: ",pOut, pIn 
 </code></pre> 

 Minkowski Addition (dual dilatation) de minkowski (dilatation duale) 

 <pre><code class="ruby"> 
 def MinkowskiAdditionOperator(pyt,center): 
	 while pyt.isNotFinished(): 
		 if pyt.getPixel() < center: 
			 pyt.setPixel(center) 
		 pyt.next() 

 def MyMinkowskiAddition(imIn, nl, imOut): 
	 morphee.ImUnaryOperationOnNeighborhoodWithCenter(imIn,nl,MinkowskiAdditionOperator,imOut) 

 # Addition de minkowski (dilatation duale) 
 # version Python: 
 MyMinkowskiAddition(im8,nl,imOut) 
 # version C++: 
 morphee.ImMinkowskiAddition(im8,nl,imOut_2) 
 morphee.pngFileWrite(imOut,os.path.join(temp_dir,"dil1.png")) 
 morphee.pngFileWrite(imOut_2,os.path.join(temp_dir,"dil2.png")) 
 for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()): 
	 assert(p1==p2) 
 </code></pre>