Закодируйте файл изображения JPG как DICOM PixelData, используя ClearCanvas

У меня есть набор изображений JPG, которые на самом деле представляют собой фрагменты компьютерной томографии, которые я хочу преобразовать в файлы изображений DICOM и импортировать в PACS.

Я использую ClearCanvas и установил все необходимые теги (и подтвердил их, преобразовав один из моих файлов JPG в DICOM с помощью проприетарного приложения, чтобы убедиться, что они совпадают). Я просто не уверен, как мне обрабатывать файл JPG, чтобы поместить его в тег PixelData?

В настоящее время я конвертирую его в массив байтов по совету форумов ClearCanvas, но изображение просто искажается в средстве просмотра DICOM. Как мне обрабатывать данные изображения, чтобы получить их в удобочитаемом формате?

    public DicomFile CreateFileFromImage(Image image)
    {
        int height = image.Height;
        int width = image.Width;
        short bitsPerPixel = (short)Image.GetPixelFormatSize(image.PixelFormat);

        byte[] imageBuffer = ImageToByteArray(image);
        DicomFile dicomFile = new DicomFile();
        dicomFile.DataSet[DicomTags.Columns].SetInt32(0, width);
        dicomFile.DataSet[DicomTags.Rows].SetInt32(0, height);
        dicomFile.DataSet[DicomTags.BitsStored].SetInt16(0, bitsPerPixel);
        dicomFile.DataSet[DicomTags.BitsAllocated].SetInt16(0, bitsPerPixel);
        dicomFile.DataSet[DicomTags.HighBit].SetInt16(0, 7);
        //other tags not shown
        dicomFile.DataSet[DicomTags.PixelData].Values = imageBuffer;
        return dicomFile;
    }
    public static byte[] ImageToByteArray(Image imageIn)
    {
        MemoryStream ms = new MemoryStream();

        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        return ms.ToArray();
    }

3 ответа

Библиотека ClearCanvas как два вспомогательных класса, которые облегчают кодирование и декодирование данных пикселей в пределах DicomFile, Они DicomCompressedPixelData класс и DicomUncompressedPixelData учебный класс. Вы можете использовать их для установки параметров изображения и кодировать их в DicomFile объект.

В вашем случае, поскольку вы кодируете сжатый объект, вы должны использовать DicomCompressedPixelData учебный класс. В классе есть свойства, которые можно установить. Вызов UpdateMessage Метод скопирует эти значения свойств в DicomFile объект. Кроме того, этот класс имеет AddFrameFragment метод, который правильно кодирует данные пикселей. Обратите внимание, что сжатые данные пикселей должны иметь определенные двоичные обертки вокруг каждого кадра данных. Эта часть отсутствовала в вашем предыдущем коде. Код ниже показывает, как это настроить.

        short bitsPerPixel = (short)Image.GetPixelFormatSize(image.PixelFormat);

        var dicomFile = new DicomFile();
        var pd = new DicomCompressedPixelData(dicomFile);

        pd.ImageWidth = (ushort)image.Width;
        pd.ImageHeight = (ushort) image.Height;
        pd.BitsStored = (ushort)bitsPerPixel;
        pd.BitsAllocated = (ushort) bitsPerPixel;
        pd.HighBit = 7;
        pd.SamplesPerPixel = 3;
        pd.PlanarConfiguration = 0;
        pd.PhotometricInterpretation = "YBR_FULL_422";

        byte[] imageBuffer = ImageToByteArray(image);
        pd.AddFrameFragment(imageBuffer);

        pd.UpdateMessage(dicomFile);

        return dicomFile;

В итоге я обработал растровое изображение вручную и создал массив из красного канала на изображении, следуя некоторому коду в плагине:

            int size = rows * columns;
            byte[] pData = new byte[size]; 
            int i = 0;

            for (int row = 0; row < rows; ++row)
            {
                for (int column = 0; column < columns; column++)
                {
                    pData[i++] = image.GetPixel(column, row).R;
                }
            }

Это работает, но это ужасно медленно и создает раздутые файлы DICOM. Я бы хотел, чтобы встроенный класс DicomCompressedPixelData работал.

Любые дальнейшие предложения будут очень приветствоваться.

Важно знать битовую глубину и цветовые составляющие вашего JPEG CT-изображения перед вставкой в ​​набор данных DICOM. Это могут быть 8-битные с потерями (JPEG Compression Process 2) или 12-битные с потерями (JPEG Compression Process 4) или 8, 12 или 16-битные оттенки серого JPEG без потерь (JPEG Compression Process 14 - без потерь, не иерархический). Эта информация важна для обновления информации, связанной с данными пикселей, такой как фотометрическая интерпретация, выборка на пиксель, конфигурация строгального станка, выделенные биты, синтаксис старших бит для передачи.

Другие вопросы по тегам