F.A.S.T. Pulmonary

Their are 2 F.A.S.T. Pulmonary example applications (shown below). 

The first one demonstrates a more typical UI expereince for an Advanced Visualization application. The Clinical use case for this app would be to segment out multiple structures from a chest CT scan to answer a number of clinical questions about low dose lung nodule screening. This app will demonstrate a number of rendering techniques:

  1. Thin, Thick MIP, Thick Faded MIP
  2. Cutplanes for subcube visualization
  3. Oblique 2D Views

as well as how F.A.S.T. Interactive Segmentation can used to segment out :

  1. Lung Nodules
  2. Bronchial tree
  3. Pulmonary Vessel Tree (using a workflow built around Interactive Segmentation)

The second one demonstrates the use of 2 studies (current and prior). Beyond techniques demonstrated in the first app, the second app also shows

  1. Linking scrolling for two studies
  2. Combining measurements from two studies to calculate lesion changes.

User Interface for Lung App

This application workflow requires no global controls down the left hand side (viewport specific controls are on each viewport)

On the bottom is the mouse legend which depicts the current mouse actions per viewport (note that ctrl, shift and alt modifiers perform different actions, simply press the appropriate key and the mouse legend changed to show you what the action will be with that modifier key). All the basic operations are available, rotate, scroll, pan, zoom, etc.

FAST Pulmonary

The Nodule Detect Tab of the application consists of 4 viewports

  1. Left – Axial image very large to use for search and detectoin of nodules. The bottun on the viewoport will change betweeen Thin, 5mm Thick MIP and 5mm Thick Faded MIP views to search for nodules. Double clicking on any detected nodules automatically takes you to the Nodule Segment Tab centered at the click point.
  2. Top right – small Sagittal image for reference
  3. Center right – small Coronal image for reference
  4. Bottom right – small 3D image showing air borders (no segmentation) for reference

FAST Pulmonary

The Nodule Segment Tab of the application consists of 2 viewports

  1. Left – Oblique MPR centered on the Nodule Detect Click Point. Rotating spins this oblique viewport around the vertical axis. Segmenting of the nodule is easiest achieved from this view. Alt-left click and start by moving the mouse up and to the right, to segment more of hte nodule. From there adjust the mouse to get the object you wish (vertical movemetns adjusts the size of the growable object, horizintal movement expands or decreases the density reange of what wil be segmented) before letting the mouse button up.
  2. Right – 3D SubCube which will rotate about the Nodule Detect Click Point. It show the Interactive Segmentation and allows Free Hand Cut to clean up segmentation errors. Undo and Clear All buttons are present. Also a button to save the current segmentatoin info as a "finding" for the Report Tab

FAST Pulmonary

The Bronchial Segment Tab of the application consists of 2 viewports

  1. Left – Sagittal image for selecting start points to segment. Just like segmenting a nodule, select a point (near the trachea bifurcation into the left and right bronchial trees) and move the mouse up and to the right to begin segmenting. You will notice that if yo move to far to the right, the segmentation "leaks" into the lung tissue from the bronchial tree. Also if growing too "large" it may also leak, so finding the optimal point for the two dimensional search (that is different for each patient) is a difficult time consuming task made simple, accurate and fast by using interactive segmentation
  2. Right – 3D View with resulting segmentation

FAST Pulmonary

The Pulmonary Vessel Segment Tab of the application consistsUpdated code comments and cleaned up dead code in Cardiac apps. of 2 viewports

Segmenting the pulmonary vessels is a challenge. Using a simple grow with a HU range the segmentation leaks into the heart tissue since the density of the blood in the pulmanry vessel tree is exactly the same as the blood in the heart. So we created a workflow here to get just the pulmonary vessels. First the lung fields are segmented using simple HU Range Interactive Segmentation. Next a series of dilate and erode operations are used to find the blood density ranges left inside the lung fields and finally remove the tissue around the lung fields where it touches the chest wall.

  1. Left – Sagittal image for selecting start points to segment the lung fields. Just like the prior two segmentations.
  2. Right – 3D View with resulting segmentation. Toggle the first "on viewport" button to select pulmonary vessels from the lung fields segmented in the first step (after selecting that mode, click on the lung field to process). After this there are 4 new on viewport buttons. These allow you adjust the number of "open" and "close" operations that are performed (the default setting perform well on most cases, but for some patients you need to adjust these) click on the 5th button to finish the pulmonary segmentation and return to normal viewport control.

User Interface for Current Prior Lung App

FAST Pulmonary

The Current Prior Tab of the application consists of 2 viewports

  1. Left – Current Axial image
  2. Right – Prior Axial image
The images can be locked to scroll/pan/zoom synchronously.

The Dual Segment Tab is a 2x2 layout which matches the Nodule Segment Tab from the first App but repeated for both the current and Prior cases. And with the same controls.

Source code and interesting coding features in this example

View the source /foviaserver/public/apps/lung/lung.js or /foviaserver/public/apps/CurrentPriorLung/CurrentPriorLung.js

  • lung.html
    • Some core utilities are grabbed from the common directory
    • Segmentation mouse adapters are grabbed from the common directory, the source code exists there for you to see an example of how mouse motions can be utilized to perform interactive segmentation.
    • All the viewports are contained in “widget” HTML div elements that also utilize controls (buttons) right on the viewports. You can see how we used those, but you can create any controls any way you like.The viewports start out hidden and are made visible in the code depending on which tab is selected.
  • lung.js
    • window.onload() kicks off the processing
    • Simpler example apps discuss viewport creation, but here segmentation structures are created. In this example since arterial phase and venous phase cases are possible, two segmentation context structures could be created
    • The segEngines array is used to had the mouse adaptors the list of viewports that must be updated when segmentation changes, in this case all 4 viewports.
    • The segmentationContext utility function makeColorLabeledTFsfromWindowLevel is used to create the upper Render Ranges for the segmented labels.
    • g_processingSegOp is a global flag that keeps more mouse events from kicking off multiple segmentation operations until the prior operation is done (including rendering). It is decremented once rendering for any viewport is completed and incremented at the beginning of a seg operation to the number of viewports that will display the results of this segmentation.
    • Where other examples use SetSegLabel (from the left hand control radiobuttons) to setup different params for each seg type, here it is done in the workflow as you step from tab to tab in the Display functions
  • 2/3DViewport.js
    • This is a wrapper around HTMLViewport class from the SDK.
    • You can see how to change actions for mouse clicks
    • You can see how to draw overlays (e.g. text) over the images
    • The 2DSegViewport is different in that this one displays seg label maps on the 2D views also were the other does not.
  • OnViewportControls.js
    • Beyond just the buttons, the Pulmonary Vessel workflow described above is implemented here in the OVCNavigate* functions
    • And the Current/Prior Linking is enabeled in OVC_ToggleLink

To run the example, in the local URL localhost:8088/apps/lung or localhost:8088/apps/CurrentPriorLung, change “localhost” to your server IP address, and enter the URL into your browser.