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

Vicky bonsai19 at gmx.de
Mon Nov 3 13:28:12 EST 2008


Hallo Bill,

Thanks a lot for your help. But I think I have a logical flaw.

At first I have 160 semented bmp-images. I create one file per tissue 
(color). So I get 160 slices per tissue. I have convert these slices 
into binary images and then I have labeled those. So each pixel of each 
slice has an integer value.
I tried to read these binary labeled images but it doesn't work and I 
get the errors.

Why can't I read these labeled binary images?
I must still prepare these images?
How must I process the images so that my pipeline works?

It would be nice if you help me.

Best regards,
Vicky




Bill Lorensen schrieb:
> 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