Project

General

Profile

Morph-M Python - Neighborhood Operator » History » Version 1

Serge Koudoro, 10/26/2009 01:38 PM

1 1 Serge Koudoro
h1. Morph-M Python - Neighborhood Operator
2
3
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.
4
5
<pre><code class="ruby">
6
def MyErode(imIn, nl, imOut):
7
	# version lambda:
8
	morphee.ImNeighborhoodUnaryOperation(imIn, nl, lambda l:min(l), imOut)
9
10
	# version that directly use the python function 'min':
11
	morphee.ImNeighborhoodUnaryOperation(imIn, nl, min, imOut)
12
13
if __name__=='__main__':
14
  im8=morphee.fileRead(os.path.join(images_dir_gray,"foreman.png"))
15
  imOut=morphee.getSame(im8)
16
  imOut_2=morphee.getSame(im8)
17
  nl=morphee.NeighborList.neighborsSquare2D
18
19
  # version Python:
20
  MyErode(im8,nl,imOut)
21
  # version C++:
22
  morphee.ImErode(im8,nl,imOut_2)
23
24
  # vérification:
25
  morphee.pngFileWrite(imOut,os.path.join(temp_dir,"ero1.png"))
26
  morphee.pngFileWrite(imOut_2,os.path.join(temp_dir,"ero2.png"))
27
  for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()):
28
	assert(p1==p2)
29
</code></pre>
30
31
Filtre de rang:
32
33
<pre><code class="ruby">
34
class RankOrder:
35
	def __init__(self, quantile):
36
		# on stocke la valeur du quantile:
37
		self.quantile=quantile
38
39
	def __call__(self, pyt):
40
		l=list(pyt)
41
		
42
		# l est la liste des valeurs des voisins
43
		l.sort()
44
		# conversion quantile/index:
45
		index=int(len(l)*self.quantile)
46
		if index >= len(l):# si on dépasse, on prend le dernier
47
			index=-1# -1 est le dernier élément de la liste
48
		return l[index]
49
50
def ImRankOrder(imIn, nl, quantile, imOut):
51
	op=RankOrder(quantile)
52
53
	morphee.ImNeighborhoodUnaryOperation(imIn,nl,op,imOut)
54
</code></pre>
55
56
Filtre de rang, avec [anti]extensivité garantie
57
58
<pre><code class="ruby">
59
class RankOrderWithExtensivity:
60
	def __init__(self, quantile):
61
		self.quantile=quantile
62
		if quantile > 0.5:	
63
			self.f=max
64
		elif quantile < 0.5:
65
			self.f=min
66
		else:
67
			self.f=None
68
69
	def __call__(self, pyt,center):
70
		l=list(pyt)
71
		l.sort()
72
		index=int(len(l)*self.quantile)
73
		if index == len(l):
74
			index=-1
75
76
		if self.f:
77
			# selon que l'on a choisi un quantile
78
			# dans la moitié supérieure ou inférieure,
79
			# on prend le max (resp. min) avec le centre,
80
			# pour garantir imOut>=imIn (resp <=)
81
			return self.f(center, l[index])
82
		else:
83
			return l[index]
84
85
def ImRankOrderWithExtensivity(imIn, nl, quantile, imOut):
86
	op=RankOrderWithExtensivity(quantile)
87
88
	morphee.ImNeighborhoodUnaryOperationWithCenter(imIn,nl,op,imOut)
89
90
# Filtre de rang:
91
	
92
# min (erosion)
93
ImRankOrder(im8,nl,0,imOut)
94
# vérification:
95
morphee.ImErode(im8,nl,imOut_2)
96
for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()):
97
	assert(p1==p2)
98
99
# max (dilatation)
100
ImRankOrder(im8,nl,1,imOut)
101
# vérification:
102
morphee.ImDilate(im8,nl,imOut_2)
103
for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()):
104
	assert(p1==p2)
105
106
# quantile à 0.25:
107
ImRankOrder(im8,nl,0.25,imOut)
108
# vérification:
109
for pOut,pIn in zip(imOut.imageData(), im8.imageData()):
110
	try:
111
		assert(pOut<=pIn)
112
	except:
113
		pass
114
		#print "Opérateur non anti-extensif: ",pOut, pIn
115
116
117
# quantile à 0.25 sauf si on est pas en-dessous
118
ImRankOrderWithExtensivity(im8,nl,0.25,imOut)
119
# vérification:
120
for pOut,pIn in zip(imOut.imageData(), im8.imageData()):
121
	try:
122
		assert(pOut<=pIn)
123
	except:
124
		print "Opérateur complexe non anti-extensif: ",pOut, pIn
125
</code></pre>
126
127
Addition de minkowski (dilatation duale)
128
129
<pre><code class="ruby">
130
def MinkowskiAdditionOperator(pyt,center):
131
	while pyt.isNotFinished():
132
		if pyt.getPixel() < center:
133
			pyt.setPixel(center)
134
		pyt.next()
135
136
def MyMinkowskiAddition(imIn, nl, imOut):
137
	morphee.ImUnaryOperationOnNeighborhoodWithCenter(imIn,nl,MinkowskiAdditionOperator,imOut)
138
139
# Addition de minkowski (dilatation duale)
140
# version Python:
141
MyMinkowskiAddition(im8,nl,imOut)
142
# version C++:
143
morphee.ImMinkowskiAddition(im8,nl,imOut_2)
144
morphee.pngFileWrite(imOut,os.path.join(temp_dir,"dil1.png"))
145
morphee.pngFileWrite(imOut_2,os.path.join(temp_dir,"dil2.png"))
146
for p1,p2 in zip(imOut.imageData(), imOut_2.imageData()):
147
	assert(p1==p2)
148
</code></pre>