[vtkusers] Help!!!!! VtkMarchingCubes::SetValue

Bill Lorensen bill.lorensen at gmail.com
Sun Nov 2 20:19:19 EST 2008


Your segmented files have rgb colors. The MC pipeline and DiscreteMC
assume your labels are single integer values like 1, 34, 87, ... not
an rgb color.

On Sun, Nov 2, 2008 at 6:40 PM, Vicky <bonsai19 at gmx.de> wrote:
> Hi Bill,
>
> thank you for your fast help.
>
> I set the value to 127.5 but I get no model anyway. No surface is generated
> using  vtkDiscreteMarchingCubes.
> I'm really desparate...
>
> When I run my script, I get the following errors:
>
>
> ERROR: In m:\dev\cur\vtkdotnet\branch\50\Graphics\vtkDecimatePro.cxx, line
> 161
> vtkDecimatePro (04042A88): No data to decimate!
>
> ERROR: In
> m:\dev\cur\vtkdotnet\branch\50\Graphics\vtkSmoothPolyDataFilter.cxx, line
> 212
> vtkSmoothPolyDataFilter (04053210): No data to smooth!
>
> ERROR: In m:\dev\cur\vtkdotnet\branch\50\Graphics\vtkPolyDataNormals.cxx,
> line 94
> vtkPolyDataNormals (040540D0): No data to generate normals for!
>
>
> I think that the segmented labeled images that I read are not correct. Or I
> can't read them.
>
> My proceeding to get labeled images is the following:
> I have 160 segmented bitmap-images available. Each file is 234 x 340.
> At first I built one file per tissue (color). Then I create (with matlab)
> binary labeled images for each tissue.
> For example, I'm going to assume there are 4 colors (red, green, blue,
> black) in a slice.Then I get 3 images, that I call {Red, Green, Blue}. So
> each of these images is a matrix full of 1's and 0's. If I bring the
> seperated images together again I have to change the 1's in something else
> so that I can distinguish the different tissues (colors).
>         Red = Red                  //leave as 1
>         Blue = 2 * Blue           //change to label 2
>         Green = 3 * Green;     //change to label 3
> Now if I add them together, different tissues have differnt labels.
> At this time I have binary labeled bitmap-images.
>
> I think a surface is extracted using the binary labeled images. But I get
> errors.
>
> What is wrong with my labeled images?
>
> This is how I read my data:
>
>               vtkBMPReader bmpReader = new vtkBMPReader();
>               bmpReader.SetDataExtent(0, 340, 0,234, 1, 160);
>               bmpReader.SetDataSpacing(dataSpacing);
>               bmpReader.SetFilePattern(imageVTK.data);
>               bmpReader.SetDataScalarTypeToUnsignedShort();
>               bmpReader.GetOutput().ReleaseDataFlagOn();
>               bmpReader.Update();
>
>               public vtkImageAlgorithm image;
>               image = bmpReader;
>
>
>
> Bill Lorensen schrieb:
>>
>> Vicky,
>>
>> In your example, Threshold selects segment label 1 and converts all
>> voxels to either 0 or 255. Using this pipeline you should always
>> select the isovalue to be midway between 0 and 255 (127.5). If you
>> want tosegment label 27 for example, threshold.SetBetween(27,27). But
>> the isovalue will still be 127.5.
>>
>> This method of creating surfaces from segemented data is old although
>> still valid. I would recommend using vtkDiscreteMarchingCubes to
>> generate surfaces from segmentation labels.
>>
>> But first, try the value of 127.5 and see how you like the results.
>>
>> Bill
>>
>> On Fri, Oct 31, 2008 at 6:34 AM, Vicky <bonsai19 at gmx.de> wrote:
>>
>>>
>>> Hi there,
>>>
>>> I'll be grateful if someone can help me out.
>>>
>>> I want to create models from segmented 2D images (slices).
>>> I have used code like the VTK frog-example from the book "Visualization
>>> Toolkit: An Object-Oriented Approach to 3D Graphics":
>>>
>>>          vtkImageThreshold threshold = new vtkImageThreshold();
>>>          threshold.ThresholdBetween(1,1);
>>>          threshold.SetInValue(255);
>>>          threshold.SetOutValue(0);
>>>          threshold.SetInput(image.GetOutput());
>>>
>>>          vtkImageShrink3D shrink = new vtkImageShrink3D();
>>>          shrink.SetInput(threshold.GetOutput());
>>>          shrink.SetShrinkFactors(shrinkFactor);
>>>          shrink.AveragingOn();
>>>
>>>          vtkImageGaussianSmooth gaussiansmooth = new
>>> vtkImageGaussianSmooth();
>>>          gaussiansmooth.SetDimensionality(3);
>>>          gaussiansmooth.SetStandardDeviation(gaussianStandardDeviation);
>>>          gaussiansmooth.SetInput(shrink.GetOutput());
>>>
>>>          vtkImageToStructuredPoints structuredPoints = new
>>> vtkImageToStructuredPoints();
>>>          structuredPoints.SetInput(gaussiansmooth.GetOutput());
>>>          structuredPoints.GetOutput().ReleaseDataFlagOn();
>>>
>>>          vtkMarchingCubes marchingCubes = new vtkMarchingCubes();
>>>          marchingCubes.SetInput(structuredPoints.GetOutput());
>>>          marchingCubes.ComputeScalarsOff();
>>>          marchingCubes.ComputeGradientsOff();
>>>          marchingCubes.ComputeNormalsOff();
>>>          marchingCubes.SetValue(0, 450);
>>>
>>>          vtkDecimatePro decimate = new vtkDecimatePro();
>>>          decimate.SetInput(marchingCubes.GetOutput());
>>>          decimate.SetFeatureAngle(60.0);
>>>          decimate.SetMaximumError(1);
>>>          decimate.SetTargetReduction(decimateReduction);
>>>          decimate.GetOutput().ReleaseDataFlagOn();
>>>
>>>          vtkSmoothPolyDataFilter smoother = new
>>> vtkSmoothPolyDataFilter();
>>>          smoother.SetInput(decimate.GetOutput());
>>>          smoother.SetNumberOfIterations(smoothIterations);
>>>          smoother.SetRelaxationFactor(RelaxionsFactor);
>>>          smoother.SetFeatureAngle(smoothAngle);
>>>          smoother.FeatureEdgeSmoothingOff();
>>>          smoother.SetConvergence(0);
>>>          smoother.GetOutput().ReleaseDataFlagOn();
>>>
>>>          vtkPolyDataNormals normals = new vtkPolyDataNormals();
>>>          normals.SetInput(smoother.GetOutput());
>>>          normals.SetFeatureAngle(featureAngle);
>>>          normals.GetOutput().ReleaseDataFlagOn();
>>>
>>>          vtkStripper stripper = new vtkStripper();
>>>          stripper.SetInput(normals.GetOutput());
>>>          stripper.GetOutput().ReleaseDataFlagOn();
>>>
>>>          vtkPolyDataWriter writer = new vtkPolyDataWriter();
>>>          writer.SetInput(stripper.GetOutput());
>>>          writer.SetFileName("Ratte_Lila.vtk");
>>>          writer.SetFileType(2);
>>>
>>>          ... and so on!
>>>
>>> I think the pipeline is correct
>>>
>>> But my problem is I can't determine which value is used in
>>> SetValue-function
>>> of the vtkMarchingCubes-class. I don't know how to calculate it.This
>>> value
>>> seems to be different to which tissue will be rendered. But how can I
>>> calculate this value for each tissue?
>>>
>>> I know the first parameter is the contour-number. Is this right?
>>>
>>>
>>> Can anyone help me?
>>> I'm using vtk 5.0
>>>
>>> Thanks!
>>>
>>> Vicky
>>> _______________________________________________
>>> This is the private VTK discussion list.
>>> Please keep messages on-topic. Check the FAQ at:
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>
>>>
>>
>>
>
>



More information about the vtkusers mailing list