VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    DICOM: Многоплоскостная реконструкция
    В этом разделе
    DICOM исследование часто содержит набор изображений, которые представляют собой плоские срезы анализируемого объекта, выполненные в одной плоскости. Многоплоскостная реконструкция (MPR) позволяет восстановить изображение объекта в линейной или криволинейной плоскости из серии плоских срезов объекта.
    SDK реализует DICOM MPR, который позволяет восстанавливать изображение объекта в плоских плоскостях (корональной, сагиттальной, осевой или наклонной) или криволинейных плоскостях из серии параллельных 2D DICOM изображений.


    Исходные данные для DICOM MPR

    Для многоплоскостной реконструкции SDK требуется набор DICOM кадров. Класс MprDicomImagePlanarSlice позволяет указать кадр DICOM, который можно использовать для DICOM MPR.

    Вот C#/VB.NET код, который демонстрирует, как создать исходные данные для DICOM MPR.
    /// <summary>
    /// Creates the <see cref="Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice"/> for DICOM MPR.
    /// </summary>
    /// <param name="sourceDicomFiles">The source DICOM files.</param>
    /// <returns>
    /// The source data for DICOM MPR.
    /// </returns>
    /// <exception cref="System.ArgumentNullException">Thrown if <i>sourceDicomFiles</i> is <b>null</b>.</exception>
    public static Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice[] CreateSourceDicomFrames(
        params Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile[] sourceDicomFiles)
    {
        // if source DICOM files are not specified
        if (sourceDicomFiles == null)
            throw new System.ArgumentNullException();
    
        // a list of source MPR slices
        System.Collections.Generic.List<Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice> sourceMprSlices = 
            new System.Collections.Generic.List<Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice>();
    
        // for each DICOM file
        foreach (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile sourceDicomFile in sourceDicomFiles)
        {
            // for each DICOM frame
            foreach (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFrame frame in sourceDicomFile.Pages)
            {
                // create MPR slice from DICOM frame
                sourceMprSlices.Add(new Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice(frame));
            }
        }
    
        return sourceMprSlices.ToArray();
    }
    
    ''' <summary>
    ''' Creates the <see cref="Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice"/> for DICOM MPR.
    ''' </summary>
    ''' <param name="sourceDicomFiles">The source DICOM files.</param>
    ''' <returns>
    ''' The source data for DICOM MPR.
    ''' </returns>
    ''' <exception cref="System.ArgumentNullException">Thrown if <i>sourceDicomFiles</i> is <b>null</b>.</exception>
    Public Shared Function CreateSourceDicomFrames(ParamArray sourceDicomFiles As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile()) As Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice()
        ' if source DICOM files are not specified
        If sourceDicomFiles Is Nothing Then
            Throw New System.ArgumentNullException()
        End If
    
        ' a list of source MPR slices
        Dim sourceMprSlices As New System.Collections.Generic.List(Of Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice)()
    
        ' for each DICOM file
        For Each sourceDicomFile As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile In sourceDicomFiles
            ' for each DICOM frame
            For Each frame As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFrame In sourceDicomFile.Pages
                ' create MPR slice from DICOM frame
                sourceMprSlices.Add(New Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice(frame))
            Next
        Next
    
        Return sourceMprSlices.ToArray()
    End Function
    


    DICOM MPR изображение

    DICOM MPR изображение - это трехмерный куб, который создается из набора DICOM DICOM кадров исследования и представлен классом MprImage. DICOM MPR изображение может быть создано из исходных DICOM кадров, если они удовлетворяют следующим требованиям:
    DICOM MPR изображение можно инициализировать DICOM кадрами в конструкторе класса MprImage или с помощью метода MprImage.Initialize.

    Инициализированное DICOM MPR изображение может предоставлять информацию о местоположении (MprImage.Location, MprImage.XAxis, MprImage.YAxis, MprImage.ZAxis) и размере (MprImage.XDataLength, MprImage.YDataLength, MprImage.ZDataLength, MprImage.DiagonalLength) DICOM MPR изображения в 3D-пространстве.


    Инициализированное DICOM MPR изображение должно быть заполнено для получения информации о значениях пикселей 3D-куба.

    Метод MprImage.FillDataSync позволяет заполнять данные MPR изображения синхронно, метод MprImage.FillDataAsync позволяет заполнять данные MPR изображения асинхронно.
    Событие MprImage.FillDataProgress позволяет получить информацию о ходе заполнения MPR данных. Событие MprImage.FillDataFinished позволяет определить момент завершения процесса заполнения MPR данных. Свойство MprImage.FillDataError позволяет определить, возникла ли ошибка в процессе заполнения MPR данных.
    MprImage.FillDataThreadCount позволяет установить максимальное количество потоков, которые следует использовать для заполнения MPR данных.

    Вот C#/VB.NET код, который демонстрирует, как создать, инициализировать и синхронно заполнить DICOM MPR изображение.
    /// <summary>
    /// Creates the initialized <see cref="Vintasoft.Imaging.Dicom.Mpr.MprImage"/>
    /// from <see cref="Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile"/> array.
    /// </summary>
    /// <param name="sourceDicomFiles">The source DICOM files.</param>
    /// <returns>
    /// The initialized <see cref="Vintasoft.Imaging.Dicom.Mpr.MprImage"/>.
    /// </returns>
    /// <exception cref="System.ArgumentNullException">Thrown if <i>sourceDicomFiles</i> is <b>null</b>.</exception>
    public static Vintasoft.Imaging.Dicom.Mpr.MprImage CreateInitAndSyncFill(
        params Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile[] sourceDicomFiles)
    {
        // if source DICOM files are not specified
        if (sourceDicomFiles == null)
            throw new System.ArgumentNullException();
        
        // a list of source MPR slices
        System.Collections.Generic.List<Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice> sourceMprSlices = 
            new System.Collections.Generic.List<Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice>();
    
        // for each DICOM file
        foreach (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile sourceDicomFile in sourceDicomFiles)
        {
            // for each DICOM frame
            foreach (Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFrame sourceDicomFrame in sourceDicomFile.Pages)
            {
                // create MPR slice from DICOM frame
                sourceMprSlices.Add(new Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice(sourceDicomFrame));
            }
        }
    
        // create the MPR image
        Vintasoft.Imaging.Dicom.Mpr.MprImage mprImage = new Vintasoft.Imaging.Dicom.Mpr.MprImage();
    
        // initialize the source data
        mprImage.Initialize(sourceMprSlices.ToArray());
    
        // fill the MPR image data synchronously
        mprImage.FillDataSync();
    
        return mprImage;
    }
    
    ''' <summary>
    ''' Creates the initialized <see cref="Vintasoft.Imaging.Dicom.Mpr.MprImage"/>
    ''' from <see cref="Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile"/> array.
    ''' </summary>
    ''' <param name="sourceDicomFiles">The source DICOM files.</param>
    ''' <returns>
    ''' The initialized <see cref="Vintasoft.Imaging.Dicom.Mpr.MprImage"/>.
    ''' </returns>
    ''' <exception cref="System.ArgumentNullException">Thrown if <i>sourceDicomFiles</i> is <b>null</b>.</exception>
    Public Shared Function CreateInitAndSyncFill(ParamArray sourceDicomFiles As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile()) As Vintasoft.Imaging.Dicom.Mpr.MprImage
        ' if source DICOM files are not specified
        If sourceDicomFiles Is Nothing Then
            Throw New System.ArgumentNullException()
        End If
    
        ' a list of source MPR slices
        Dim sourceMprSlices As New System.Collections.Generic.List(Of Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice)()
    
        ' for each DICOM file
        For Each sourceDicomFile As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFile In sourceDicomFiles
            ' for each DICOM frame
            For Each sourceDicomFrame As Vintasoft.Imaging.Codecs.ImageFiles.Dicom.DicomFrame In sourceDicomFile.Pages
                ' create MPR slice from DICOM frame
                sourceMprSlices.Add(New Vintasoft.Imaging.Dicom.Mpr.MprDicomImagePlanarSlice(sourceDicomFrame))
            Next
        Next
    
        ' create the MPR image
        Dim mprImage As New Vintasoft.Imaging.Dicom.Mpr.MprImage()
    
        ' initialize the source data
        mprImage.Initialize(sourceMprSlices.ToArray())
    
        ' fill the MPR image data synchronously
        mprImage.FillDataSync()
    
        Return mprImage
    End Function
    


    Срез DICOM MPR

    Срез DICOM MPR может быть создан при инициализации DICOM MPR изображения, заполнение DICOM MPR изображения не является обязательным.
    Ортогональный плоский 2D-срез DICOM MPR изображения можно создать с помощью методов MprImage.CreateAxialSlice, MprImage.CreateCoronalSlice, MprImage.CreateSagittalSlice или с помощью конструктора класса MprPlanarSlice.
    Наклонный плоский 3D-срез DICOM MPR изображения можно создать с помощью MprImage.CreatePlanarSlice или с помощью конструктора класса MprPlanarSlice.
    Кривой 3D-срез DICOM MPR изображения можно создать с помощью метода MprImage.CreateCurvilinearSlice или с помощью конструктора класса MprCurvilinearSlice или MprPolylineSlice.

    Класс MprSlice является базовым классом для всех срезов DICOM MPR. Класс позволяет определить расположение, размер и толщину среза в 3D-пространстве, а также режим рендеринга среза.
    Поддерживаются следующие режимы рендеринга срезов:
    Вот C#/VB.NET код, который демонстрирует, как создать корональные и сагиттальные срезы DICOM MPR изображения.
    /// <summary>
    /// Creates the coronal and sagittal slices for MPR image.
    /// </summary>
    /// <param name="mprImage">The MPR image.</param>
    /// <param name="coronalSlice">The coronal slice.</param>
    /// <param name="sagittalSlice">The sagittal slice.</param>
    public static void CreateCoronalAndSagittalSlices(
        Vintasoft.Imaging.Dicom.Mpr.MprImage mprImage,
        out Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice coronalSlice,
        out Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice sagittalSlice)
    {
        // calculate the MPR image center
        Vintasoft.Imaging.VintasoftPoint3D mprImageCenter =
            new Vintasoft.Imaging.VintasoftPoint3D(
                mprImage.XLength / 2.0,
                mprImage.YLength / 2.0,
                mprImage.ZLength / 2.0);
        
        // the coronal slice location
        Vintasoft.Imaging.VintasoftPoint3D coronalSliceLocation = 
            new Vintasoft.Imaging.VintasoftPoint3D(0, mprImageCenter.Y, mprImage.ZLength);
        // the horizontal axis for the coronal slice
        Vintasoft.Imaging.VintasoftVector3D coronalSliceXAxis = Vintasoft.Imaging.VintasoftVector3D.XAxis;
        // the vertical axis for the coronal slice
        // (invert vertical axis because Y-axis in screen coordinate system is going from top to bottom and
        // Z-axis in DICOM coordinate system is going from bottom to top)
        Vintasoft.Imaging.VintasoftVector3D coronalSliceYAxis = -Vintasoft.Imaging.VintasoftVector3D.ZAxis;
        // create the coronal slice
        coronalSlice = new Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice(
            coronalSliceLocation, coronalSliceXAxis, coronalSliceYAxis,
            mprImage.XLength, mprImage.ZLength);
    
    
        // the sagittal slice location
        Vintasoft.Imaging.VintasoftPoint3D sagittalSliceLocation = 
            new Vintasoft.Imaging.VintasoftPoint3D(mprImageCenter.X, 0, mprImage.ZLength);
        // the horizontal axis for the sagittal slice
        Vintasoft.Imaging.VintasoftVector3D sagittalSliceXAxis = 
            Vintasoft.Imaging.VintasoftVector3D.YAxis;
        // the vertical axis for the sagittal slice
        // (invert vertical axis because Y-axis in screen coordinate system is going from top to bottom and
        // Z-axis in DICOM coordinate system is going from bottom to top)
        Vintasoft.Imaging.VintasoftVector3D sagittalSliceYAxis = -Vintasoft.Imaging.VintasoftVector3D.ZAxis;
        // create the sagittal slice
        sagittalSlice = new Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice(
            sagittalSliceLocation, sagittalSliceXAxis, sagittalSliceYAxis,
            mprImage.YLength, mprImage.ZLength);
    }
    
    ''' <summary>
    ''' Creates the coronal and sagittal slices for MPR image.
    ''' </summary>
    ''' <param name="mprImage">The MPR image.</param>
    ''' <param name="coronalSlice">The coronal slice.</param>
    ''' <param name="sagittalSlice">The sagittal slice.</param>
    Public Shared Sub CreateCoronalAndSagittalSlices(mprImage As Vintasoft.Imaging.Dicom.Mpr.MprImage, ByRef coronalSlice As Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice, ByRef sagittalSlice As Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice)
        ' calculate the MPR image center
        Dim mprImageCenter As New Vintasoft.Imaging.VintasoftPoint3D(mprImage.XLength / 2.0, mprImage.YLength / 2.0, mprImage.ZLength / 2.0)
    
        ' the coronal slice location
        Dim coronalSliceLocation As New Vintasoft.Imaging.VintasoftPoint3D(0, mprImageCenter.Y, mprImage.ZLength)
        ' the horizontal axis for the coronal slice
        Dim coronalSliceXAxis As Vintasoft.Imaging.VintasoftVector3D = Vintasoft.Imaging.VintasoftVector3D.XAxis
        ' the vertical axis for the coronal slice
        ' (invert vertical axis because Y-axis in screen coordinate system is going from top to bottom and
        ' Z-axis in DICOM coordinate system is going from bottom to top)
        Dim coronalSliceYAxis As Vintasoft.Imaging.VintasoftVector3D = -Vintasoft.Imaging.VintasoftVector3D.ZAxis
        ' create the coronal slice
        coronalSlice = New Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice(coronalSliceLocation, coronalSliceXAxis, coronalSliceYAxis, mprImage.XLength, mprImage.ZLength)
    
    
        ' the sagittal slice location
        Dim sagittalSliceLocation As New Vintasoft.Imaging.VintasoftPoint3D(mprImageCenter.X, 0, mprImage.ZLength)
        ' the horizontal axis for the sagittal slice
        Dim sagittalSliceXAxis As Vintasoft.Imaging.VintasoftVector3D = Vintasoft.Imaging.VintasoftVector3D.YAxis
        ' the vertical axis for the sagittal slice
        ' (invert vertical axis because Y-axis in screen coordinate system is going from top to bottom and
        ' Z-axis in DICOM coordinate system is going from bottom to top)
        Dim sagittalSliceYAxis As Vintasoft.Imaging.VintasoftVector3D = -Vintasoft.Imaging.VintasoftVector3D.ZAxis
        ' create the sagittal slice
        sagittalSlice = New Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice(sagittalSliceLocation, sagittalSliceXAxis, sagittalSliceYAxis, mprImage.YLength, mprImage.ZLength)
    End Sub
    


    Изображение среза DICOM MPR

    Метод MprImage.RenderSlice позволяет получить изображение среза DICOM MPR. Изображение среза DICOM MPR можно получить только в том случае, если DICOM MPR изображение инициализировано и заполнено.

    Вот C#/VB.NET код, который демонстрирует, как получить изображения корональных и сагиттальных срезов DICOM MPR изображения.
    /// <summary>
    /// Renders the coronal and sagittal slices.
    /// </summary>
    /// <param name="mprImage">The MPR image.</param>
    /// <param name="coronalSliceImage">The coronal slice image.</param>
    /// <param name="sagittalSliceImage">The sagittal slice image.</param>
    public static void RenderSlice(
        Vintasoft.Imaging.Dicom.Mpr.MprImage mprImage,
        out Vintasoft.Imaging.Dicom.Mpr.MprImageSlice coronalSliceImage,
        out Vintasoft.Imaging.Dicom.Mpr.MprImageSlice sagittalSliceImage)
    {
        // create the coronal slice
        Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice coronalSlice = mprImage.CreateCoronalSlice(mprImage.YLength / 2.0);
        // render the coronal slice
        coronalSliceImage = mprImage.RenderSlice(coronalSlice);
    
        // create the sagittal slice
        Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice sagittalSlice = mprImage.CreateSagittalSlice(mprImage.XLength / 2.0);
        // render the sagittal slice
        sagittalSliceImage = mprImage.RenderSlice(sagittalSlice);
    }
    
    ''' <summary>
    ''' Renders the coronal and sagittal slices.
    ''' </summary>
    ''' <param name="mprImage">The MPR image.</param>
    ''' <param name="coronalSliceImage">The coronal slice image.</param>
    ''' <param name="sagittalSliceImage">The sagittal slice image.</param>
    Public Shared Sub RenderSlice(mprImage As Vintasoft.Imaging.Dicom.Mpr.MprImage, ByRef coronalSliceImage As Vintasoft.Imaging.Dicom.Mpr.MprImageSlice, ByRef sagittalSliceImage As Vintasoft.Imaging.Dicom.Mpr.MprImageSlice)
        ' create the coronal slice
        Dim coronalSlice As Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice = mprImage.CreateCoronalSlice(mprImage.YLength / 2.0)
        ' render the coronal slice
        coronalSliceImage = mprImage.RenderSlice(coronalSlice)
    
        ' create the sagittal slice
        Dim sagittalSlice As Vintasoft.Imaging.Dicom.Mpr.MprPlanarSlice = mprImage.CreateSagittalSlice(mprImage.XLength / 2.0)
        ' render the sagittal slice
        sagittalSliceImage = mprImage.RenderSlice(sagittalSlice)
    End Sub
    


    Вот скриншот сагиттального среза в режиме MPR-рендеринга:


    Вот скриншот сагиттального среза в режиме MIP-рендеринга:


    Вот скриншот сагиттального среза в режиме рендеринга MinIP:


    Вот скриншот сагиттального среза в режиме рендеринга Avg:


    Вот скриншот сагиттального среза в режиме рендеринга Preview3D: