Как преобразовать обычные байты изображения JPEG в байты собственного изображения DICOM, используя C # - PullRequest
1 голос
/ 30 сентября 2011

В настоящее время я пишу модуль для преобразования JPEG в DICOM Image Преобразование. После анализа я выполнил рендеринг тега, теперь изображение неправильно отображается в файле DICOM.

Существует ли какой-либо алгоритм для преобразования JPEG в DICOM.

Ответы [ 4 ]

2 голосов
/ 19 сентября 2015

Продолжая ответ Мэтью, вот очень простой способ создания конверта DICOM для потока JPEG с использованием превосходной библиотеки GDCM и его примера, на который есть ссылки (обратите внимание, что я использовал несколько вспомогательных классов, но довольно просто):

       ImageReader r = new ImageReader();
        gdcm.Image image = r.GetImage();
        image.SetNumberOfDimensions(2);
        DataElement pixeldata = DataElementHelper.PixelData;
        string file1 = @"D:\testfil.jpeg";

        System.IO.FileStream infile =
            new System.IO.FileStream(file1, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        //uint fsize = gdcm.PosixEmulation.FileSize(file1);

        //byte[] jstream = new byte[fsize];
        //infile.Read(jstream, 0, jstream.Length);

        byte[] jstream = System.IO.File.ReadAllBytes(file1);
        uint fsize = (uint) jstream.Length;

        SmartPtrFrag sq = SequenceOfFragments.New();
        Fragment frag = new Fragment();
        frag.SetByteValue(jstream, new gdcm.VL((uint)jstream.Length));
        sq.AddFragment(frag);
        pixeldata.SetValue(sq.__ref__());

        // insert:
        image.SetDataElement(pixeldata);


        PhotometricInterpretation pi = new PhotometricInterpretation(PhotometricInterpretation.PIType.MONOCHROME2);
        image.SetPhotometricInterpretation(pi);

        // FIXME hardcoded:
        PixelFormat pixeltype = new PixelFormat(PixelFormat.ScalarType.UINT8);
        image.SetPixelFormat(pixeltype);

        TransferSyntax ts = new TransferSyntax(TransferSyntax.TSType.JPEGBaselineProcess1);
        image.SetTransferSyntax(ts);

        image.SetDimension(0, (uint)1700);
        image.SetDimension(1, (uint)2200);

        ImageWriter writer = new ImageWriter();
        gdcm.File file = writer.GetFile();


        var ds = file.GetDataSet();
        DataElement patientID = DataElementHelper.PatientID;
        DataElement patientName = DataElementHelper.PatientName;
        DataElement accessionNumber = DataElementHelper.AccessionNumber;
        DataElement studyDate = DataElementHelper.StudyDate;
        DataElement studyTime = DataElementHelper.StudyTime;
        DataElement studyInstanceUID = DataElementHelper.StudyInstanceUID;
        DataElement seriesInstanceUID = DataElementHelper.SeriesInstanceUID;
        DataElement mediaStorage = DataElementHelper.SOPClassUID;

        string studyUID = new gdcm.UIDGenerator().Generate();
        string seriesUID = new gdcm.UIDGenerator().Generate();

        //pixelData.SetArray(b, (uint)b.Length);
        DataElementHelper.SetDataElement(ref patientName, "TEST^MARCUS");
        DataElementHelper.SetDataElement(ref patientID, "0000000801");
        DataElementHelper.SetDataElement(ref accessionNumber, "0000000801-12345");
        DataElementHelper.SetDataElement(ref studyDate, DateTime.Now.ToString("yyyyMMdd"));
        DataElementHelper.SetDataElement(ref studyTime, DateTime.Now.ToString("HHmmss"));
        DataElementHelper.SetDataElement(ref studyInstanceUID, studyUID);
        DataElementHelper.SetDataElement(ref seriesInstanceUID, seriesUID);
        DataElementHelper.SetDataElement(ref mediaStorage, "1.2.840.10008.5.1.4.1.1.7");
        ds.Insert(patientID);
        ds.Insert(patientName);
        ds.Insert(accessionNumber);
        ds.Insert(studyDate);
        ds.Insert(studyTime);
        ds.Insert(studyInstanceUID);
        ds.Insert(seriesInstanceUID);
        ds.Insert(mediaStorage);

        writer.SetImage(image);
        writer.SetFileName("gdcm_test.dcm");
        bool ret = writer.Write();
1 голос
/ 30 сентября 2011

, пожалуйста, взгляните на библиотеку mdcm C # DICOM, изначально написанную Colby Dillion. Он разработал управляемые C ++ «мосты» для кодовых баз IJG / LibJPEG и OpenJPEG , поэтому mdcm обеспечивает поддержку как 8/12/16-битных с потерями и без потерь JPEG, так и JPEG Поддержка -2000.

Исходная библиотека Колби имеет зависимости WinForms. Я создал целевую вилку Silverlight и WPF для mdcm здесь . Версия библиотеки WPF может полностью использовать те же кодеки JPEG (-2000), которые первоначально использовал Colby.
Версия Silverlight, с другой стороны, в настоящее время не может использовать эти кодеки. Я предпринял несколько попыток применить библиотеки FJCore и LibJpeg.Net для поддержки JPEG с потерями в Silverlight, но в настоящее время эти библиотеки поддерживают только 8-битные изображения.

С уважением,
Андерс @ Cureos

0 голосов
/ 06 декабря 2012

Вам не нужно «конвертировать» JPEG в DICOM. DICOM - это просто «конверт» для вашего потока JPEG. Вот что я сделал в GDCM для инкапсуляции (= помещения в конверт DICOM) существующего файла MPEG2:

http://gdcm.sourceforge.net/html/MpegVideoInfo_8cs-example.html

Просто адаптируйте этот код для входного файла JPEG. Например, посмотрите на:

http://gdcm.sourceforge.net/html/DecompressJPEGFile_8cs-example.html

Нет необходимости распаковывать / пережимать, это будет пустой тратой ресурсов.

0 голосов
/ 30 сентября 2011

В самой .NET нет функциональности для поддержки DICOM. Вам нужно будет использовать библиотеку. Я не знаю ни одной бесплатной, но я использовал LeadTools, и он сделает это (за плату). Но я бы дал ему только 4/10, и я бы рекомендовал вам поискать и другие варианты.

...