DICOM文件数据读取:fo-dicom使用

版权声明:转载请标明出处 https://blog.csdn.net/u012366767/article/details/83182830

目的:利用开源库 fo-dicom 读取 DICOM 文件。

  • 读取DICOM信息

    原始数据经过窗宽、窗位校正后显示成图。

private void Button_Click1(object sender, RoutedEventArgs e)
{
    ImageManager.SetImplementation(WPFImageManager.Instance);
    var dcmFile = DicomFile.Open(@"C:\Users\Administrator\Desktop\2.dcm");
    var dcmDataSet = dcmFile.Dataset;
    //int height = dcmDataSet.GetValue<int>(DicomTag.Rows, 0);
    //int width = dcmDataSet.GetValue<int>(DicomTag.Columns, 0);
    //int windowsWidth = dcmDataSet.GetValue<int>(DicomTag.WindowWidth, 0);
    //int windowsCenter = dcmDataSet.GetValue<int>(DicomTag.WindowCenter, 0);
    // parameters
    var dcmImage = new DicomImage(dcmDataSet, 0);
    int height = dcmImage.Height;
    int width = dcmImage.Width;
    int windowsWidth = (int)dcmImage.WindowWidth;
    int windowsCenter = (int)dcmImage.WindowCenter;
    var functionalShared = dcmDataSet.GetSequence(DicomTag.SharedFunctionalGroupsSequence);
    var pixelMeasure = functionalShared.Items.FirstOrDefault(i => i.Contains(DicomTag.PixelMeasuresSequence))?.GetSequence(DicomTag.PixelMeasuresSequence).FirstOrDefault();
    var pixelspacing = pixelMeasure.GetValues<double>(DicomTag.PixelSpacing);
    // raw data
    var header = DicomPixelData.Create(dcmDataSet);
    var pixelData = PixelDataFactory.Create(header, 0);
    if (pixelData is GrayscalePixelDataU16)
    {
        ushort[] pixels = ((GrayscalePixelDataU16)pixelData).Data;
        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height);
        int low = windowsCenter - windowsWidth / 2;
        int high = windowsCenter + windowsWidth / 2;
        for (int i = 0; i < height; ++i)
        {
            for (int j = 0; j < width; ++j)
            {
                int r, g, b;
                int temp = pixels[(width - j - 1) * height + i];
                int val = temp > high ? 255 : (temp < low ? 0 : ((temp - low) * 255 / windowsWidth));
                r = g = b = val;
                bitmap.SetPixel(i, width - j - 1, System.Drawing.Color.FromArgb(r, g, b));
            }
        }
        // show image
        MemoryStream memoryStream = new MemoryStream();
        bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] bytes = memoryStream.GetBuffer();
        // byte[] bytes = ms.ToArray();
        memoryStream.Close();
        //Convert it to BitmapImage
        System.Windows.Media.Imaging.BitmapImage image = new System.Windows.Media.Imaging.BitmapImage();
        image.BeginInit();
        image.StreamSource = new MemoryStream(bytes);
        image.EndInit();
        imageDCM.Source = image;
    }
}
  • 图像显示

    可以直接改变窗宽窗位然后显示结果。

private void Button_Click2(object sender, RoutedEventArgs e)
{
    ImageManager.SetImplementation(WPFImageManager.Instance);
    var dcmFile = DicomFile.Open(@"C:\Users\Administrator\Desktop\2.dcm");
    var dcmDataSet = dcmFile.Dataset;
    var dcmImage = new DicomImage(dcmDataSet)
    {
        WindowWidth = 200,    // change
        WindowCenter = 500
    };
    var iImage = dcmImage.RenderImage();
    imageDCM.Source = iImage.AsWriteableBitmap();
}
  • 改变数据

    改变DICOM中的数据,不过这个并没有意义,窗宽、窗位调节这个过程不是可逆的。

private void Button_Click3(object sender, RoutedEventArgs e)
{
    ImageManager.SetImplementation(WPFImageManager.Instance);
    DicomFile dcmFile = DicomFile.Open(@"C:\Users\Administrator\Desktop\3.dcm");
    DicomDataset dcmDataSet = dcmFile.Dataset;
    DicomImage dcmImage = new DicomImage(dcmDataSet, 0);
    // raw data
    DicomPixelData dcmPixelData = DicomPixelData.Create(dcmDataSet);
    IPixelData pixelData = PixelDataFactory.Create(dcmPixelData, 0);
    ushort[] pixels = { 0x00 };
    if (pixelData is GrayscalePixelDataU16)
    {
        pixels = ((GrayscalePixelDataU16)pixelData).Data;
    }
    // change
    for (int i = 0; i < pixels.Length/2; i++)
    {
        pixels[2*i] = 255;
    }
    byte[] pixels2 = new byte[2 * pixels.Length];
    Buffer.BlockCopy(pixels, 0, pixels2, 0, 2 * pixels.Length);
    dcmPixelData = DicomPixelData.Create(dcmDataSet, true);           
    Dicom.IO.Buffer.MemoryByteBuffer buffer = new Dicom.IO.Buffer.MemoryByteBuffer(pixels2);
    dcmPixelData.AddFrame(buffer);
    dcmFile = new DicomFile(dcmDataSet);
    dcmFile.Save(@"C:\Users\Administrator\Desktop\3.dcm");
    dcmImage = new DicomImage(dcmDataSet, 0);
    var iImage = dcmImage.RenderImage();
    imageDCM.Source = iImage.AsWriteableBitmap();
}
  • 对比图

    原图、窗宽窗位调节、改变数值:

猜你喜欢

转载自blog.csdn.net/u012366767/article/details/83182830