diff --git a/mevislab.github.io/content/examples/image_processing/example6/DICOMRT.mlab b/mevislab.github.io/content/examples/image_processing/example6/DICOMRT.mlab new file mode 100644 index 000000000..88b0b92b4 --- /dev/null +++ b/mevislab.github.io/content/examples/image_processing/example6/DICOMRT.mlab @@ -0,0 +1,625 @@ +// MDL v1 utf8 +mevislabVersion = 4.1.1.2 +network { + watchlist = "" +} +module DicomImport { + internal { + frame = "545 613 144 56" + moduleGroupName = "" + showNetworkPanel = true + windows { + window _default { + geometry = "2855 261 722 632" + relativePosition = "0.1750 -0.2726" + sizeHint = "722 632" + wasOpen = no + } + } + } + fields { + instanceName = DicomImport + source = C:/Users/malfalahat/Downloads/DICOM_from_Varex + files = "" + inputMode = Directory + enableRecursiveSearch = TRUE + selectedItem = 8 + logLevel = Warning + useSortPartConfigFile = FALSE + sortPartConfigFile = "" + directSortPartConfiguration = "*( + {Element = (0008,0060); Name = Modality; Sort = 1; Part = 1; }, + {Element = (0008,0020); Name = StudyDate; Sort = 1; Part = 1; }, + {Element = (0008,0008); Name = ImageType; Sort = 1; Part = 1; }, + {Element = (0018,1030); Name = ProtocolName; Sort = 1; Part = 1; }, + {Element = (0018,0050); Name = SliceThickness; Sort = 1; Part = 1; Tolerance = 0.000005; }, + {Element = (0018,0080); Name = RepetitionTime; Sort = 1; Part = 1; }, + {Element = (0018,0082); Name = InversionTime; Sort = 1; Part = 1; }, + {Element = (0018,0091); Name = EchoTrainLength; Sort = 1; Part = 1; }, + {Element = (0018,1210); Name = ConvolutionKernel; Sort = 1; Part = 1; }, + {Element = (0018,1314); Name = FlipAngle; Sort = 1; Part = 1; }, + {Element = (0018,0015); Name = BodyPartExamined; Sort = 1; Part = 1; }, + {Element = (0028,0008); Name = NumberOfFrames; Sort = 1; Part = 1; }, + {Element = (0028,0010); Name = Rows; Sort = 1; Part = 1; }, + {Element = (0028,0011); Name = Columns; Sort = 1; Part = 1; }, + {Element = (0020,0037); Name = ImageOrientationPatient; Sort = 1; Part = 1; Tolerance = 0.000005; }, + {Element = (0018,1004); Name = PlateID; Sort = 1; Part = 1; }, + {Element = (0018,1000); Name = DeviceSerialNumber; Sort = 1; Part = 1; }, + {Element = (0028,0004); Name = PhotometricInterpretation; Sort = 1; Part = 1; }, + {Element = (0028,0100); Name = BitsAllocated; Sort = 1; Part = 1; }, + {Element = (0028,0102); Name = HighBit; Sort = 1; Part = 1; }, + {Element = (0028,0103); Name = PixelRepresentation; Sort = 1; Part = 1; }, + {Element = (0018,0020); Name = ScanningSequence; Sort = 1; Part = 1; }, + {Element = (0018,0023); Name = MRAcquisitionType; Sort = 1; Part = 1; }, + {Element = (0028,0030); Name = PixelSpacing; Sort = 1; Part = 1; Tolerance = 0.00001; }, + {Element = (0054,0010); Name = EnergyWindowVector; Sort = 1; Part = 1; }, + {Element = (0054,0030); Name = PhaseVector; Sort = 1; Part = 1; }, + {Element = (0054,0060); Name = RRIntervalVector; Sort = 1; Part = 1; }, + {Element = (0054,0050); Name = RotationVector; Sort = 1; Part = 1; }, + {Element = (0028,1101); Name = RedPaletteColorLookupTableDescriptor; Sort = 1; Part = 1; }, + {Element = (0028,1102); Name = GreenPaletteColorLookupTableDescriptor; Sort = 1; Part = 1; }, + {Element = (0028,1103); Name = BluePaletteColorLookupTableDescriptor; Sort = 1; Part = 1; }, + {Element = (0028,1201); Name = RedPaletteColorLookupTableData; Sort = 1; Part = 1; }, + {Element = (0028,1202); Name = GreenPaletteColorLookupTableData; Sort = 1; Part = 1; }, + {Element = (0028,1203); Name = BluePaletteColorLookupTableData; Sort = 1; Part = 1; }, + {Element = (0020,000e); Name = SeriesInstanceUID; Sort = 1; SortCondition = "Modality = NM & !(FrameIncrementPointer = '(0054,0010)')" Part = 1; PartCondition = "Modality = NM & !(FrameIncrementPointer = '(0054,0010)')"; }, + {Element = (0008,0018); Name = SOPInstanceUID; Sort = 1; SortCondition = "Modality = NM & NumberOfFrames > 1"; Part = 1; PartCondition = "Modality = NM & NumberOfFrames > 1"; }, + {Element = (0008,0018); Name = SOPInstanceUID; Sort = 1; SortCondition = "Modality = CR | Modality = DR | Modality = MG | Modality = MX | Modality = RG"; Part = 1; PartCondition = "Modality = CR | Modality = DR | Modality = MG | Modality = MX | Modality = RG"; }, + {Element = (0008,1090); Name = ManufacturerModelName; Sort = 1; Part = 1; }, + {Element = (0008,1010); Name = StationName; Sort = 1; Part = 1; }, + {Element = (0008,0070); Name = Manufacturer; Sort = 1; Part = 1; }, + {Element = (0018,0020); Name = ScanningSequence; Sort = 1; Part = 1; }, + {Element = (0018,0085); Name = ImagedNucleus; Sort = 1; Part = 1; }, + {Element = (0018,0087); Name = MagneticFieldStrength; Sort = 1; Part = 1; }, + {Element = (0018,1020); Name = SoftwareVersion; Sort = 1; Part = 1; }, + {Element = (0018,5100); Name = PatientPosition; Sort = 1; Part = 1; }, + {Element = (0062,000b); Name = ReferencedSegmentNumber; Sort = 1; SortCondition = "SOPClassUID = 1.2.840.10008.5.1.4.1.1.66.4"; Part = 1; PartCondition = "SOPClassUID = 1.2.840.10008.5.1.4.1.1.66.4"; }, + {Element = (0020,000e); Name = SeriesInstanceUID; Sort = 1; SortCondition = "SOPClassUID = 1.2.840.10008.5.1.4.1.1.66.4"; Part = 1; PartCondition = "SOPClassUID = 1.2.840.10008.5.1.4.1.1.66.4"; }, + {Element = (0020,0013); Name = InstanceNumber; Sort = 1; Part = 0; }, + {Element = (0008,0030); Name = StudyTime; Sort = 1; Part = 0; }, + {Element = (0020,0011); Name = SeriesNumber; Sort = 1; Part = 0; }, + {Element = (0008,0021); Name = SeriesDate; Sort = 1; Part = 0; }, + {Element = (0008,0031); Name = SeriesTime; Sort = 1; Part = 0; }, + {Element = (0018,0081); Name = EchoTime; Sort = 1; Part = 0; }, + {Element = (0018,0024); Name = SequenceName; Sort = 1; Part = 0; }, + {Element = (0020,0012); Name = AcquisitionNumber; Sort = 1; Part = 0; }, + {Element = (0018,0022); Name = ScanOptions; Sort = 1; Part = 0; }, + {Element = (0008,0022); Name = AcquisitionDate; Sort = 1; Part = 0; }, + {Element = (0008,0032); Name = AcquisitionTime; Sort = 1; Part = 0; }, + {Element = (0008,0023); Name = ContentDate; Sort = 1; Part = 0; }, + {Element = (0008,0033); Name = ContentTime; Sort = 1; Part = 0; }, + {Element = (0020,0032); Name = ImagePositionPatient; Sort = 1; Part = 0; }, + {Element = (0054,0020); Name = DetectorVector; Sort = 1; Part = 0; }, + {Element = (0054,0100); Name = TimeSliceVector; Sort = 1; Part = 0; }, + {Element = (0054,0070); Name = TimeSlotVector; Sort = 1; Part = 0; }, + {Element = (0054,0080); Name = SliceVector; Sort = 1; Part = 0; }, + {Element = (0054,0090); Name = AngularViewVector; Sort = 1; Part = 0; }, + {Element = (0020,9157); Name = DimensionIndexValues; Sort = 1; Part = 0; } +)*" + relativeDistanceTolerance = 0.25 + absoluteDistanceTolerance = 0.02 + positionToleranceInMM = 0.0999 + minimumNumberFramesInVolume = 10 + force2DPlusTCondition = "Modality == XA | Modality == US | Modality == RF" + splitTimePoints = FALSE + } +} +module View2D { + internal { + frame = "589 -11 120 56" + moduleGroupName = "" + windows { + window _default { + geometry = "2709 255 400 399" + relativePosition = "0.0151 -0.2778" + sizeHint = "400 400" + wasOpen = yes + } + } + } + fields { + instanceName = View2D + inventorInputOn = TRUE + inventorOutputOn = FALSE + view2DExtensionsOn = TRUE + startSlice = 89 + numSlices = 1 + numXSlices = 1 + sliceStep = 1 + slab = 1 + blendMode = BLEND_REPLACE + timePoint = 0 + maxTimePoint = 0 + filterMode = FILTER_LINEAR + standardKeys = TRUE + cineMode = CINE_ZT + cineDirection = CINE_FORWARD + cineRepeat = CINE_ONCE + cineSpeed = 0.1 + cineAlwaysReset = TRUE + snapToCenter = TRUE + zoomMode = VIEW2D_AUTO_ZOOM + unzoomOnImageChange = FALSE + sliceZoom = 1 + sliceZoomSynced = 1 + baseColor = "1 1 1" + margin = "2 2" + sliceOrigin = "0 0" + useShaders = TRUE + useManagedInteraction = FALSE + lutCenter = 397284480 + lutWidth = 794568768 + annotationOn = TRUE + annotationMode = ANNO_MODE_AUTO + annotationSizeMode = ANNO_SHOW_DETAILED + annotationCol = "0.899999976158142 0.899999976158142 0.899999976158142" + annotationFontSize = ANNO_SIZE_AUTO + annoCoords = Voxel + annoCTValue = AsIs + borderOn = FALSE + borderColor = "0.899999976158142 0.899999976158142 0.899999976158142" + valueHighPrecision = TRUE + maxPrecision = 4 + enableSlicing = TRUE + showColorChannelValues = FALSE + colorChannelSeparator = " / " + useRelativeLUTIfNoInputImage = TRUE + } +} +module DicomImportExtraOutput { + internal { + frame = "729 389 208 72" + moduleGroupName = "" + showNetworkPanel = true + windows { + window _default { + geometry = "2539 413 399 35" + relativePosition = "-0.0734 -0.1406" + sizeHint = "397 35" + wasOpen = no + } + } + } + fields { + instanceName = DicomImportExtraOutput + selectedItem = 6 + } +} +module ExtractRTStruct { + internal { + frame = "757 229 152 56" + moduleGroupName = "" + showNetworkPanel = true + } + fields { + instanceName = ExtractRTStruct + maxPointDistance = 0 + levelPlanarCSOs = TRUE + updateMode = AUTO_UPDATE + } +} +module SoView2DCSOExtensibleEditor { + internal { + frame = "765 109 200 56" + moduleGroupName = "" + windows { + window _default { + geometry = "2683 443 392 375" + relativePosition = "-0.0005 -0.1146" + sizeHint = "392 375" + wasOpen = no + } + } + } + fields { + instanceName = SoView2DCSOExtensibleEditor + interactionProviderID = "" + drawingOn = TRUE + editingOn = TRUE + fixZOn = TRUE + color = "1 1 1" + selectionTolerance = 16 + needsValidVoxel = FALSE + button1 = PRESSED + button2 = IGNORED + button3 = IGNORED + shift = IGNORED + control = IGNORED + alt = IGNORED + wantsAllEvents = FALSE + wantsKeyEvents = FALSE + wantsMouseWheelEvents = FALSE + setEventHandled = FALSE + ignoreHandledEvents = FALSE + createNewMode = FALSE + renderOnSlab = FALSE + clipToSlice = FALSE + cursorShape = UNDEFINED_CURSOR + creatorExtensionId = __default + alwaysCreateNewCSOs = FALSE + alwaysModifyExistingCSOs = FALSE + keyCommandsEnabled = TRUE + enableRemoveAll = FALSE + interactOnlyWithSelectedCSO = FALSE + renderLeftOverCSOsWithDefaultRenderer = TRUE + allowSelectionWithDefaultRenderer = TRUE + renderCSOsOnImagesDependingOnCreationMode = ON_ALL_IMAGES + updateCSOIdUnderMouseCursor = FALSE + accumulateTransformations = TRUE + updateImageStatisticsOnFinishInteraction = FALSE + } +} +module CSOLabelRenderer { + internal { + frame = "953 229 144 56" + moduleGroupName = "" + windows { + window _default { + geometry = "2525 218 453 584" + relativePosition = "-0.0667 -0.3099" + sizeHint = "453 584" + wasOpen = no + } + } + } + fields { + instanceName = CSOLabelRenderer + extensionId = labelRenderer + allowModification = TRUE + shouldRender = TRUE + shouldDrawLabelBorderForSelectedCSO = TRUE + labelBorderMarginX = 2 + labelBorderMarginY = 2 + currentCSOId = 4501 + labelName = "name " + labelCaption = "" + labelString = PTVRing + labelCode = "labelString = cso.getId() +labelName = 'name ' + cso.getLabel() +labelString = cso.getGroupAt(0).getLabel() +deviceOffsetX = 0 +deviceOffsetY = 0" + shouldRenderLabelName = TRUE + shouldDrawConnectingLine = FALSE + shouldHighlightBorderOnMouseOver = TRUE + connectingLineAlpha = 0.40000001 + minConnectingLineLength = 3 + drawConnectingLineToCenterOfCSO = FALSE + deviceOffsetX = 0 + deviceOffsetY = 0 + fontSize = 12 + movePossible = OPEN_HAND_CURSOR + movePerform = CLOSED_HAND_CURSOR + scaleNCursor = MOVE_VERT_CURSOR + scaleNWCursor = MOVE_FDIAG_CURSOR + scaleWCursor = MOVE_HORI_CURSOR + scaleSWCursor = MOVE_BDIAG_CURSOR + scaleSCursor = MOVE_VERT_CURSOR + scaleSECursor = MOVE_FDIAG_CURSOR + scaleECursor = MOVE_HORI_CURSOR + scaleNECursor = MOVE_BDIAG_CURSOR + allowLabelResize = FALSE + shouldDrawResizeHandlers = FALSE + userData0 = "" + userData1 = "" + userData2 = "" + userData3 = "" + userData4 = "" + userData5 = "" + userData6 = "" + userData7 = "" + tryToPlaceLabelsWithoutOverlap = FALSE + detachedLabelPlacement = RelativeToCSO + viewerBorderHandling = ClampToViewerBorder + inputInfoCSOId = -1 + inputInfoViewerId = "" + shouldShowLabelStringOfOutputInfoLabel = TRUE + } +} +module SoCSO3DRenderer { + internal { + frame = "1025 93 144 56" + moduleGroupName = "" + } + fields { + instanceName = SoCSO3DRenderer + interactionProviderID = "" + autoApply = TRUE + pathPointWidthOffset = 0 + seedPointSizeScaling = 1 + highlightSelectedGroups = TRUE + useRenderTimeDelay = FALSE + timerDelayMilliSeconds = 100 + useStylePalette = FALSE + useLUT = FALSE + stylePaletteUseIndexAs = USE_INDEX_FOR_CSO + enableSelection = FALSE + performPreHitTest = FALSE + cursorShape = POINTING_HAND_CURSOR + listenToRepaintNotifications = FALSE + listenToFinishingNotifications = TRUE + listenToSelectionChangedNotifications = TRUE + provideVertexProperties = FALSE + timepointToRender = -1 + } +} +module SoExaminerViewer { + internal { + frame = "1029 -27 136 56" + moduleGroupName = "" + windows { + window _viewer { + geometry = "2014 228 400 400" + relativePosition = "-0.3469 -0.3012" + sizeHint = "400 400" + wasOpen = no + } + } + } + fields { + instanceName = SoExaminerViewer + renderCaching = AUTO + boundingBoxCaching = AUTO + renderCulling = AUTO + pickCulling = AUTO + border = FALSE + background = "0 0 0" + transparency = BLEND + antialiasing = FALSE + antialiasingNumPasses = 1 + useSampleBuffers = FALSE + numSamples = 8 + grabKeyFocus = TRUE + enableKeyCommands = TRUE + snapshotFormat = SNAPSHOT_RGB + outputAviFile = "" + autoRedrawWhenRecording = TRUE + frameRate = 7 + frameRateAvi = 15 + outputSnapshotFile = none + outputSnapshotFileWritten = none + autoIncreaseFile = TRUE + showSnapshotWithShell = FALSE + snapCount = 0 + inputDevicesList = "" + headlight = TRUE + decoration = TRUE + popupMenuEnabled = FALSE + viewing = TRUE + autoClipping = TRUE + drawStyle = VIEW_AS_IS + interactiveDrawStyle = VIEW_LOW_COMPLEXITY + viewAllFlag = FALSE + initialCameraOrientation = CAMERA_KEEP_AS_IS + applyCameraOrientation = CAMERA_KEEP_AS_IS + cameraType = CAMERA_PERSPECTIVE + autoApplyUserSettingOrientation = FALSE + userSettingOrientation = "0 0 1 0" + automaticViewAll = FALSE + storeCurrentState = TRUE + saveCamera = TRUE + cursor = TRUE + isCameraStored = TRUE + perspective = TRUE + stereoViewing = FALSE + stereoOffset = 3 + height = 0.78539819 + position = "-584.030151367188 -543.745544433594 -132.615020751953" + orientation = "0.877203702926636 -0.347087979316711 -0.331728011369705 1.80854225158691" + nearDistance = 501.30063 + farDistance = 1174.1635 + focalDistance = 837.39618 + forceRedrawOnInteraction = FALSE + button1events = TO_VIEWER + button2events = TO_VIEWER + button3events = TO_VIEWER + keyEvents = TO_VIEWER + animationEnabled = FALSE + feedback = FALSE + feedbackSize = 32 + mouseInteraction = "" + rotationAxis = "0 1 0" + rotationAngle = 360 + rotationSteps = 80 + recordRotation = TRUE + wheelZoomEnabled = TRUE + wheelRotationEnabled = TRUE + } +} +module DicomImportExtraOutput { + internal { + frame = "197 501 216 72" + moduleGroupName = "" + showNetworkPanel = true + windows { + window _default { + geometry = "2600 689 397 35" + relativePosition = "-0.0422 0.0990" + sizeHint = "395 35" + wasOpen = yes + } + } + } + fields { + instanceName = DicomImportExtraOutput1 + selectedItem = 8 + } +} +module MinMaxScan { + internal { + frame = "189 285 168 72" + moduleGroupName = "" + showNetworkPanel = true + windows { + window _default { + geometry = "2655 473 472 314" + relativePosition = "0.0057 -0.0885" + sizeHint = "449 314" + wasOpen = no + } + } + } + fields { + instanceName = MinMaxScan + updateMode = AutoUpdate + typeSelect = "Proposed Data Type" + preferredIntType = PreferUnsigned + } +} +module Histogram { + internal { + frame = "225 173 128 56" + moduleGroupName = "" + showNetworkPanel = true + windows { + window _default { + geometry = "2675 448 409 364" + relativePosition = "0.0000 -0.1102" + sizeHint = "409 364" + wasOpen = no + } + } + } + fields { + instanceName = Histogram1 + useMask = TRUE + xRange = "Image Min/Max" + maskMode = Weights + curveType = Line + curveStyle = 0 + curveTitle = "" + updateMode = Off + useStepFunction = FALSE + useZeroAsBinCenter = TRUE + useBackgroundValue = FALSE + backgroundValue = 0 + binSize = 1 + maxBinCount = 25000000 + } +} +module SoView2DOverlay { + internal { + frame = "405 261 168 56" + moduleGroupName = "" + showNetworkPanel = true + } + fields { + instanceName = SoView2DOverlay + interactionProviderID = "" + drawingOn = TRUE + editingOn = TRUE + fixZOn = TRUE + color = "1 1 1" + selectionTolerance = 4 + needsValidVoxel = TRUE + button1 = IGNORED + button2 = IGNORED + button3 = IGNORED + shift = IGNORED + control = IGNORED + alt = IGNORED + wantsAllEvents = TRUE + wantsKeyEvents = TRUE + wantsMouseWheelEvents = FALSE + setEventHandled = FALSE + ignoreHandledEvents = FALSE + createNewMode = FALSE + renderOnSlab = TRUE + clipToSlice = TRUE + cursorShape = UNDEFINED_CURSOR + overlayName = "" + cacheTextures = TRUE + blendMode = BLEND_ADD + overwriteCurrentTimePoint = FALSE + timePoint = 0 + maxTimePoint = 0 + filterMode = FILTER_LINEAR + inheritFilterMode = TRUE + lutPrecision = VIEW2D_LUT_AUTO + alphaFactor = 1 + baseColor = "1 1 1" + useWorldCoords = TRUE + applyLut = TRUE + isCheckerTiling = FALSE + checkerTileSize = 2 + areCheckerTilesInverted = FALSE + } +} +module SoLUTEditor { + internal { + frame = "261 85 104 56" + moduleGroupName = "" + windows { + window _default { + geometry = "2305 745 484 459" + relativePosition = "-0.1734 0.1476" + sizeHint = "513 459" + wasOpen = no + } + } + } + fields { + instanceName = SoLUTEditor + rangeMin = 0 + rangeMax = 1092000 + viewMin = 0 + viewMax = 1092000 + window = 1 + level = 0.5 + allowNewPoints = TRUE + updateLutWhileDragging = TRUE + relativeLut = FALSE + colorInterpolation = InterpolateRGB + colorPoints = "[ 0 0 0 0, 239707.3125 0 0.666666984558105 0.49803900718689, 566581 0 1 0.49803900718689, 932199 1 0.333332985639572 1, 1092000 1 1 1 ]" + alphaPoints = "[ 0 0.294479012489319, 239707.3125 0.607361972332001, 566581 0.932515025138855, 932199 1, 1092000 1 ]" + alphaFactor = 1 + newRangeMin = 0 + newRangeMax = 4095 + newRangeMode = ClipFormerLUT + colorEditorHeight = 24 + showColorEditor = TRUE + showAlphaEditor = TRUE + markerRadius = 4 + selectedMarkerRadius = 6 + snapMarkerRadius = 10 + alphaLineWidth = 2 + backgroundColor = "0.800000011920929 0.800000011920929 0.800000011920929" + marginColor = "0.830999970436096 0.815999984741211 0.783999979496002" + borderColor = "0 0 0" + alphaLineColor = "0 0 0" + histogramColor = "0.400000005960464 0.400000005960464 0.400000005960464" + drawColoredMarkers = TRUE + markerColor = "1 1 1" + selectedMarkerColor = "1 0.5 0.5" + selectedTriangleSize = 8 + triangleSize = 6 + useAntiAliasing = TRUE + } +} +module SoGroup { + internal { + frame = "449 45 80 56" + moduleGroupName = "" + } + fields { + instanceName = SoGroup + } +} +connections { + View2D.inImage = DicomImport.output0 + View2D.inInvPreLUT = SoGroup.self + View2D.inInvPostLUT = SoView2DCSOExtensibleEditor.self + DicomImportExtraOutput.inImportResult = DicomImport.outImportResult + ExtractRTStruct.inDicom = DicomImportExtraOutput.outDicomTree + SoView2DCSOExtensibleEditor.inCSOList = ExtractRTStruct.outCSOList + SoView2DCSOExtensibleEditor.inExtensions = CSOLabelRenderer.outScene + SoCSO3DRenderer.inCSOList = ExtractRTStruct.outCSOList + SoExaminerViewer.children = SoCSO3DRenderer.self + DicomImportExtraOutput1.inImportResult = DicomImport.outImportResult + MinMaxScan.input0 = DicomImportExtraOutput1.output0 + Histogram1.input0 = MinMaxScan.output0 + SoView2DOverlay.image = DicomImportExtraOutput1.output0 + SoLUTEditor.inHistogram = Histogram1.outputHistogramCurve + SoGroup.children = "SoLUTEditor.outInventorLUT SoView2DOverlay.self" +} +networkModel = "" diff --git a/mevislab.github.io/content/examples/image_processing/example6/panelDicomImport.png b/mevislab.github.io/content/examples/image_processing/example6/panelDicomImport.png new file mode 100644 index 000000000..c09703515 Binary files /dev/null and b/mevislab.github.io/content/examples/image_processing/example6/panelDicomImport.png differ diff --git a/mevislab.github.io/content/tutorials/image_processing/image_processing6.md b/mevislab.github.io/content/tutorials/image_processing/image_processing6.md new file mode 100644 index 000000000..193d5f640 --- /dev/null +++ b/mevislab.github.io/content/tutorials/image_processing/image_processing6.md @@ -0,0 +1,170 @@ +--- +title: "Example 6: DICOM RT Visualization in MeVisLab – RTSTRUCT and RTDOSE Workflow" +date: 2025-05-05 +status: "OK" +draft: false +weight: 630 +tags: ["Advanced", "Tutorial", "Image Processing", "DICOM", "RTSTRUCT", "RTDOSE", "RTPLAN"] +menu: + main: + identifier: "imageprocessing6" + title: "Step-by-Step Guide to Loading and Visualizing DICOM RT Data (RTSTRUCT & RTDOSE) in MeVisLab." + weight: 630 + parent: "imageprocessing" +--- + +# Example 6: DICOM RT Visualization in MeVisLab – RTSTRUCT and RTDOSE Workflow + +## Introduction +This tutorial explains how to load and visualize DICOM RT data in MeVisLab step by step. You will learn how to: +* Load CT and related RTSTRUCT data. +* Visualize RTSTRUCTs as colored CSOs. +* Visualize RTDOSE as a colored overlay. +* Show labels next to each RTSTRUCT contour. +We use the `ExtractRTStruct`module for this example. + +**DICOM RT (Radiotherapy)** files are essential in radiotherapy treatment planning. They include: +* **RTSTRUCT**: Defines contours of tumors and organs. +* **RTDOSE**: Shows planned 3D dose distribution. +* **RTPLAN**: Contains treatment plan details like beams and dose settings. +Together, they ensure accurate and safe radiotherapy delivery. + +## Prepare your network +First, we need to download the ZIP file at **DICOM patient export** from: + +https://medicalaffairs.varian.com/headandneckbilat-imrtsx2 + +It contains the CT, RTSTRUCT, and RTDOSE files needed for this tutorial to work correctly in MeVisLab. + +{{}} +This data is FOR EDUCATIONAL AND SCIENTIFIC EXCHANGE ONLY – NOT FOR SALES OR PROMOTIONAL USE. +{{}} + +Create a new folder named *DICOM_FILES*. Extract the ZIP file into this folder. + +We will use it in this tutorial. + +Add the module `DicomImport` to your workspace. + +!["DicomImport](/images/tutorials/image_processing/Dicommm.png "DicomImport") + +Then click Browse and select the new folder named *DICOM_FILES* where you copied the content of the ZIP file earlier, then press Import. You can see it in the below figure: + +![Importing DICOM RT Data from the DICOM_FILES Folder](/images/tutorials/image_processing/Import.png "Importing DICOM RT Data from the DICOM_FILES Folder") + +Now add a `View2D` module and connect it to `DicomImport`. + +As shown in the Data Tree (middle pane), the imported DICOM RT structure includes: + +* **eByLuKOZoWxBUrIW** – An anonymized Patient ID. + +* **0000-00-00** – Missing or anonymized Birth/Study Date. + +When you expand the tree view you will see: + + * **RTPLAN** – Treatment plan metadata (no image). + * **RTSTRUCT** – Contour data (e.g., organs, tumors; no image). + * **CT 512×512×272×1** – The full CT scan volume (visible anatomy). + * **RTDOSE 199×115×147×1** – The 3D dose distribution (dose grid). + +After connecting, open the `View2D` and click on each of these items to visualize the corresponding data in the viewer, as shown in the figures below. + +{{< imagegallery 4 "/images/tutorials/image_processing/" "RTPLAN" "RTSTRUCT" "CT512" "RTDOSE">}} + +Select the CT 512×512×272×1 series. +We now want to view the CT images and the RTSTRUCT data together. The module `DicomImport` only allows to select one single object. In order to select more than one object, we use a `DicomImportExtraOutput` module. Select the CT series in the `DicomImport` module and the RTSTRUCT in the `DicomImportExtraOutput` module. + +You have to select the correct index for the RTSTRUCT. In our example it is index 2. + +Add `DicomImportExtraOutput` module as shown in the figure below: + +![Selecting CT and RTSTRUCT in DicomImport](/images/tutorials/image_processing/SELECTINGCTRTSTRUCT.png "Selecting CT and RTSTRUCT in DicomImport") + +### **Visualize RTSTRUCTs as colored CSOs:** + +Now we need an `ExtractRTStruct` module to convert RTSTRUCT data into CSOs (Contour Segmentation Objects). CSOs allow MeVisLab to visualize the contours on the CT scan and to interact with them. + +Then connect it with the `DicomImportExtraOutput` as shown in the figure: + +![ExtractRTStruct vonverter](/images/tutorials/image_processing/converter.png "ExtractRTStruct converter") + + +Add `SoView2DCSOExtensibleEditor` to enable visualization and interaction with the CSOs in the 2D viewer, allowing you to edit and work with the contours directly. Connect it with `View2D` and `ExtractRTStruct` modules, as shown, where `View2D` displays the CT scan with the contours. + +![Connecting SoView2DCSOExtensibleEditor](/images/tutorials/image_processing/cotour.png "Connecting SoView2DCSOExtensibleEditor") + +There are no names for the contours by default, we want to show the names for the contour to identify the segmented structure, so we need the `CSOLabelRenderer` module to add labels (e.g., 'Bladder', 'Prostate') next to each contour, helping to clearly identify the anatomy. The figure below shows that: + +![CSOLabelRenderer](/images/tutorials/image_processing/CSOLabelRenderer.png " CSOLabelRenderer") + +As you can see, the contours are labeled with numbers. We want to show the names for the contour to identify the segmented structure. To do this, open the `CSOLabelRenderer` panel — it will display the panel shown below. + + +![CSOLabelRenderer panel](/images/tutorials/image_processing/CSOLabelRendererpanel.png "CSOLabelRenderer panel") + +Now, add this line to make the numbers names for the contour: +{{< highlight >}} +```Python +labelString = cso.getGroupAt(0).getLabel() +``` +{{}} + +Then press apply. You can see the names of the structures next to the contours. + +![Edited CSOLabelRenderer Panel](/images/tutorials/image_processing/contournamed.png " Edited CSOLabelRenderer Panel") + +### **3D Visualization of Contours Using `SoExaminerViewer`** + +If you want to visualize the contours in 3D, follow these steps: + +Add the `SoCSO3DRenderer` module and connect it to the `ExtractRTStruct` module. The `SoCSO3DRenderer` will render the contours (CSOs) in the 3D space. + +Add the `SoExaminerViewer` module and connect it to the `SoCSO3DRenderer` module. The `SoExaminerViewer` will allow you to view the 3D contours. You can rotate, zoom, and move around the 3D image. + +The following figure shows the network and the result: + +![3D Visualization of Contours Using SoExaminerViewe](/images/tutorials/image_processing/3D.png "3D Visualization of Contours Using SoExaminerViewe") + +### **Visualizing RTDOSE as a Color Overlay Using LUT** + +Now we need to add another `DicomImportExtraOutput` module to import multiple DICOM objects. You have to select the right index for the example it is index 4 thats mean RTDOSE 199*115*147*1 . Add `MinMaxScan` module to scan the input image and updates the minimum and maximum values of the output image, and connect it with the `DicomImportExtraOutput`. + +![Importing RTDOSE Data and Applying MinMaxScan for Image Normalization](/images/tutorials/image_processing/minmaxscan.png "Importing RTDOSE Data and Applying MinMaxScan for Image Normalization") + +Add `Histogram` module to calculate the image's intensity distribution, and connect it with `MinMaxScan`. + +The `Histogram` module computes the image's intensity distribution, and is connected to the `SoLUTEditor` module to modify the lookup table (LUT). The LUT is then passed to the `SoGroup` module, which is connected to the `SoView2DOverlay` module to blend the 2D image overlay in a 2D viewer. The `SoLUTEditor` module allows interactive editing of the LUT, while `SoView2DOverlay` module facilitates overlaying the modified image in a 2D scene. + +Note that the `SoView2DOverlay` module is for 2D blending, and the `GVROrthoOverlay` module should be used for `OrthoView2D`. + +The below figure shows the connections of the network: + +![Workflow for Intensity Distribution and 2D Image Overlay using LUT Editing"](/images/tutorials/image_processing/net.png "Workflow for Intensity Distribution and 2D Image Overlay using LUT Editing") + +Now we should update the `Histogram` module by pressing the update button on it. + +![Update Histogram](/images/tutorials/image_processing/histo.png " Update Histogram") + +Now open `SoLUTEditor` module panel, go to *Range*, *Update Range From Histogram* to apply the histogram values, as shown in the figure: + +![SoLUTEditor Panel](/images/tutorials/image_processing/solut.png "SoLUTEditor Panel") + +Then in the same panel from (*Editor*... *change the color of the values*), as shown in the figure: + +![SoLUTEditor Panel Editior](/images/tutorials/image_processing/editior.png " SoLUTEditor Panel Editior") + + +Finally, when you press `View2D`, it will display a 2D anatomical image with a colored RTDOSE overlay, where the dose distribution is visualized using a customized Lookup Table (LUT) that clearly highlights the radiation intensity levels within the body. + +![Visualizing RTDOSE as a Color Overlay Using LUT](/images/tutorials/image_processing/2df.png "Visualizing RTDOSE as a Color Overlay Using LUT") + +## **Summary** + +* Load DICOM RT data including RTDOSE and RTSTRUCT. +* Visualize RTSTRUCTs with `ExtractRTStruct` and `CSOLabelRenderer`. +* Display contour labels using `CSOLabelRenderer`. +* View images in 2D (`View2D`) and 3D (`SoExaminerViewer`). +* Visualize RTDOSE as a color overlay using `SoLUTEditor`. +* Adjust dose intensity with `Histogram` and `MinMaxScan`. + +{{< networkfile "/examples/image_processing/example6/DICOMRT.mlab" >}} diff --git a/mevislab.github.io/content/tutorials/shorts.md b/mevislab.github.io/content/tutorials/shorts.md index 281d64b9f..bef4c13fb 100644 --- a/mevislab.github.io/content/tutorials/shorts.md +++ b/mevislab.github.io/content/tutorials/shorts.md @@ -35,42 +35,53 @@ This is a collection of useful keyboard shortcuts in MeVisLab, hopefully it grow - Ctrl+1 + {{< keyboard "CTRL" "1" >}} Automatically arrange selection of modules / in the current network - Ctrl+2 + {{< keyboard "CTRL" "2" >}} Open most recent network file - Ctrl+3 + {{< keyboard "CTRL" "3" >}} Run most recent test case (extremely useful for developers) - Ctrl+A then Ctrl+1 + + {{< keyboard "CTRL" "A" >}} then {{< keyboard "CTRL" "1" >}} Layout network - Ctrl+A then Tab + + {{< keyboard "CTRL" "A" >}} then {{< keyboard "TAB" >}} Layout .script file (in MATE) - Ctrl+D + + {{< keyboard "CTRL" "D" >}} Duplicate currently selected module (including all field values) - Ctrl+Left Mouse or Middle Mouse Button + + {{< keyboard "CTRL" >}} and Left Mouse {{< mousebutton "left" >}} or Middle Mouse Button {{< mousebutton "middle" >}} Show Internal Network - Space + + {{< keyboard "SPACE" >}} Show hidden outputs of the currently selected module - Ctrl+Alt+T + + {{< keyboard "CTRL" "ALT" "T" >}} Start test center - Ctrl+K + + {{< keyboard "CTRL" "K" >}} Restart MeVisLab with current network(s) - - Ctrl+R + + {{< keyboard "CTRL" "R" >}} Run script file with the same name of your network file if available in the same directory. + + {{< keyboard "ALT" >}} Double-click {{< mousebutton "left" >}} on a module + Open automatic panel of the module. + diff --git a/mevislab.github.io/hugo.toml b/mevislab.github.io/hugo.toml index ed653e726..168b0b7f5 100644 --- a/mevislab.github.io/hugo.toml +++ b/mevislab.github.io/hugo.toml @@ -28,9 +28,9 @@ canonifyURLs = true title = true [params] - [params.author] + copyrightyear = '{year}' + [params.Author] name = "MeVis Medical Solutions AG" - copyright = "{year}" website = "https://www.mevis.de" [module] diff --git a/mevislab.github.io/static/images/tutorials/image_processing/2DSlice_3D.png b/mevislab.github.io/static/images/tutorials/image_processing/2DSlice_3D.png deleted file mode 100644 index 534b2ea84..000000000 Binary files a/mevislab.github.io/static/images/tutorials/image_processing/2DSlice_3D.png and /dev/null differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/2df.png b/mevislab.github.io/static/images/tutorials/image_processing/2df.png new file mode 100644 index 000000000..0ea313592 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/2df.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/3D.png b/mevislab.github.io/static/images/tutorials/image_processing/3D.png new file mode 100644 index 000000000..f6b1d717a Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/3D.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRenderer.png b/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRenderer.png new file mode 100644 index 000000000..bb803eda9 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRenderer.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRendererpanel.png b/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRendererpanel.png new file mode 100644 index 000000000..33013d6b9 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/CSOLabelRendererpanel.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/CT512.png b/mevislab.github.io/static/images/tutorials/image_processing/CT512.png new file mode 100644 index 000000000..ac358c5ec Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/CT512.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/ConnectionandtheoutputofView2D.png b/mevislab.github.io/static/images/tutorials/image_processing/ConnectionandtheoutputofView2D.png new file mode 100644 index 000000000..4dd0c1a35 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/ConnectionandtheoutputofView2D.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/DicomImport.png b/mevislab.github.io/static/images/tutorials/image_processing/DicomImport.png new file mode 100644 index 000000000..2d4eea3ab Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/DicomImport.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/Dicommm.png b/mevislab.github.io/static/images/tutorials/image_processing/Dicommm.png new file mode 100644 index 000000000..8800f634a Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/Dicommm.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/Import.png b/mevislab.github.io/static/images/tutorials/image_processing/Import.png new file mode 100644 index 000000000..c75ecd7b9 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/Import.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/LUT.png b/mevislab.github.io/static/images/tutorials/image_processing/LUT.png new file mode 100644 index 000000000..6ba316fbe Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/LUT.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/LUTEditor.png b/mevislab.github.io/static/images/tutorials/image_processing/LUTEditor.png new file mode 100644 index 000000000..b407d1062 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/LUTEditor.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/OutputoftheSoExaminerViewer.png b/mevislab.github.io/static/images/tutorials/image_processing/OutputoftheSoExaminerViewer.png new file mode 100644 index 000000000..e5618cb5b Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/OutputoftheSoExaminerViewer.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/PanelDicomImportExtaOutput1.png b/mevislab.github.io/static/images/tutorials/image_processing/PanelDicomImportExtaOutput1.png new file mode 100644 index 000000000..43999a31c Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/PanelDicomImportExtaOutput1.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/PanelView2DPanel.png b/mevislab.github.io/static/images/tutorials/image_processing/PanelView2DPanel.png new file mode 100644 index 000000000..b2ac850f7 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/PanelView2DPanel.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/PanelView2Dafternamedthecontour.png b/mevislab.github.io/static/images/tutorials/image_processing/PanelView2Dafternamedthecontour.png new file mode 100644 index 000000000..dcad01e90 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/PanelView2Dafternamedthecontour.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/RTDOSE.png b/mevislab.github.io/static/images/tutorials/image_processing/RTDOSE.png new file mode 100644 index 000000000..c4adc4120 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/RTDOSE.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/RTPLAN.png b/mevislab.github.io/static/images/tutorials/image_processing/RTPLAN.png new file mode 100644 index 000000000..566738450 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/RTPLAN.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/RTSTRUCT.png b/mevislab.github.io/static/images/tutorials/image_processing/RTSTRUCT.png new file mode 100644 index 000000000..d5ca051fe Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/RTSTRUCT.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/SELECTINGCTRTSTRUCT.png b/mevislab.github.io/static/images/tutorials/image_processing/SELECTINGCTRTSTRUCT.png new file mode 100644 index 000000000..c48660ec3 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/SELECTINGCTRTSTRUCT.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/SelectingC.png b/mevislab.github.io/static/images/tutorials/image_processing/SelectingC.png new file mode 100644 index 000000000..66492c330 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/SelectingC.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/Varian.png b/mevislab.github.io/static/images/tutorials/image_processing/Varian.png new file mode 100644 index 000000000..a7f32b8f8 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/Varian.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/Visualizing.png b/mevislab.github.io/static/images/tutorials/image_processing/Visualizing.png new file mode 100644 index 000000000..cb345b8d8 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/Visualizing.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/contournamed.png b/mevislab.github.io/static/images/tutorials/image_processing/contournamed.png new file mode 100644 index 000000000..8805ddedd Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/contournamed.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/converter.png b/mevislab.github.io/static/images/tutorials/image_processing/converter.png new file mode 100644 index 000000000..d6d284ccf Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/converter.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/cotour.png b/mevislab.github.io/static/images/tutorials/image_processing/cotour.png new file mode 100644 index 000000000..8f9e5545c Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/cotour.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/dico.png b/mevislab.github.io/static/images/tutorials/image_processing/dico.png new file mode 100644 index 000000000..982e9ac3e Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/dico.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/dico1.png b/mevislab.github.io/static/images/tutorials/image_processing/dico1.png new file mode 100644 index 000000000..9ef715f34 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/dico1.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/editior.png b/mevislab.github.io/static/images/tutorials/image_processing/editior.png new file mode 100644 index 000000000..56f03476c Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/editior.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/histo.png b/mevislab.github.io/static/images/tutorials/image_processing/histo.png new file mode 100644 index 000000000..ac69e0723 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/histo.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/importt.png b/mevislab.github.io/static/images/tutorials/image_processing/importt.png new file mode 100644 index 000000000..401e0c1f5 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/importt.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/minmaxscan.png b/mevislab.github.io/static/images/tutorials/image_processing/minmaxscan.png new file mode 100644 index 000000000..ed51800bb Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/minmaxscan.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/net.png b/mevislab.github.io/static/images/tutorials/image_processing/net.png new file mode 100644 index 000000000..91e5a2557 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/net.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/panelCSOLabelRenderertonamethecontour..png b/mevislab.github.io/static/images/tutorials/image_processing/panelCSOLabelRenderertonamethecontour..png new file mode 100644 index 000000000..f21526895 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/panelCSOLabelRenderertonamethecontour..png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImport.png b/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImport.png new file mode 100644 index 000000000..c09703515 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImport.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImportExtraOutputtoshowthecontour.png b/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImportExtraOutputtoshowthecontour.png new file mode 100644 index 000000000..c0d6c3af8 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/panelDicomImportExtraOutputtoshowthecontour.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/panelofView2Dwithcontouringandnumbers.png b/mevislab.github.io/static/images/tutorials/image_processing/panelofView2Dwithcontouringandnumbers.png new file mode 100644 index 000000000..e470995ff Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/panelofView2Dwithcontouringandnumbers.png differ diff --git a/mevislab.github.io/static/images/tutorials/image_processing/solut.png b/mevislab.github.io/static/images/tutorials/image_processing/solut.png new file mode 100644 index 000000000..6a47652c7 Binary files /dev/null and b/mevislab.github.io/static/images/tutorials/image_processing/solut.png differ diff --git a/mevislab.github.io/themes/MeVisLab/layouts/partials/footer.html b/mevislab.github.io/themes/MeVisLab/layouts/partials/footer.html index 4da6632ee..acdc0076a 100644 --- a/mevislab.github.io/themes/MeVisLab/layouts/partials/footer.html +++ b/mevislab.github.io/themes/MeVisLab/layouts/partials/footer.html @@ -1,7 +1,7 @@