|
| 1 | +--- |
| 2 | +layout: default |
| 3 | +title: Connected Threshold Growing Example |
| 4 | +nav_order: 2 |
| 5 | +grand_parent: IJ Plugins Toolkit |
| 6 | +parent: 3D Toolkit |
| 7 | +permalink: /docs/ijp-toolkit/3D-Toolkit/example-connected-threshold-growing |
| 8 | +--- |
| 9 | + |
| 10 | +## Connected Threshold Growing Example |
| 11 | + |
| 12 | + |
| 13 | +The Connected Threshold Growing plugin can be used to perform |
| 14 | + segmentation of 2D and 3D images. The plugin accepts 8 bit and 16 bit gray |
| 15 | + images. To perform segmentation you specify location of seed point (x,y,z), |
| 16 | + and minimum and maximum limits on pixel intensity. Segmented region will |
| 17 | + contain all pixels connected to the seed point which intensity is within |
| 18 | + minimum/maximum intensity limits.</p> |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +The example demonstrates segmentation of a 3D MRI image from |
| 23 | + <a href="http://www.bic.mni.mcgill.ca/brainweb/">BrainWeb Project</a>. |
| 24 | + Here is slices 31 of an image used in the example: |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +The image was segmented using only 7 seed points (white matter, gray |
| 29 | + matter, skull, left eye, left lens, right eye, and right lens). White and |
| 30 | + gray matter regions were combined before 3D rendering using ImageJ image |
| 31 | + calculator. |
| 32 | + (<a href="SmoothRender.java.html">SmoothRender.java</a>) |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +The above 3D rendering was performed using following Java code and VTK library: |
| 37 | + |
| 38 | +```java |
| 39 | +import vtk.*; |
| 40 | + |
| 41 | +import javax.swing.*; |
| 42 | +import java.awt.*; |
| 43 | +import java.awt.event.WindowAdapter; |
| 44 | +import java.awt.event.WindowEvent; |
| 45 | + |
| 46 | +public class SmoothRender extends JPanel { |
| 47 | + |
| 48 | + static { |
| 49 | + // Load VTK MarchingCubes library, rest is loaded by vtkPanel |
| 50 | + System.loadLibrary("vtkPatentedJava"); |
| 51 | + } |
| 52 | + |
| 53 | + private final String PREFIX = "/data/"; |
| 54 | + |
| 55 | + /** |
| 56 | + * Constructor. |
| 57 | + */ |
| 58 | + public SmoothRender() { |
| 59 | + // Setup VTK rendering panel |
| 60 | + vtkPanel renWin = new vtkPanel(); |
| 61 | + |
| 62 | + vtkRenderer ren = renWin.GetRenderer(); |
| 63 | + |
| 64 | + // Create actors for each segmented region |
| 65 | + |
| 66 | + vtkActor skullActor = createActor(PREFIX + "brainweb1_skull_smooth.vtk", 127, 0.5, 500); |
| 67 | + skullActor.GetProperty().SetOpacity(0.25); |
| 68 | + skullActor.GetProperty().SetColor(1, 1, 1); |
| 69 | + skullActor.GetProperty().SetDiffuse(0.75); |
| 70 | + skullActor.GetProperty().SetSpecular(0.75); |
| 71 | + ren.AddActor(skullActor); |
| 72 | + |
| 73 | + vtkActor brainActor = createActor(PREFIX + "brainweb1_both_matters.vtk", 127, 0.5, 500); |
| 74 | + brainActor.GetProperty().SetColor(0.9961, 0.75, 0.1); |
| 75 | + brainActor.GetProperty().SetSpecular(1); |
| 76 | + ren.AddActor(brainActor); |
| 77 | + |
| 78 | + vtkActor rightEyeActor = createActor(PREFIX + "brainweb1_right_eye.vtk", 127, 0.5, 500); |
| 79 | + rightEyeActor.GetProperty().SetColor(1, 1, 1); |
| 80 | + rightEyeActor.GetProperty().SetDiffuse(0.95); |
| 81 | + rightEyeActor.GetProperty().SetSpecular(0.1); |
| 82 | + ren.AddActor(rightEyeActor); |
| 83 | + |
| 84 | + vtkActor rightRetinaActor = createActor(PREFIX + "brainweb1_right_eye_lens.vtk", 127, 0.10, 100); |
| 85 | + rightRetinaActor.GetProperty().SetColor(0.1, 0.1, 0.1); |
| 86 | + rightRetinaActor.GetProperty().SetSpecular(1); |
| 87 | + ren.AddActor(rightRetinaActor); |
| 88 | + |
| 89 | + vtkActor leftEyeActor = createActor(PREFIX + "brainweb1_left_eye_smooth.vtk", 127, 0.5, 500); |
| 90 | + leftEyeActor.GetProperty().SetColor(1, 1, 1); |
| 91 | + leftEyeActor.GetProperty().SetDiffuse(0.95); |
| 92 | + leftEyeActor.GetProperty().SetSpecular(0.1); |
| 93 | + ren.AddActor(leftEyeActor); |
| 94 | + |
| 95 | + vtkActor leftRetinaActor = createActor(PREFIX + "brainweb1_left_eye_lens.vtk", 127, 0.10, 100); |
| 96 | + leftRetinaActor.GetProperty().SetColor(0.1, 0.1, 0.1); |
| 97 | + leftRetinaActor.GetProperty().SetSpecular(1); |
| 98 | + leftRetinaActor.GetProperty().SetSpecularPower(1); |
| 99 | + ren.AddActor(leftRetinaActor); |
| 100 | + |
| 101 | + // Place renWin in the center of this panel |
| 102 | + setLayout(new BorderLayout()); |
| 103 | + add(renWin, BorderLayout.CENTER); |
| 104 | + } |
| 105 | + |
| 106 | + /** |
| 107 | + * Load region data from a file and create its rendering pipeline. |
| 108 | + */ |
| 109 | + private vtkActor createActor(String fileName, |
| 110 | + int threshold, |
| 111 | + double targetReduction, |
| 112 | + int smoothingIterations) { |
| 113 | + vtkStructuredPointsReader reader = new vtkStructuredPointsReader(); |
| 114 | + reader.SetFileName(fileName); |
| 115 | + reader.Update(); |
| 116 | + |
| 117 | + vtkMarchingCubes surfaceExtractor = new vtkMarchingCubes(); |
| 118 | + surfaceExtractor.SetInput(reader.GetOutput()); |
| 119 | + surfaceExtractor.SetValue(0, threshold); |
| 120 | + surfaceExtractor.ComputeNormalsOn(); |
| 121 | + |
| 122 | + |
| 123 | + vtkDecimatePro deci = new vtkDecimatePro(); |
| 124 | + deci.SetInput(surfaceExtractor.GetOutput()); |
| 125 | + deci.SetTargetReduction(targetReduction); |
| 126 | + deci.PreserveTopologyOn(); |
| 127 | + |
| 128 | + vtkSmoothPolyDataFilter smoother = new vtkSmoothPolyDataFilter(); |
| 129 | + smoother.SetInput(deci.GetOutput()); |
| 130 | + smoother.SetNumberOfIterations(smoothingIterations); |
| 131 | + |
| 132 | + vtkPolyDataNormals normals = new vtkPolyDataNormals(); |
| 133 | + normals.SetInput(smoother.GetOutput()); |
| 134 | + normals.FlipNormalsOn(); |
| 135 | + |
| 136 | + vtkPolyDataMapper mapper = new vtkPolyDataMapper(); |
| 137 | + mapper.SetInput(normals.GetOutput()); |
| 138 | + mapper.ScalarVisibilityOff(); |
| 139 | + |
| 140 | + vtkActor actor = new vtkActor(); |
| 141 | + actor.SetMapper(mapper); |
| 142 | + |
| 143 | + return actor; |
| 144 | + } |
| 145 | + |
| 146 | + /** |
| 147 | + * |
| 148 | + */ |
| 149 | + public static void main(String[] args) { |
| 150 | + SmoothRender panel = new SmoothRender(); |
| 151 | + |
| 152 | + JFrame frame = new JFrame("SmoothRender"); |
| 153 | + frame.addWindowListener(new WindowAdapter() { |
| 154 | + public void windowClosing(WindowEvent e) { |
| 155 | + System.exit(0); |
| 156 | + } |
| 157 | + }); |
| 158 | + frame.getContentPane().add("Center", panel); |
| 159 | + frame.pack(); |
| 160 | + frame.setVisible(true); |
| 161 | + } |
| 162 | +} |
| 163 | +``` |
| 164 | + |
| 165 | + |
0 commit comments