Как изменить Pixel Data файла DICOM, используя fo-dicom? - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу заменить данные пикселя файла DICOM другим. Я использовал этот код:

public bool ImportImage(string imageFile, string newFilePah, string oldDicomFile)
{
    try
    {
        Bitmap bitmap = new Bitmap(imageFile);
        bitmap = GetValidImage(bitmap);
        int rows, columns;
        byte[] pixels = GetPixels(bitmap, out rows, out columns);
        MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
        DicomDataset dataset = new DicomDataset();
        var df = DicomFile.Open(oldDicomFile);
        FillDataset(ref dataset, df);

        DicomTransferSyntax dicomTransfer = df.Dataset.Get<DicomTransferSyntax>(DicomTag.TransferSyntaxUID, DicomTransferSyntax.JPEGProcess14);
        dataset.AddOrUpdate(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
        dataset.AddOrUpdate(DicomTag.Rows, (ushort)rows);
        dataset.AddOrUpdate(DicomTag.Columns, (ushort)columns);
        dataset.AddOrUpdate(DicomTag.BitsAllocated, (ushort)8);
        DicomPixelData pixelData = DicomPixelData.Create(dataset, true);
        pixelData.BitsStored = 8;
        pixelData.SamplesPerPixel = 3;
        pixelData.HighBit = 7;
        pixelData.PixelRepresentation = 0;
        pixelData.PlanarConfiguration = 0;
        pixelData.AddFrame(buffer);

        DicomFile dicomfile = new DicomFile(dataset.Clone(dicomTransfer));
        dicomfile.Save(newFilePah);
        return true;
    }
    catch(Exception ddd) { return false; }
}
private void FillDataset(ref DicomDataset dataset, DicomFile df)
{
    foreach(var item in df.Dataset)
    {
        if(!item.Tag.Group.ToString().Equals("7FE0") && !item.Tag.Group.ToString().Equals("40"))
            dataset.Add(item);
    }
}

Выходной файл DICOM теряет много тегов, которые влияют на отображение изображения.

Я сослался на этот ответ. Но метод AddOrUpdatePixelData, использованный в этом ответе, устарел в версии v4.0.0-rc1. Так что этот ответ не очень помогает.

Есть ли другой способ изменить пиксельные данные файла DICOM с помощью fo-dicom?

1 Ответ

0 голосов
/ 01 ноября 2018

Следующий код правильно заменяет данные пикселей.

public static bool ImportImage(string imageFile, string newFilePah, string oldDicomFile)
{
    Bitmap bitmap = new Bitmap(imageFile);
    int rows, columns;
    byte[] pixels = GetPixels(bitmap, out rows, out columns);
    MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
    DicomDataset dataset = new DicomDataset();
    var dicomfile = DicomFile.Open(oldDicomFile);
    dataset = dicomfile.Dataset.Clone();

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

    DicomPixelData pixelData = DicomPixelData.Create(dataset, true);
    pixelData.BitsStored = 8;
    pixelData.SamplesPerPixel = 3;
    pixelData.HighBit = 7;
    pixelData.PhotometricInterpretation = PhotometricInterpretation.Rgb;
    pixelData.PixelRepresentation = 0;
    pixelData.PlanarConfiguration = 0;
    pixelData.Height = (ushort)rows;
    pixelData.Width = (ushort)columns;
    pixelData.AddFrame(buffer);

    dicomfile = new DicomFile(dataset);
    dicomfile.Save(newFilePah);
    return true;
}

private static byte[] GetPixels(Bitmap bitmap, out int rows, out int columns)
{
    using(var stream = new MemoryStream())
    {
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
        rows = bitmap.Height;
        columns = bitmap.Width;
        return stream.ToArray();
    }
}

Вы можете видеть, что я сильно очистил ваш код.

Но основное изменение заключается в использовании System.Drawing.Imaging.ImageFormat.Bmp вместо других форматов. Это зависит от фактического формата входного изображения. Используйте формат в качестве формата входного изображения.

Для получения более подробной информации, пожалуйста, обратитесь к этому исходному коду на github.

...