public static ImageMatrix ParseDICOM(IEnumerable <string> dcmFiles) { try { var matrix = new ImageMatrix(); var fileImageNumbers = new List <(string fileName, int imageSlice, double z)>(); foreach (var file in dcmFiles) { var dcm = DICOMObject.Read(file); var sel = dcm.GetSelector(); var seriesUID = sel.SeriesInstanceUID.Data; var num = sel.InstanceNumber.Data; var z = dcm.GetSelector().ImagePositionPatient.Data_[2]; fileImageNumbers.Add((file, num, z)); } var ordered = fileImageNumbers.OrderBy(f => f.z); matrix.DimensionZ = ordered.Count(); var values = new List <float>(); //Load Values foreach (var o in ordered) { var dcm = DICOMObject.Read(o.fileName); var minSliceNum = ordered.Min(or => or.imageSlice); if (o.imageSlice == minSliceNum) { FillMetadata(matrix, dcm); matrix.ZRes = dcm.GetSelector().SliceThickness.Data; } var voxels = SliceReader.ReadVoxels(o.fileName); values.AddRange(voxels); } //Set origin to minimum Z matrix.Origin = new Vector3(matrix.Origin.X, matrix.Origin.Y, ordered.First().z); matrix.CreateMatrix(values.ToArray()); return(matrix); } catch (Exception e) { return(null); } }