簡體   English   中英

使用灰度軟拷貝演示 State 與 fo-dicom

[英]Using Grayscale Softcopy Presentation State with fo-dicom

我想使用灰度軟拷貝演示 State IOD 為 DICOM 圖像(例如,繪圖或文本注釋)添加標記。

我創建了一個 DICOM 圖像 object,如下所示:

Bitmap bitmap = new Bitmap(path);
            bitmap = GetValidImage(bitmap);
            int rows, columns;
            byte[] pixels = GetPixels(bitmap, out rows, out columns);

            MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
            DicomDataset imageDataset = new DicomDataset();
            FillDataset(imageDataset);
            DicomDataset annotationdataset = new DicomDataset();
            FillAnnotation(imageDataset, annotationdataset);

            imageDataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
            imageDataset.Add(DicomTag.Rows, (ushort)rows);
            imageDataset.Add(DicomTag.Columns, (ushort)columns);
            imageDataset.Add(DicomTag.BitsAllocated, (ushort)8);

            DicomPixelData pixelData = DicomPixelData.Create(imageDataset, true);
            pixelData.BitsStored = 8;
            pixelData.SamplesPerPixel = 3;
            pixelData.HighBit = 7;
            pixelData.PixelRepresentation = 0;
            pixelData.PlanarConfiguration = 0;
            pixelData.AddFrame(buffer);



            DicomFile dicomfile = new DicomFile(imageDataset);
            if (File.Exists("test.dcm"))
                File.Delete("test.dcm");
            dicomfile.Save("test.dcm");

然后我創建了一個灰度軟拷貝演示 State object,如下所示:

private static void FillAnnotation(DicomDataset imageDataset, DicomDataset annotationDataset)
        {
            //type 1 attributes.
            annotationDataset.Add(DicomTag.SOPClassUID, DicomUID.GrayscaleSoftcopyPresentationStateStorage);
            annotationDataset.Add(DicomTag.StudyInstanceUID, _studyInstanceUid);
            annotationDataset.Add(DicomTag.SeriesInstanceUID, _seriesInstanceUID);
            annotationDataset.Add(DicomTag.SOPInstanceUID, GenerateUid());

            //type 2 attributes
            annotationDataset.Add(DicomTag.PatientID, _patientId);
            annotationDataset.Add(DicomTag.PatientName, _patientName);
            annotationDataset.Add(DicomTag.PatientBirthDate, _patientBirthDate);
            annotationDataset.Add(DicomTag.PatientSex, _patientSex);
            annotationDataset.Add(DicomTag.StudyDate, _studyDateTime);
            annotationDataset.Add(DicomTag.StudyTime, _studyDateTime);
            annotationDataset.Add(DicomTag.AccessionNumber, _accessionNumber);
            annotationDataset.Add(DicomTag.ReferringPhysicianName, _referringPhysicianName);
            annotationDataset.Add(DicomTag.StudyID, _studyID);
            annotationDataset.Add(DicomTag.SeriesNumber, _seriesNumber);
            //annotationDataset.Add(DicomTag.ModalitiesInStudy, "CR");
            annotationDataset.Add(DicomTag.Modality, _modality);
            annotationDataset.Add(DicomTag.Manufacturer, _manufacturer);
            annotationDataset.Add(DicomTag.PresentationCreationDate, _presentationCreationDateTime);
            annotationDataset.Add(DicomTag.PresentationCreationTime, _presentationCreationDateTime);

            DicomDataset serie = new DicomDataset();
            serie.Add(DicomTag.SeriesInstanceUID, _seriesInstanceUID);
            serie.Add(DicomTag.ReferencedImageSequence, imageDataset);

            annotationDataset.Add(DicomTag.ReferencedSeriesSequence, serie);


            DicomDataset displayedArea = new DicomDataset();
            displayedArea.Add(DicomTag.DisplayedAreaTopLeftHandCorner, "50\\50");
            displayedArea.Add(DicomTag.DisplayedAreaBottomRightHandCorner, "100\\100");
            displayedArea.Add(DicomTag.PresentationSizeMode, "SCALE TO FIT");

            annotationDataset.Add(DicomTag.DisplayedAreaSelectionSequence, displayedArea);

            annotationDataset.Add(DicomTag.ICCProfile, Byte.Parse("00000001"));

        }

我不太明白這兩個object是怎么相互連接的?

Presentation State 通過ReferencedSeriesSequence連接到圖像。 我看到您正在填寫該屬性,所以這應該沒問題。 現在您還需要將演示文稿 State 保存為單獨的 DICOM 文件,與保存圖像的方式完全相同。 為了檢查結果,只需使用 fo-dicom 打開 PS 文件並從中讀取,例如:

 var file = DicomFile.Open(your_path, readOption: FileReadOption.ReadAll);
 var dicomDataset = file.Dataset;
 var isItem = dicomDataset.Contains(DicomTag.SOPInstanceUID);
....

您可以在調試器中輕松檢查上面的 dicomDataset 並查看您放入 PS 中的所有屬性都應該在那里。

我也做了同樣的事情,但問題是我找不到一個免費的 DICOM 查看器,它可以正確地可視化圖像和演示 State。 還在找一個。。。。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM