# Display vtkimage in 2D views

**URL:** https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891
**Category:** Development
**Created:** [January 21, 2020, 9:20am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891 "2020-01-21T09:20:08Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 21, 2020, 9:20am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/1 "2020-01-21T09:20:08Z")

</div>

I have a vtkImage data and I would like to display this data in my slicer 2D views

After run this code, I could find node in my Slicer  
However, I can not find image in my 2D views

And also, the in volume module the “Auto W/L” and “Threshold” section is deactivated.

This is my code,  
Is there any problem?

```
## read vtk object convert to vtkimage
result_image = hlp.vtk_grid2image("/Users/home/Desktop/Simulation/Simulation/SMA_full_0.vtk")
result_volume = slicer.vtkMRMLScalarVolumeNode()
result_volume.SetAndObserveImageData(result_image)

## image to 2D scene
defaultVolumeDisplayNode = slicer.mrmlScene.CreateNodeByClass("vtkMRMLScalarVolumeDisplayNode")
defaultVolumeDisplayNode.AutoWindowLevelOn()
defaultVolumeDisplayNode.SetVisibility(True)
defaultVolumeDisplayNode.AddWindowLevelPresetFromString("ColdToHotRainbow")
slicer.mrmlScene.AddDefaultNode(defaultVolumeDisplayNode)
result_volume.SetAndObserveDisplayNodeID(defaultVolumeDisplayNode.GetID())
defaultVolumeDisplayNode.SetInputImageDataConnection(result_volume.GetImageDataConnection())

## volume node set name
slicer.mrmlScene.AddNode(result_volume).SetName("simulation_result")
```

---

<div class="post-metadata">

### Author: ![Alex\_Vergara](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/alex_vergara/32/15205_2.png) [@Alex\_Vergara](https://discourse.slicer.org/u/Alex_Vergara)
#### Post date: [January 21, 2020, 9:24am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/2 "2020-01-21T09:24:00Z")

</div>

You can use this to display any Scalar Volume Node in Slicer

```python
def setSlicerViews(backgroundID, foregroundID):
    mainWindow = slicer.util.mainWindow()
    if mainWindow is not None:
        layoutManager = slicer.app.layoutManager()
        if layoutManager is not None:
            makeSlicerLinkedCompositeNodes()

            slicer.util.setSliceViewerLayers(background=backgroundID, foreground=foregroundID, foregroundOpacity=0.5)

            layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpView)
            slicer.util.resetSliceViews()

def makeSlicerLinkedCompositeNodes():
    # Set linked slice views in all existing slice composite nodes and in the default node
    sliceCompositeNodes = slicer.util.getNodesByClass('vtkMRMLSliceCompositeNode')
    defaultSliceCompositeNode = slicer.mrmlScene.GetDefaultNodeByClass('vtkMRMLSliceCompositeNode')
    if not defaultSliceCompositeNode:
        defaultSliceCompositeNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLSliceCompositeNode')
        slicer.mrmlScene.AddDefaultNode(defaultSliceCompositeNode)
    for sliceCompositeNode in sliceCompositeNodes:
        sliceCompositeNode.SetLinkedControl(True)
    defaultSliceCompositeNode.SetLinkedControl(True)

```

---

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 27, 2020, 5:53pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/3 "2020-01-27T17:53:03Z")

</div>

Thank you Alex

I tried your code, however, it is still not working  
In the volume module, the “Auto W/L” and “Threshold” section was still deactivated.

 ![스크린샷 2020-01-28 오전 2.51.41](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/b/b/bb2ab5e22d22fe776f37520c2463e9c72adb714f.gif)

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [January 27, 2020, 7:56pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/4 "2020-01-27T19:56:24Z")

</div>

> [@park](#):
>
> “Auto W/L” and “Threshold” section is deactivated

This happens when you don’t have a display node associated with your volume or the volume is invalid (no or empty vtkImageData).

Does calling `CreateDefaultDisplayNodes` on the volume node after it was added to the scene fix the problem?

Can you show what you have in “Volume Information” section?

---

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 29, 2020, 12:28pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/5 "2020-01-29T12:28:57Z")

</div>

Iassoan, Thank you for your reply

The vtkImageData is not empty because I made a volume rendering scene from this vtkImageData.  
(like figure below)

 ![스크린샷 2020-01-29 오후 9.25.56](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/5/1/51205b982ce097125ab467926ac8b74106c78882.gif)

And this is my Volume Information

 ![스크린샷 2020-01-29 오후 9.26.16](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/a/a/aa7e859ffb5902021aeb2623938dead9d1db03c2.gif)

---

<div class="post-metadata">

### Author: ![Alex\_Vergara](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/alex_vergara/32/15205_2.png) [@Alex\_Vergara](https://discourse.slicer.org/u/Alex_Vergara)
#### Post date: [January 29, 2020, 4:04pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/6 "2020-01-29T16:04:49Z")

</div>

After you do this

> [@park](#):
>
> result\_volume = slicer.vtkMRMLScalarVolumeNode()

you always need to do

```auto
result_volume.CreateDefaultDisplayNodes()

```

as @lassoan explained

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [January 29, 2020, 5:23pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/7 "2020-01-29T17:23:27Z")

</div>

Maybe the issue is that a volume rendering display node is created very early and therefore a regular volume display node is not created (since you already have display node). Creating the default scalar volume display node before creating any additional special display nodes should fix the problem.

---

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 30, 2020, 2:23am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/8 "2020-01-30T02:23:49Z")

</div>

Thanks for your reply

As your advise, I added “CreateDefaultDisplayNodes()”  
After added that the “Auto W/L” and “Threshold” section was activated

However, when I click the “visibility” in volume model  
Slicer program immediately turn off

 ![스크린샷 2020-01-30 오전 11.18.08](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/7/5/75ef44d6046fe3e5d0420f1dee32b44c5f203367.gif)

My code was written like this,  
Is there any problem?

```
 ## read vtk object convert to vtkimage
result_image = hlp.vtk_grid2image("/Users/home/Desktop/Simulation/Simulation/SMA_full_0.vtk")
result_volume = slicer.vtkMRMLScalarVolumeNode()
result_volume.SetAndObserveImageData(result_image)
result_volume.SetName("simulation_result")
slicer.mrmlScene.AddNode(result_volume)
result_volume.CreateDefaultDisplayNodes()

## image to 2D scene
displaynode = result_volume.GetScalarVolumeDisplayNode()
displaynode.AutoWindowLevelOff()
displaynode.SetWindowLevelMinMax(10,900)
displaynode.AddWindowLevelPresetFromString("ColdToHotRainbow")
# displaynode.SetInputImageDataConnection(result_volume.GetImageDataConnection())
displaynode.SetVisibility(True)
slicer.mrmlScene.AddDefaultNode(displaynode)
result_volume.SetAndObserveDisplayNodeID(displaynode.GetID())

```

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [January 30, 2020, 3:54am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/9 "2020-01-30T03:54:21Z")

</div>

The problem is in these lines:

> [@park](#):
>
> result\_image = hlp.vtk\_grid2image(“/Users/home/Desktop/Simulation/Simulation/SMA\_full\_0.vtk”) result\_volume = slicer.vtkMRMLScalarVolumeNode() result\_volume.SetAndObserveImageData(result\_image)

If you allocate memory in Python then you cannot transfer its ownership to a VTK class. If performance is extremely important and you work with enormous data sets then you may try to manually manage memory, but in general I would recommend to use `slicer.util.updateVolumeFromArray` to safely copy values from numpy array to vtkImageData in a volume node.

---

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 30, 2020, 7:15am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/10 "2020-01-30T07:15:37Z")

</div>

Finally It is work !!  
Thank you

However ,  
Why I could not see negative coordinate on this scene ?  
Is there any other code do I have to update ?

 ![스크린샷 2020-01-30 오후 4.13.26](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/c/b/cbcc0becf83fcf834cea2ebe0d5c6a9f87c4c503.gif)

```
## read vtk object convert to vtkimage
result_image, pressure = hlp.vtk_grid2image("/Users/home/Desktop/Simulation/Simulation/SMA_full_0.vtk")
dimension = result_image.GetDimensions()
reshapePressure = np.reshape(pressure, (dimension[2]-1,dimension[0]-1, dimension[1]-1))

result_volume = slicer.vtkMRMLScalarVolumeNode()
result_volume.SetAndObserveImageData(result_image)
slicer.util.updateVolumeFromArray(result_volume, reshapePressure)
result_volume.SetName("simulation_result")
slicer.mrmlScene.AddNode(result_volume)
result_volume.CreateDefaultDisplayNodes()

## image to 2D scene
displaynode = result_volume.GetScalarVolumeDisplayNode()
displaynode.AutoWindowLevelOff()
displaynode.SetWindowLevelMinMax(10,900)
displaynode.AddWindowLevelPresetFromString("ColdToHotRainbow")
# displaynode.SetInputImageDataConnection(result_volume.GetImageDataConnection())
displaynode.SetVisibility(True)
slicer.mrmlScene.AddDefaultNode(displaynode)
result_volume.SetAndObserveDisplayNodeID(displaynode.GetID())

```

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [January 30, 2020, 3:23pm UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/11 "2020-01-30T15:23:27Z")

</div>

> [@park](#):
>
> Why I could not see negative coordinate on this scene ?

Slice offset slider range is determined from the extent of the displayed background volume. If you have a single-slice volume then you will not be able to move away from it using the slider. You can use Shift + Mouse Move in other views or set a larger volume as background volume.

---

<div class="post-metadata">

### Author: ![park](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/park/32/5717_2.png) [@park](https://discourse.slicer.org/u/park)
#### Post date: [January 31, 2020, 1:47am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/12 "2020-01-31T01:47:54Z")

</div>

> [@lassoan](#):
>
> You can use Shift + Mouse Move in other views or set a larger volume as background volume.

How could I set extent in my volume node or make large background volume?  
I already set extent in “vtkimage.SetExtent()” but it seems like not working.

---

<div class="post-metadata">

### Author: ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)
#### Post date: [January 31, 2020, 2:11am UTC](https://discourse.slicer.org/t/display-vtkimage-in-2d-views/9891/13 "2020-01-31T02:11:01Z")

</div>

> [@park](#):
>
> I already set extent in “vtkimage.SetExtent()” but it seems like not working.

After calling `SetExent()` you need to call `AllocateScalars` (see example [here](https://www.slicer.org/wiki/Documentation/Nightly/ScriptRepository#Create_a_new_volume)). Of course reallocation clears current image content, so if you want to keep the image content then create a new image and resample the old image into that (an implementation of this is available in “Crop volume” module).
