# Could VTK be used to re-construct colorful 3D using colorful CT images?

**URL:** https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605
**Category:** Development
**Created:** [November 9, 2020, 1:08am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605 "2020-11-09T01:08:20Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 9, 2020, 1:08am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/1 "2020-11-09T01:08:20Z")

</div>

Hi,

There are 300 colorful CT slice images. Could I use VTK to re-construct colorful 3D using those colorful CT images? Is there any example code for my reference?

Thanks and Best Regards,  
Ardeal

---

<div class="post-metadata">

### Author: ![lassoan](https://discourse.vtk.org/user_avatar/discourse.vtk.org/lassoan/32/50_2.png) [@lassoan](https://discourse.vtk.org/u/lassoan)
#### Post date: [November 9, 2020, 1:47am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/2 "2020-11-09T01:47:32Z")

</div>

Yes, VTK can render beautiful 4D (3D + color) RGB volumes. You can use any of the volume rendering examples, in the volume property set scalar opacity transfer function as usual, but instead of setting a color transfer function, set `IndependentComponents` to False. See this example:

[![](https://discourse.vtk.org/uploads/default/original/2X/8/8ac640e09cde13284bf86c99f252b753dd3c1ab9.jpeg "Color volume rendering") ](https://www.youtube.com/watch?v=o5I_XWkm1nk)

If you want to use a GUI to set up volume rendering then you can use 3D Slicer as explained in this post:

> **[Retain Image Color in Volume Rendering](https://discourse.slicer.org/t/retain-image-color-in-volume-rendering/12294/10?u=lassoan)**
>
> I’ve downloaded your images and used this script to convert it to add an alpha channel and enable direct RGBA volume rendering (just copy-paste it into Slicer’s Python console after you loaded your data set): # Find loaded vector volume...

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 9, 2020, 2:18am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/3 "2020-11-09T02:18:09Z")

</div>

Hi,  
Many thanks for your reply!  
Is there any complete example about the 4D(3D + color) volumes?  
I am sorry that I am not good at VTK, especially not good at 4D using VTK.

---

<div class="post-metadata">

### Author: ![lassoan](https://discourse.vtk.org/user_avatar/discourse.vtk.org/lassoan/32/50_2.png) [@lassoan](https://discourse.vtk.org/u/lassoan)
#### Post date: [November 9, 2020, 6:15pm UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/4 "2020-11-09T18:15:33Z")

</div>

There are a number of tests that shows how IndependentComponents=false can be used. If you create a small standalone example then it would be great if you could contribute to the [VTK examples site](https://gitlab.kitware.com/vtk/vtk-examples).

Since you work with CT images, it could make sense to use VTK in Slicer’s Python environment, because then you can get nice volume rendering using a few lines of Python code and/or set it up or adjust parameters using interactive GUI (if you need help using Slicer then post on the [Slicer forum](https://discourse.slicer.org/)).

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 10, 2020, 12:43am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/5 "2020-11-10T00:43:16Z")

</div>

Hi,

I could run 3D reconstruction, and my test code is on github:[https://github.com/ardeal/vtk\_4d\_ct](https://github.com/ardeal/vtk_4d_ct).  
The upper code only works on 3D.

I am very glad to contribute to VTK examples site. However the upper code doesn’t work on 4D.  
Could you help to tell me how to change the upper code to make it work on 4D(colorful CT slice images)?

Once it work, I will upload it to VTK examples site.

Thanks and Best Regards,  
Ardeal

---

<div class="post-metadata">

### Author: ![lassoan](https://discourse.vtk.org/user_avatar/discourse.vtk.org/lassoan/32/50_2.png) [@lassoan](https://discourse.vtk.org/u/lassoan)
#### Post date: [November 10, 2020, 12:54am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/6 "2020-11-10T00:54:17Z")

</div>

1. The single most-important thing for rendering RGB volumes is to set IndependentComponents to false. You don’t set that in your code.

2. Probably it is theoretically possible to save 3D RGB color volume in DICOM format but such images would be extremely rare. What software did produce the RGB volume (the “300 colorful CT slice images”)? What image format it is stored in?

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 10, 2020, 1:03am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/7 "2020-11-10T01:03:56Z")

</div>

I don’t know where to set IndependentComponents = flase. Could you help to change the code directly?

I use the CT to generate gray images which are then used to generate colorful images. The generated images are dicom format. I could read and display the colorful dicom images using pydicom successfully.

By the way, if Slicer you mentioned works for my colorful images, I am willing to try it. however I could not access it. Perhaps, there is something wrong with my network.

The following image is the dicom file plotted in pydicom:  
 ![image](https://discourse.vtk.org/uploads/default/original/2X/4/4c4ae2726b25484985c4cc3803164c192b9e7100.png)

---

<div class="post-metadata">

### Author: ![lassoan](https://discourse.vtk.org/user_avatar/discourse.vtk.org/lassoan/32/50_2.png) [@lassoan](https://discourse.vtk.org/u/lassoan)
#### Post date: [November 10, 2020, 2:45am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/8 "2020-11-10T02:45:18Z")

</div>

This looks like a plain scalar volume displayed with a color look-up-table. Since this is not a vector volume (a voxel is not RGB triplet but a simple scalar value), you can use any VTK medical volume rendering examples, as is, without disabling IndependentComponents. You can set up the blue-green-red coloring in the color transfer function.

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 10, 2020, 2:54am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/9 "2020-11-10T02:54:11Z")

</div>

Hi,  
No matter what the dicom file is, I would like to know how to set IndependentComponents=false.  
in my code: [https://github.com/ardeal/vtk\_4d\_ct](https://github.com/ardeal/vtk_4d_ct), Could you tell me where and how to set this property?

I pasted the code as follows:

```
int main(int argc, char *argv[])

```

{

```
const char * dirname = "D:\\aaa\\dicom\\1data\\PA0\\ST0\\SE1";

int clip = 0;

//------------------------------- Read DICOM images
vtkSmartPointer<vtkAlgorithm> reader = vtkSmartPointer<vtkAlgorithm>::New();
vtkSmartPointer<vtkImageData> input = vtkSmartPointer<vtkImageData>::New();
vtkSmartPointer<vtkDICOMImageReader> dicomReader = vtkSmartPointer<vtkDICOMImageReader>::New();
dicomReader->SetDirectoryName(dirname);
dicomReader->Update();
input = dicomReader->GetOutput();
reader = dicomReader;

//------------------------------- Set the colors.
vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
std::array<unsigned char, 4> skinColor{ { 255, 125, 64 } };
colors->SetColor("SkinColor", skinColor.data());
std::array<unsigned char, 4> bkg{ { 51, 77, 102, 255 } };
colors->SetColor("BkgColor", bkg.data());

//------------------------------- Skin 
// An isosurface, or contour value of 500 is known to correspond to the skin of the patient.
// The triangle stripper is used to create triangle strips from the isosurface; these render much faster on many systems.
vtkSmartPointer<vtkMarchingCubes> skinExtractor = vtkSmartPointer<vtkMarchingCubes>::New();
skinExtractor->SetInputConnection(reader->GetOutputPort());
skinExtractor->SetValue(0, 100);

vtkSmartPointer<vtkStripper> skinStripper = vtkSmartPointer<vtkStripper>::New();
skinStripper->SetInputConnection(skinExtractor->GetOutputPort());

vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinStripper->GetOutputPort());
skinMapper->ScalarVisibilityOff();

vtkSmartPointer<vtkActor> skin = vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);
skin->GetProperty()->SetDiffuseColor(colors->GetColor3d("SkinColor").GetData());
skin->GetProperty()->SetSpecular(.3);
skin->GetProperty()->SetSpecularPower(20);
skin->GetProperty()->SetOpacity(.5);

```

#if 1  
//------------------------------- Bone  
// An isosurface, or contour value of 1150 is known to correspond to the bone of the patient.  
// The triangle stripper is used to create triangle strips from the isosurface; these render much faster on may systems.  
vtkSmartPointer boneExtractor = vtkSmartPointer::New();  
boneExtractor-\>SetInputConnection(reader-\>GetOutputPort());  
boneExtractor-\>SetValue(0, 300);

```
vtkSmartPointer<vtkStripper> boneStripper = vtkSmartPointer<vtkStripper>::New();
boneStripper->SetInputConnection(boneExtractor->GetOutputPort());

vtkSmartPointer<vtkPolyDataMapper> boneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boneMapper->SetInputConnection(boneStripper->GetOutputPort());
boneMapper->ScalarVisibilityOff();

vtkSmartPointer<vtkActor> bone = vtkSmartPointer<vtkActor>::New();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(colors->GetColor3d("Ivory").GetData());

```

#endif

```
//------------------------------- Outline // An outline provides context around the data.
vtkSmartPointer<vtkOutlineFilter> outlineData = vtkSmartPointer<vtkOutlineFilter>::New();
outlineData->SetInputConnection(reader->GetOutputPort());

vtkSmartPointer<vtkPolyDataMapper> mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New();
mapOutline->SetInputConnection(outlineData->GetOutputPort());

vtkSmartPointer<vtkActor> outline = vtkSmartPointer<vtkActor>::New();
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(colors->GetColor3d("Black").GetData());

//------------------------------- camera
// It is convenient to create an initial view of the data. The FocalPoint and Position form a vector direction. Later on (ResetCamera() method)
// this vector is used to position the camera to look at the data in this direction.
vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New();
aCamera->SetViewUp(0, 0, -1);
aCamera->SetPosition(0, -1, 0);
aCamera->SetFocalPoint(0, 0, 0);
aCamera->ComputeViewPlaneNormal();
aCamera->Azimuth(30.0);
aCamera->Elevation(30.0);

//------------------------------- create winwow
// Create the renderer, the render window, and the interactor. 
// The renderer draws into the render window, the interactor enables mouse- and keyboard-based interaction with the data within the render window.
vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(aRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);

//------------------------------- display
// Actors are added to the renderer. An initial camera view is created. The Dolly() method moves the camera towards the FocalPoint, thereby enlarging the image.
//aRenderer->AddActor(outline);
//aRenderer->AddActor(skin);
aRenderer->AddActor(bone);
aRenderer->SetActiveCamera(aCamera);
aRenderer->ResetCamera();
aCamera->Dolly(1.5);

// Set a background color for the renderer and set the size of the render window (expressed in pixels).
aRenderer->SetBackground(colors->GetColor3d("BkgColor").GetData());
renWin->SetSize(640, 480);

// Note that when camera movement occurs (as it does in the Dolly() method), the clipping planes often need adjusting. Clipping planes consist of two planes: near and far along the view direction.
// The near plane clips out objects in front of the plane; the far plane clips out objects behind the plane. This way only what is drawn between the planes is actually rendered.
aRenderer->ResetCameraClippingRange();

// Initialize the event loop and then start it.
renWin->Render();
iren->Initialize();
iren->Start();

return EXIT_SUCCESS;

```

}

---

<div class="post-metadata">

### Author: ![lassoan](https://discourse.vtk.org/user_avatar/discourse.vtk.org/lassoan/32/50_2.png) [@lassoan](https://discourse.vtk.org/u/lassoan)
#### Post date: [November 10, 2020, 2:57am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/10 "2020-11-10T02:57:29Z")

</div>

IndependentComponents can be enabled/disabled in [volume property object](https://vtk.org/doc/nightly/html/classvtkVolumeProperty.html#a2534a6dc500be42c9a842d405c4ee0bb).

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 10, 2020, 3:03am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/11 "2020-11-10T03:03:59Z")

</div>

In my code, there isn’t such a property.  
the objects defined in my code are:

```
vtkSmartPointer<vtkMarchingCubes> skinExtractor = vtkSmartPointer<vtkMarchingCubes>::New();
vtkSmartPointer<vtkStripper> skinStripper = vtkSmartPointer<vtkStripper>::New();
vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> skin = vtkSmartPointer<vtkActor>::New();

```

Which should have this property?

---

<div class="post-metadata">

### Author: ![Gresliebear](https://discourse.vtk.org/user_avatar/discourse.vtk.org/gresliebear/32/2601_2.png) [@Gresliebear](https://discourse.vtk.org/u/Gresliebear)
#### Post date: [November 10, 2020, 8:01pm UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/12 "2020-11-10T20:01:41Z")

</div>

> [@Numpy 3D array into VTK data types for volume rendering?](https://discourse.vtk.org/t/numpy-3d-array-into-vtk-data-types-for-volume-rendering/3455):
>
> Hi, everyone I am attempting to convert 3D numpy array into volume rendering function in pythonVTK or C++ code of VTK. Data type conversion of numpy array data into 3D volumes is an issue for me, I cant seem to find an alternative to file formats or conversion to data file formats of VTK itself.

We have tried to volume render CT scans or DICOM files by going directly to numpy arrays and using pyvista. pyvista is python wrappings on top of C++ of VTK. Long term I think its better just learn C++ and make it work but for prototyping its possibly to accomplish.

![image](https://discourse.vtk.org/uploads/default/original/2X/1/1f9e6725b2673c40abadec18686814a56fe3fc52.png)

We have had success but there is still a lot of development required, I think to make the conversion of CT scans to 3D objects.

```
def displayer(numpy_mask):
  data_matrix = numpy_mask
  opacity = [0, 0, 0, 4, 8, 0, 0] 
  data = pv.wrap(data_matrix)

  pv.set_plot_theme("night")
  #print(type(data)) #pyvista.core.grid.UniformGrid'
  #print(dir(data)) #x = pickle.dumps(data) #print(x)
  #print(BytesIO(data))
  return data

```

if you ever want to talk [lesliemwubbel@gmail.com](mailto:lesliemwubbel@gmail.com)

---

<div class="post-metadata">

### Author: ![ardeal](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@ardeal](https://discourse.vtk.org/u/ardeal)
#### Post date: [November 11, 2020, 1:12am UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/13 "2020-11-11T01:12:39Z")

</div>

Hi,  
I don’t understand what you mean. I would like to re-construct 4D using colorful CT slice images. Do you mean that VTK doesn’t support re-construct 4D using colorful CT slice images?

You are going to re-construct 4D using the pyvista which is on the top of C++ of VTK. is my understanding correct?

---

<div class="post-metadata">

### Author: ![Gresliebear](https://discourse.vtk.org/user_avatar/discourse.vtk.org/gresliebear/32/2601_2.png) [@Gresliebear](https://discourse.vtk.org/u/Gresliebear)
#### Post date: [November 11, 2020, 3:06pm UTC](https://discourse.vtk.org/t/could-vtk-be-used-to-re-construct-colorful-3d-using-colorful-ct-images/4605/14 "2020-11-11T15:06:50Z")

</div>

yes what I am saying is it’s possible to create a 4D color CT slice images. like you can totally do it but I was recommending pyvista maybe could be a solution to get what you want.

to your question yes that is what I am saying
