1
+ using itk . simple ;
1
2
using System ;
3
+ using System . Runtime . InteropServices ;
2
4
using UnityEngine ;
3
5
4
6
namespace UnityVolumeRendering
@@ -8,14 +10,62 @@ public abstract class GradientComputator
8
10
protected float [ ] data ;
9
11
protected int dimX , dimY , dimZ ;
10
12
11
- public GradientComputator ( VolumeDataset dataset )
13
+ public GradientComputator ( VolumeDataset dataset , bool smootheDataValues )
12
14
{
13
15
this . data = dataset . data ;
14
16
this . dimX = dataset . dimX ;
15
17
this . dimY = dataset . dimY ;
16
18
this . dimZ = dataset . dimZ ;
19
+
20
+ if ( smootheDataValues )
21
+ {
22
+ #if UVR_USE_SIMPLEITK
23
+ Image image = new Image ( ( uint ) dimX , ( uint ) dimY , ( uint ) dimZ , PixelIDValueEnum . sitkFloat32 ) ;
24
+
25
+ for ( uint z = 0 ; z < dimZ ; z ++ )
26
+ {
27
+ for ( uint y = 0 ; y < dimY ; y ++ )
28
+ {
29
+ for ( uint x = 0 ; x < dimX ; x ++ )
30
+ {
31
+ float value = data [ x + y * dimX + z * ( dimX * dimY ) ] ;
32
+ image . SetPixelAsFloat ( new VectorUInt32 ( ) { x , y , z } , value ) ;
33
+ }
34
+ }
35
+ }
36
+
37
+ BilateralImageFilter filter = new BilateralImageFilter ( ) ;
38
+ image = filter . Execute ( image ) ;
39
+
40
+ this . data = new float [ data . Length ] ;
41
+ IntPtr imgBuffer = image . GetBufferAsFloat ( ) ;
42
+ Marshal . Copy ( imgBuffer , data , 0 , data . Length ) ;
43
+ #else
44
+ Debug . LogWarning ( "SimpleITK is required to generate smooth gradients." ) ;
45
+ #endif
46
+ }
17
47
}
18
48
19
49
public abstract Vector3 ComputeGradient ( int x , int y , int z , float minValue , float maxRange ) ;
20
50
}
51
+
52
+ public class GradientComputatorFactory
53
+ {
54
+ public static GradientComputator CreateGradientComputator ( VolumeDataset dataset , GradientType gradientType )
55
+ {
56
+ switch ( gradientType )
57
+ {
58
+ case GradientType . CentralDifference :
59
+ return new CentralDifferenceGradientComputator ( dataset , false ) ;
60
+ case GradientType . SmoothedCentralDifference :
61
+ return new CentralDifferenceGradientComputator ( dataset , true ) ;
62
+ case GradientType . Sobel :
63
+ return new SobelGradientComputator ( dataset , false ) ;
64
+ case GradientType . SmoothedSobel :
65
+ return new SobelGradientComputator ( dataset , true ) ;
66
+ default :
67
+ throw new NotImplementedException ( ) ;
68
+ }
69
+ }
70
+ }
21
71
}
0 commit comments