+ # ---------------------------------------------------------------------
+ #
+ # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+ # pour la SantÈ)
+ # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+ # Previous Authors : Laurent Guigues, Jean-Pierre Roux
+ # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+ #
+ # This software is governed by the CeCILL-B license under French law and
+ # abiding by the rules of distribution of free software. You can use,
+ # modify and/ or redistribute the software under the terms of the CeCILL-B
+ # license as circulated by CEA, CNRS and INRIA at the following URL
+ # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ # or in the file LICENSE.txt.
+ #
+ # As a counterpart to the access to the source code and rights to copy,
+ # modify and redistribute granted by the license, users are provided only
+ # with a limited warranty and the software's author, the holder of the
+ # economic rights, and the successive licensors have only limited
+ # liability.
+ #
+ # The fact that you are presently reading this means that you have had
+ # knowledge of the CeCILL-B license and that you accept its terms.
+ # ------------------------------------------------------------------------ */
+
+
description "Basic segmentation and filtering of an image"
author "jpr@creatis.insa-lyon.fr"
-category "demo"
+category "demo, filter"
// 3 Slices, 2 volumes
include itkvtk
include wxvtk
+//
+// Get the image and determine Slice number, slider size, ...
+// ----------------------------------------------------------
+
# Here loads hola.mhd
+# -------------------
+# Don't forget to comment out the following 2 lines
+# If you want to check someting else.
+
include vtk/boxes/bbLoadHola
new LoadHola reader
+
# uncomment next lines to have a file selector
-#new FileSelector openFileDialog
-#new ImageReader reader
-# connect openFileDialog.Out reader.In
+# --------------------------------------------
+/*
+new FileSelector openFileDialog
+new ImageReader reader
+ connect openFileDialog.Out reader.In
+*/
+
+# uncomment next lines to use Gimmick
+# -----------------------------------
+/*
+load creaImageIO
+new Gimmick reader
+*/
+
+# uncomment next lines to Read a MHD file (and nothing else !)
+# ------------------------------------------------------------
+/*
+new FileSelector openFileDialog
+new MetaImageReader reader
+ connect openFileDialog.Out reader.In
+*/
+
+# uncomment the following lines to read a 3D images stack
+# (only if file name order is meaningfull)
+# -------------------------------------------------------
+/*
+// To choose the directory
+new DirectorySelector ds
+// To get the image names into a vector
+new FilesFromDirectory fd
+// To read all the files, as a bbitk::ImagePointer
+new ImageSeriesReader reader
+// user choosen directory as input
+connect ds.Out fd.In
+set fd.Recursive false
+// list of files as input
+#print "Files found in $ds.Out$\n
+connect fd.Out reader.FileNames
+*/
+
+# uncomment the following lines to read a 3D images stack
+# (if the directory contains a 'XCoherent" Serie)
+# -------------------------------------------------------
+/*
+// To choose the directory
+new DirectorySelector ds
+// To get the image names into a vector
+new FilesFromDirectory fd
+// user choosen directory as input
+connect ds.Out fd.In
+// order the files, computes an accurate ZSpacing
+new GetXCoherentInfoGdcmReader reader
+connect fd.Out reader.In
+*/
+
+# uncomment the following lines to read a 3D images stack
+# (with DICOMDirReader)
+# -------------------------------------------------------
+/*
+include itk/boxes/bbDICOMDirReader
+// To choose the directory
+new DirectorySelector ds
+new DICOMDirReader reader
+ connect ds.Out reader.In
+*/
+
+// We need that to set Sliders sizes
#Get image dimensions, ...
new ImageProperties mc
connect reader.Out mc.In
-
+
#Get number of planes (Z)
new GetVectorIntElement gveZ
connect mc.Size gveZ.In
new Div div2
connect gveZ.Out div2.In1
set div2.In2 2
-
-#---------------------------------------------------------------------
-new Slider slider
- set slider.Title "Slice"
-
+//
+// Graphical organization
+// ----------------------
+
+new LayoutSplit mainSplit
+ set mainSplit.Proportion 60
+ set mainSplit.WinHeight 1000
+ set mainSplit.WinWidth 1400
+ set mainSplit.WinTitle "Processing / Viewing example (demoFiltering1.bbs) "
+
+ new LayoutSplit splitUp
+ set splitUp.Proportion 38
+ connect splitUp.Widget mainSplit.Widget1
+
+ new LayoutLine toolLayout
+ set toolLayout.Orientation H
+ connect toolLayout.Widget splitUp.Widget1
+
+ new LayoutLine sliderLayout
+ set sliderLayout.Orientation V
+ connect sliderLayout.Widget toolLayout.Widget1
+
+ new Slider sliceSlider
+ set sliceSlider.Title "Slice"
+ set sliceSlider.ReactiveOnTrack true
+ connect sliceSlider.Widget sliderLayout.Widget1
+
+ new Slider lowerThresholdSlider
+ set lowerThresholdSlider.Title "LowerThreshold"
+ set lowerThresholdSlider.Max 200
+ set lowerThresholdSlider.In 10
+ set lowerThresholdSlider.ChangeResolution 1
+ connect lowerThresholdSlider.Widget sliderLayout.Widget2
+
+ new Slider upperThresholdSlider
+ set upperThresholdSlider.Title "UpperThreshold"
+ set upperThresholdSlider.Max 500
+ set upperThresholdSlider.In 150
+ set upperThresholdSlider.ChangeResolution 1
+ connect upperThresholdSlider.Widget sliderLayout.Widget3
+
+ new Slider smoothSlider
+ set smoothSlider.Title "Smooth"
+ set smoothSlider.Max 10
+ set smoothSlider.In 3
+ set smoothSlider.ChangeResolution 1
+ connect smoothSlider.Widget sliderLayout.Widget4
+
+ new LayoutLine buttonLayout
+ set buttonLayout.Orientation H
+ connect buttonLayout.Widget toolLayout.Widget2
+
+ new ColourSelectorButton colourThreshold
+ set colourThreshold.In "1 0 0"
+ connect colourThreshold.Widget buttonLayout.Widget1
+
+ new ColourSelectorButton colourSmooth
+ set colourSmooth.In "1 1 0"
+ connect colourSmooth.Widget buttonLayout.Widget2
+
+/*
+ new CommandButton refresh
+ set refresh.Label "Refresh (to be used once at start time)"
+ connect refresh.Widget buttonLayout.Widget3
+*/
+ new LayoutLine layout2D
+ set layout2D.Orientation H
+ connect layout2D.Widget splitUp.Widget2
+
+ new Viewer2D viewer2DImageOriginal
+ connect viewer2DImageOriginal.Widget layout2D.Widget1
+
+ new Viewer2D viewer2DImageSegmented
+ connect viewer2DImageSegmented.Widget layout2D.Widget2
+
+ new Viewer2D viewer2DImageSmooth
+ connect viewer2DImageSmooth.Widget layout2D.Widget3
+
+ new LayoutSplit layout3D
+ set layout3D.Orientation H
+ set layout3D.Proportion 90
+ connect layout3D.Widget mainSplit.Widget2
+
+ new LayoutSplit layoutSurfaces
+ set layoutSurfaces.Orientation H
+ set layoutSurfaces.Proportion 50
+ connect layoutSurfaces.Widget layout3D.Widget1
+
+ new Viewer3D viewer3DSurfaceThreshold
+ connect viewer3DSurfaceThreshold.Widget layoutSurfaces.Widget1
+
+ new Viewer3D viewer3DSurfaceSmooth
+ connect viewer3DSurfaceSmooth.Widget layoutSurfaces.Widget2
+
+ new LayoutLine vSliderLayout
+ connect vSliderLayout.Widget layout3D.Widget2
+
+ new Slider lowerOpacitySlider
+ set lowerOpacitySlider.Title "Opacity"
+ set lowerOpacitySlider.Min 1
+ set lowerOpacitySlider.Max 100
+ set lowerOpacitySlider.In 50
+ set lowerOpacitySlider.Orientation V
+ connect lowerOpacitySlider.Widget vSliderLayout.Widget1
+
+/*
+ new Slider upperOpacitySlider
+ set upperOpacitySlider.Title "UpperOpacity"
+ set upperOpacitySlider.Max 100
+ set upperOpacitySlider.In 100
+ set upperOpacitySlider.Orientation V
+ connect upperOpacitySlider.Widget vSliderLayout.Widget2
+*/
+
+//
+// End of Graphical organization
+// -----------------------------
+
+//
+// Processing pipeline
+// -------------------
+
+ connect reader.Out viewer2DImageOriginal.In
+ connect sliceSlider.Out viewer2DImageOriginal.Slice
+
#Slider size is the number of planes
- connect gveZ.Out slider.Max
+ connect gveZ.Out sliceSlider.Max
#initial slice is the middle one
- connect div2.Out slider.In
- set slider.ChangeResolution 1
-
-new Slider lowerThresholdSlider
- set lowerThresholdSlider.Title "LowerThreshold"
- set lowerThresholdSlider.Max 50
- set lowerThresholdSlider.In 20
- set lowerThresholdSlider.ChangeResolution 1
+ connect div2.Out sliceSlider.In
+ set sliceSlider.ChangeResolution 1
-new Slider upperThresholdSlider
- set upperThresholdSlider.Title "UpperThreshold"
- set upperThresholdSlider.Max 50
- set upperThresholdSlider.In 500
- set upperThresholdSlider.ChangeResolution 1
-
-new Slider smoothSlider
- set smoothSlider.Title "Smooth"
- set smoothSlider.Max 10
- set smoothSlider.In 1
- set smoothSlider.ChangeResolution 1
-
-new CommandButton refresh
- set refresh.Label "Refresh"
- set refresh.In "exec isoextractorthreshold;exec isoextractorsmooth;exec mainSplit"
-
-new MultipleInputs refreshimages
- //connect slider.BoxChange refreshimages.In1
- connect upperThresholdSlider.BoxChange refreshimages.In2
- connect lowerThresholdSlider.BoxChange refreshimages.In3
- connect smoothSlider.BoxChange refreshimages.In4
-
-#---------------------------------------------------------------------
-
-new Viewer2D viewer2DImageOriginal
- connect reader.Out viewer2DImageOriginal.In
- connect slider.Out viewer2DImageOriginal.Slice
- connect slider.BoxChange viewer2DImageOriginal.BoxExecute
-
-#---------------------------------------------------------------------
+// Images 2D
-new BinaryThresholdImageFilter threshold
- connect upperThresholdSlider.Out threshold.UpperThreshold
- connect lowerThresholdSlider.Out threshold.LowerThreshold
+ new BinaryThresholdImageFilter threshold
set threshold.InsideValue 255
set threshold.OutsideValue 0
+
+ connect upperThresholdSlider.Out threshold.UpperThreshold
+ connect lowerThresholdSlider.Out threshold.LowerThreshold
connect reader.Out threshold.In
-new Viewer2D viewer2DImageSegmented
connect threshold.Out viewer2DImageSegmented.In
- connect slider.Out viewer2DImageSegmented.Slice
-// connect slider.BoxChange viewer2DImageSegmented.BoxExecute
- connect refreshimages.Out viewer2DImageSegmented.BoxExecute
-
-#---------------------------------------------------------------------
+ connect sliceSlider.Out viewer2DImageSegmented.Slice
new ImageGaussianSmooth smooth
connect threshold.Out smooth.In
connect smoothSlider.Out smooth.StdDevY
connect smoothSlider.Out smooth.StdDevZ
-
-new Viewer2D viewer2DImageSmooth
- connect smooth.Out viewer2DImageSmooth.In
- connect slider.Out viewer2DImageSmooth.Slice
- connect slider.BoxChange viewer2DImageSmooth.BoxExecute
+ connect smooth.Out viewer2DImageSmooth.In
+ connect sliceSlider.Out viewer2DImageSmooth.Slice
-#---------------------------------------------------------------------
+// Planes
+new ImagePlanes planes
+ connect reader.Out planes.In
+ connect planes.PlaneX viewer3DSurfaceSmooth.Obs1
+ connect planes.PlaneY viewer3DSurfaceSmooth.Obs2
+ connect planes.PlaneZ viewer3DSurfaceSmooth.Obs3
-new LayoutLine upLayout
- set upLayout.Orientation H
- connect viewer2DImageOriginal.Widget upLayout.Widget1
- connect viewer2DImageSegmented.Widget upLayout.Widget2
- connect viewer2DImageSmooth.Widget upLayout.Widget3
+// Surfaces 3D
+new IsoSurfaceExtractor isoextractorThreshold
+ connect threshold.Out isoextractorThreshold.In
+ set isoextractorThreshold.Opacity 1
+ set isoextractorThreshold.Isovalue 100
+ connect colourThreshold.Out isoextractorThreshold.Colour
+ connect isoextractorThreshold.Out viewer3DSurfaceThreshold.In1
-new ColourSelectorButton colourLower
- set colourLower.In "1 1 0"
-
-new ColourSelectorButton colourUpper
- set colourUpper.In "1 0 0"
-
-#---------------------------------------------------------------------
-
-new Viewer3D viewernvImagethreshold3D
-# set viewernvImagethreshold3D.nTypeView "5"
-
-new IsoSurfaceExtractor isoextractorthreshold
- connect threshold.Out isoextractorthreshold.In
- set isoextractorthreshold.Opacity 1.0
- set isoextractorthreshold.Isovalue 100
- connect colourUpper.Out isoextractorthreshold.Colour
- connect viewernvImagethreshold3D.Renderer isoextractorthreshold.Renderer
-
-
-#---------------------------------------------------------------------
-new Viewer3D viewernvImageSmooth3D
-# set viewernvImageSmooth3D.nTypeView "5"
- //connect refreshimages.Out viewernvImageSmooth3D.BoxExecute
-
-new IsoSurfaceExtractor isoextractorsmooth
- connect smooth.Out isoextractorsmooth.In
- set isoextractorsmooth.Opacity 0.2
- set isoextractorsmooth.Isovalue 200
- connect colourLower.Out isoextractorsmooth.Colour
- connect viewernvImageSmooth3D.Renderer isoextractorsmooth.Renderer
-
-
-#---------------------------------------------------------------------
-
-new LayoutSplit downLayout
- set downLayout.Orientation H
- set downLayout.Proportion 50
- connect viewernvImagethreshold3D.Widget downLayout.Widget1
- connect viewernvImageSmooth3D.Widget downLayout.Widget2
-
-new LayoutLine sliderLayout
- set sliderLayout.Orientation V
-
-new LayoutLine buttonLayout
- set buttonLayout.Orientation V
- connect colourLower.Widget buttonLayout.Widget1
- connect colourUpper.Widget buttonLayout.Widget2
- connect refresh.Widget buttonLayout.Widget3
-
-new LayoutLine toolLayout
- set toolLayout.Orientation H
- connect sliderLayout.Widget toolLayout.Widget1
- connect buttonLayout.Widget toolLayout.Widget2
-
- connect refresh.BoxChange smooth.BoxExecute
-
-#---------------------------------------------------------------------
-new LayoutSplit splitUp
- set splitUp.Proportion 50
- connect toolLayout.Widget splitUp.Widget1
- connect upLayout.Widget splitUp.Widget2
-
- connect slider.Widget sliderLayout.Widget1
- connect lowerThresholdSlider.Widget sliderLayout.Widget2
- connect upperThresholdSlider.Widget sliderLayout.Widget3
- connect smoothSlider.Widget sliderLayout.Widget4
-
+new Div div3
+ connect lowerOpacitySlider.Out div3.In1
+ set div3.In2 100
-new LayoutSplit mainSplit
- set mainSplit.Proportion 66
- set mainSplit.WinHeight 1200
- set mainSplit.WinWidth 1600
- set mainSplit.WinTitle "Processing / Viewing example (demoFiltering1.bbs) "
- connect splitUp.Widget mainSplit.Widget1
- connect downLayout.Widget mainSplit.Widget2
+new IsoSurfaceExtractor isoextractorSmooth
+ connect smooth.Out isoextractorSmooth.In
+ connect div3.Out isoextractorSmooth.Opacity
+ set isoextractorSmooth.Isovalue 200
+ connect colourSmooth.Out isoextractorSmooth.Colour
+ connect isoextractorSmooth.Out viewer3DSurfaceSmooth.In2
-#---------------------------------------------------------------------
+// Refresh issues
-exec isoextractorthreshold
-exec isoextractorsmooth
+new MultipleInputs multInForImageOriginal
+ connect sliceSlider.BoxChange multInForImageOriginal.In1
+# connect refresh.BoxChange multInForImageOriginal.In2
-exec mainSplit
+ new MultipleInputs multInForImageSegmented
+ connect lowerThresholdSlider.BoxChange multInForImageSegmented.In1
+ connect upperThresholdSlider.BoxChange multInForImageSegmented.In2
+# connect refresh.BoxChange multInForImageSegmented.In3
+ connect sliceSlider.BoxChange multInForImageSegmented.In4
+
+ new MultipleInputs multInForImageSmooth
+ connect lowerThresholdSlider.BoxChange multInForImageSmooth.In1
+ connect upperThresholdSlider.BoxChange multInForImageSmooth.In2
+ connect smoothSlider.BoxChange multInForImageSmooth.In3
+# connect refresh.BoxChange multInForImageSmooth.In4
+ connect sliceSlider.BoxChange multInForImageSmooth.In5
+
+ new MultipleInputs multInForSurfaceThreshold
+# connect refresh.BoxChange multInForSurfaceThreshold.In1
+ connect colourThreshold.BoxChange multInForSurfaceThreshold.In2
+ connect lowerThresholdSlider.BoxChange multInForSurfaceThreshold.In3
+ connect upperThresholdSlider.BoxChange multInForSurfaceThreshold.In4
+
+ new MultipleInputs multInForSurfaceSmooth
+# connect refresh.BoxChange multInForSurfaceSmooth.In1
+ connect lowerOpacitySlider.BoxChange multInForSurfaceSmooth.In1
+ connect colourSmooth.BoxChange multInForSurfaceSmooth.In2
+ connect lowerThresholdSlider.BoxChange multInForSurfaceSmooth.In3
+ connect upperThresholdSlider.BoxChange multInForSurfaceSmooth.In4
+ connect smoothSlider.BoxChange multInForSurfaceSmooth.In5
+
+ connect multInForImageOriginal.BoxChange viewer2DImageOriginal.BoxExecute
+ connect multInForImageSegmented.BoxChange viewer2DImageSegmented.BoxExecute
+ connect multInForImageSmooth.BoxChange viewer2DImageSmooth.BoxExecute
+
+ connect multInForSurfaceThreshold.BoxChange viewer3DSurfaceThreshold.BoxExecute
+ connect multInForSurfaceSmooth.BoxChange viewer3DSurfaceSmooth.BoxExecute
+
+
+
+ exec mainSplit