Skip to content

Commit 1fa1294

Browse files
committed
jeah...segmentation layer is working
1 parent 076ed1a commit 1fa1294

File tree

5 files changed

+132
-42
lines changed

5 files changed

+132
-42
lines changed

layerviewer/helpers.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,16 @@ def setPolicy(widget,p=QtGui.QSizePolicy.Maximum):
88
sizePolicy = QtGui.QSizePolicy(p,p)
99
sizePolicy.setHorizontalStretch(0)
1010
sizePolicy.setVerticalStretch(0)
11-
widget.setSizePolicy(sizePolicy)
11+
widget.setSizePolicy(sizePolicy)
12+
13+
14+
15+
16+
def permuteLabels(data):
17+
18+
flat = np.array(data).reshape([-1])
19+
unique , relabeling = np.unique(flat,return_inverse=True)
20+
permUnique = np.random.permutation(unique)
21+
flatNew = permUnique[relabeling]
22+
newLabels = flatNew.reshape([data.shape[0],data.shape[1]])
23+
return newLabels

layerviewer/layers.py

+84-33
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
from collections import OrderedDict
55
import pyqtgraph.parametertree.parameterTypes as pTypes
66
from pyqtgraph.parametertree import Parameter, ParameterTree, ParameterItem, registerParameterType
7-
from helpers import setPolicy
8-
from abc import ABCMeta,abstractmethod
97

8+
from abc import ABCMeta,abstractmethod
9+
10+
from helpers import setPolicy,permuteLabels
1011
from inputCheck import InputCheck
12+
from normalize import norm01
1113
#from lazycall import lazyCall
12-
from normalize import norm01
14+
1315

1416

1517
class LayerBase(object):
@@ -123,11 +125,11 @@ def lala(self):
123125
class LayerImageItem(pg.ImageItem):
124126
def __init__(self,*args,**kwargs):
125127
super(LayerImageItem,self).__init__(*args,**kwargs)
126-
128+
"""
127129
def mouseClickEvent(self, ev):
128130
print type(self)
129131
print ev.pos()
130-
132+
"""
131133

132134
class ImageRgbLayer(LayerImageItem,LayerBase):
133135

@@ -140,12 +142,8 @@ def checkData(self,data):
140142
InputCheck.colorImage(data)
141143

142144
def setData(self,data=None):
143-
if data is None:
144-
self.removeItems()
145-
return
146-
else:
147-
self.data=data
148-
self.setImage(self.data,opacity=self.getParamValue('Opacity'))
145+
self.data=data
146+
self.setImage(self.data,opacity=self.getParamValue('Opacity'))
149147

150148
def controlTemplate(self):
151149
return [{'name': 'Opacity', 'type': 'float', 'value': 0.75, 'step': 0.1,'limits':[0,1]} ]
@@ -160,7 +158,6 @@ def onOpacityChanged(param,changes):
160158
self.connectParam('Opacity',onOpacityChanged)
161159

162160

163-
164161
class ImageGrayLayer(LayerImageItem,LayerBase):
165162

166163

@@ -180,14 +177,10 @@ def checkData(self,data):
180177
InputCheck.grayImage(data)
181178

182179
def setData(self,data=None):
183-
if data is None:
184-
self.removeItems()
185-
return
186-
else:
187-
self.data=data
188-
self.preProcessedData = norm01(np.squeeze(self.data))
189-
self.cmappedData = self.getParamValue('ColorMap').map(self.preProcessedData)
190-
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
180+
self.data=data
181+
self.preProcessedData = norm01(np.squeeze(self.data))
182+
self.cmappedData = self.getParamValue('ColorMap').map(self.preProcessedData)
183+
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
191184

192185
def controlTemplate(self):
193186
return [
@@ -212,7 +205,6 @@ def onColorMapChanged(param,changes):
212205
self.connectParam('ColorMap',onColorMapChanged)
213206

214207

215-
216208
class ImageMultiGrayLayer(LayerImageItem,LayerBase):
217209

218210

@@ -223,22 +215,18 @@ def __init__(self,name,layerViewer):
223215
self.addItem(self)
224216
self.preProcessedData = None
225217
self.selectedChannelImg = None
226-
self.cmappedData = None
218+
self.cmappedData = None
227219

228220
def checkData(self,data):
229221
InputCheck.multiGrayImage(data)
230222

231223
def setData(self,data=None):
232-
if data is None:
233-
self.removeItems()
234-
return
235-
else:
236-
self.layerParameter.param('Channel').setOpts(name = 'Channel',value =0 ,limits=[0,data.shape[2]-1])
237-
self.data = data
238-
self.preProcessedData = norm01(self.data,channelWise=True)
239-
self.selectedChannelImg = self.preProcessedData[:,:,self.getParamValue('Channel')]
240-
self.cmappedData = self.getParamValue('ColorMap').map(self.selectedChannelImg)
241-
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
224+
self.layerParameter.param('Channel').setOpts(name = 'Channel',value =0 ,limits=[0,data.shape[2]-1])
225+
self.data = data
226+
self.preProcessedData = norm01(self.data,channelWise=True)
227+
self.selectedChannelImg = self.preProcessedData[:,:,self.getParamValue('Channel')]
228+
self.cmappedData = self.getParamValue('ColorMap').map(self.selectedChannelImg)
229+
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
242230

243231

244232
def controlTemplate(self):
@@ -274,6 +262,69 @@ def onOpacityChanged(param,changes):
274262
self.connectParam('ColorMap',onColorMapChanged)
275263

276264

265+
class SegmentationLayer(LayerImageItem,LayerBase):
266+
267+
268+
def __init__(self,name,layerViewer):
269+
LayerBase.__init__(self,name,layerViewer)
270+
LayerImageItem.__init__(self,parent=self.layerView)
271+
272+
self.addItem(self)
273+
self.preProcessedData = None
274+
self.cmappedData = None
275+
276+
277+
def checkData(self,data):
278+
InputCheck.grayImage(data)
279+
280+
def setData(self,data=None):
281+
self.data=data
282+
self.preProcessedData = norm01(np.require( permuteLabels(self.data),dtype=np.float32 ) )
283+
self.cmappedData = self.getParamValue('ColorMap').map(self.preProcessedData)
284+
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
285+
286+
def controlTemplate(self):
287+
return [
288+
{'name': 'ColorMap', 'type': 'colormap'},
289+
{'name': 'Opacity', 'type': 'float', 'value': 0.75, 'step': 0.1,'limits':[0,1]}
290+
]
291+
292+
def connectControls(self):
293+
294+
def onOpacityChanged(param,changes):
295+
assert len(changes)==1
296+
param,change,opacity = changes[0]
297+
self.setImage(self.cmappedData,opacity=opacity)
298+
299+
def onColorMapChanged(param,changes):
300+
assert len(changes)==1
301+
param,change,cmap = changes[0]
302+
self.cmappedData = cmap.map(self.preProcessedData)
303+
self.setImage(self.cmappedData,opacity=self.getParamValue('Opacity'))
304+
305+
self.connectParam('Opacity',onOpacityChanged)
306+
self.connectParam('ColorMap',onColorMapChanged)
307+
308+
309+
def mouseClickEvent(self, ev):
310+
pos = ev.pos()
311+
label = self.data[pos[0],pos[1]]
312+
self.segClicked(label,ev)
313+
314+
315+
def segClicked(self,label,ev):
316+
print "label %d clicked"%label
317+
318+
319+
320+
class PixelLabelLayer(LayerImageItem,LayerBase):
321+
pass
322+
323+
324+
325+
326+
277327
layerTypes['RgbLayer']=ImageRgbLayer
278328
layerTypes['GrayLayer']=ImageGrayLayer
279-
layerTypes['MultiGrayLayer']=ImageMultiGrayLayer
329+
layerTypes['MultiGrayLayer']=ImageMultiGrayLayer
330+
layerTypes['SegmentationLayer']=SegmentationLayer

layerviewer/lazycall.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
def lazyCall(value,f,*args,**kwargs):
3+
if value is None:
4+
return f(*args,**kwargs)
5+
else:
6+
return value

layerviewer/normalize.py

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
def norm01(dataIn,channelWise=False):
2+
out=dataIn.copy()
3+
if channelWise==False:
4+
out-=out.min()
5+
out/=out.max()
6+
else :
7+
for c in range(dataIn.shape[2]):
8+
out[:,:,c]-=out[:,:,c].min()
9+
out[:,:,c]/=out[:,:,c].max()
10+
return out
11+
12+

myviewer.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,30 @@
2020
viewer = lv.LayerViewer()
2121
viewer.show()
2222

23-
rgbImg = vigra.readImage('/home/tbeier/Desktop/lena.bmp')#[:,:,:]
24-
viewer.addLayer(name='rgb',layerType='RgbLayer')
25-
viewer.setLayerData(name='rgb',data=rgbImg)
23+
rgbImg = vigra.readImage('/home/tbeier/Desktop/lena.bmp')
24+
gradMag = vigra.filters.gaussianGradientMagnitude(rgbImg,3.5)
25+
seg,nSeg = vigra.analysis.watersheds(gradMag)
2626

2727

28+
print seg,nSeg
2829

29-
gray = vigra.filters.gaussianGradientMagnitude(rgbImg,1.5)
30-
viewer.addLayer(name='gray',layerType='GrayLayer')
31-
viewer.setLayerData(name='gray',data=gray)
3230

31+
# rgb layer
32+
viewer.addLayer(name='Rgb',layerType='RgbLayer')
33+
viewer.setLayerData(name='Rgb',data=rgbImg)
3334

35+
# gray layer
36+
viewer.addLayer(name='GradMag',layerType='GrayLayer')
37+
viewer.setLayerData(name='GradMag',data=gradMag)
3438

3539

36-
viewer.addLayer(name='mgray',layerType='MultiGrayLayer')
37-
viewer.setLayerData(name='mgray',data=rgbImg)
40+
# seg layer
41+
viewer.addLayer(name='SuperPixels',layerType='SegmentationLayer')
42+
viewer.setLayerData(name='SuperPixels',data=seg)
43+
44+
45+
#viewer.addLayer(name='mgray',layerType='MultiGrayLayer')
46+
#viewer.setLayerData(name='mgray',data=rgbImg)
3847

3948

4049
viewer.autoRange()

0 commit comments

Comments
 (0)