public static Texture2D GenerateHistogramTexture(VolumeDataset dataset) { int numSamples = dataset.GetMaxDataValue() + 1; int[] values = new int[numSamples]; Color[] cols = new Color[numSamples]; Texture2D texture = new Texture2D(numSamples, 1, TextureFormat.RGBAFloat, false); int maxFreq = 0; for (int iData = 0; iData < dataset.data.Length; iData++) { values[dataset.data[iData]] += 1; maxFreq = System.Math.Max(values[dataset.data[iData]], maxFreq); } for (int iSample = 0; iSample < numSamples; iSample++) { cols[iSample] = new Color(Mathf.Log10((float)values[iSample]) / Mathf.Log10((float)maxFreq), 0.0f, 0.0f, 1.0f); } texture.SetPixels(cols); texture.Apply(); return(texture); }
private VolumeRenderedObject Import(string dir) { if (Directory.Exists(dir)) { bool recursive = true; // Read all files IEnumerable <string> fileCandidates = Directory.EnumerateFiles(dir, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly) .Where(p => p.EndsWith(".dcm", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicom", StringComparison.InvariantCultureIgnoreCase) || p.EndsWith(".dicm", StringComparison.InvariantCultureIgnoreCase)); if (fileCandidates.Any()) { DICOMImporter importer = new DICOMImporter(fileCandidates, Path.GetFileName(dir)); VolumeDataset dataset = importer.Import(); if (dataset != null) { VolumeRenderedObject vo = VolumeObjectFactory.CreateObject(dataset); vo.transform.Rotate(new Vector3(180, 0, 0)); return(vo); } } else { Debug.LogError("Could not find any DICOM files to import."); } } return(null); }
private void ImportDataset() { DatasetImporterBase importer = null; switch (datasetType) { case DatasetType.Raw: { importer = new RawDatasetImporter(fileToImport, dimX, dimY, dimZ, DataContentFormat.Int16, 6); break; } } VolumeDataset dataset = null; if (importer != null) { dataset = importer.Import(); } if (dataset != null) { VolumeRenderedObject obj = VolumeObjectFactory.CreateObject(dataset); } else { Debug.LogError("Failed to import datset"); } this.Close(); }
public override VolumeDataset Import() { VolumeDataset dataset = new VolumeDataset(); dataset.dimX = dimX; dataset.dimY = dimY; dataset.dimZ = dimZ; FileStream fs = new FileStream(filePath, FileMode.Open); BinaryReader reader = new BinaryReader(fs); if (skipBytes > 0) { reader.ReadBytes(skipBytes); } int uDimension = dimX * dimY * dimZ; dataset.data = new int[uDimension]; int val = 0; for (int i = 0; i < uDimension; i++) { switch (contentFormat) { case DataContentFormat.Int8: val = (int)reader.ReadByte(); break; case DataContentFormat.Int16: val = (int)reader.ReadInt16(); break; case DataContentFormat.Int32: val = (int)reader.ReadInt32(); break; case DataContentFormat.Uint8: val = (int)reader.ReadByte(); break; case DataContentFormat.Uint16: val = (int)reader.ReadUInt16(); break; case DataContentFormat.Uint32: val = (int)reader.ReadUInt32(); break; } dataset.data[i] = val; } Debug.Log("Loaded dataset in range: " + dataset.GetMinDataValue() + " - " + dataset.GetMaxDataValue()); return(dataset); }
public async Task <IActionResult> ImportFromOfficial() { List <VolumeData> newVolumeDatas = await VolumeDataset.GetAllVolumes(); newVolumeDatas.ForEach(data => { _context.VolumeData.Add(data); _context.SaveChanges(); }); return(RedirectToAction(nameof(Index))); }
public static Texture2D Generate2DHistogramTexture(VolumeDataset dataset) { int numSamples = dataset.GetMaxDataValue() + 1; int numGradientSamples = 256; Color[] cols = new Color[numSamples * numGradientSamples]; Texture2D texture = new Texture2D(numSamples, numGradientSamples, TextureFormat.RGBAFloat, false); for (int iCol = 0; iCol < cols.Length; iCol++) { cols[iCol] = new Color(0.0f, 0.0f, 0.0f, 0.0f); } int maxRange = dataset.GetMaxDataValue() - dataset.GetMinDataValue(); const float maxNormalisedMagnitude = 1.75f; // sqrt(1^2 + 1^2 + 1^2) = swrt(3) = a bit less than 1.75 for (int x = 1; x < dataset.dimX - 1; x++) { for (int y = 1; y < dataset.dimY - 1; y++) { for (int z = 1; z < dataset.dimZ - 1; z++) { int iData = x + y * dataset.dimX + z * (dataset.dimX * dataset.dimY); int density = dataset.data[iData]; int x1 = dataset.data[(x + 1) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int x2 = dataset.data[(x - 1) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y1 = dataset.data[x + (y + 1) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y2 = dataset.data[x + (y - 1) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int z1 = dataset.data[x + y * dataset.dimX + (z + 1) * (dataset.dimX * dataset.dimY)]; int z2 = dataset.data[x + y * dataset.dimX + (z - 1) * (dataset.dimX * dataset.dimY)]; Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange); cols[density + (int)(grad.magnitude * numGradientSamples / maxNormalisedMagnitude) * numSamples] = Color.white; } } } texture.SetPixels(cols); texture.Apply(); return(texture); }
private void ImportDataset() { DatasetImporterBase importer = null; switch (datasetType) { case DatasetType.Raw: { importer = new RawDatasetImporter(fileToImport, dimX, dimY, dimZ, DataContentFormat.Int16, 6); break; } case DatasetType.DICOM: { throw new System.NotImplementedException("TODO: implement support for DICOM files"); } } VolumeDataset dataset = null; if (importer != null) { dataset = importer.Import(); } if (dataset != null) { VolumeRenderedObject obj = VolumeObjectFactory.CreateObject(dataset); } else { Debug.LogError("Failed to import datset"); } this.Close(); }
public VolumeDataset CreateDataset() { VolumeDataset dataset = new VolumeDataset(); dataset.dimX = dimX; dataset.dimY = dimY; dataset.dimZ = dimZ; FileStream fs = new FileStream(System.IO.Path.Combine(Application.streamingAssetsPath, filePath), FileMode.Open); BinaryReader reader = new BinaryReader(fs); if (skipBytes > 0) { reader.ReadBytes(skipBytes); } int uDimension = dimX * dimY * dimZ; dataset.texture = new Texture3D(dimX, dimY, dimZ, TextureFormat.RGBAFloat, false); dataset.texture.wrapMode = TextureWrapMode.Clamp; dataset.data = new int[uDimension]; int minVal = int.MaxValue; int maxVal = int.MinValue; int val = 0; for (int i = 0; i < uDimension; i++) { switch (contentFormat) { case DataContentFormat.Int8: val = (int)reader.ReadByte(); break; case DataContentFormat.Int16: val = (int)reader.ReadInt16(); break; case DataContentFormat.Int32: val = (int)reader.ReadInt32(); break; case DataContentFormat.Uint8: val = (int)reader.ReadByte(); break; case DataContentFormat.Uint16: val = (int)reader.ReadUInt16(); break; case DataContentFormat.Uint32: val = (int)reader.ReadUInt32(); break; } minVal = Mathf.Min(minVal, val); maxVal = Mathf.Max(maxVal, val); dataset.data[i] = val; } Debug.Log("Loaded dataset in range: " + minVal + " - " + maxVal); Debug.Log(minVal + " - " + maxVal); dataset.minDataValue = minVal; dataset.maxDataValue = maxVal; return(dataset); }
public void Import() { dataset = CreateDataset(); Program.instance.volumeRenderedObject = CreateVolumeRenderedObject(dataset); }
public VolumeRenderedObject CreateVolumeRenderedObject(VolumeDataset dataset) { GameObject go = GameObject.Instantiate(volumeObjectPrefab) as GameObject; go.transform.SetParent(Program.instance.operationOverlay.transform); go.transform.localPosition = new Vector3(-0.0083f, 0.0426f, 0.0083f); go.transform.rotation = Quaternion.Euler(-20f, 180f, 180f); VolumeRenderedObject volObj = go.GetComponent <VolumeRenderedObject>(); MeshRenderer meshRenderer = go.GetComponent <MeshRenderer>(); volObj.dataset = dataset; int dimX = dataset.dimX; int dimY = dataset.dimY; int dimZ = dataset.dimZ; int maxRange = dataset.maxDataValue - dataset.minDataValue; Color[] cols = new Color[dataset.data.Length]; for (int x = 0; x < dataset.dimX; x++) { for (int y = 0; y < dataset.dimY; y++) { for (int z = 0; z < dataset.dimZ; z++) { int iData = x + y * dimX + z * (dimX * dimY); int x1 = dataset.data[Mathf.Min(x + 1, dimX - 1) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int x2 = dataset.data[Mathf.Max(x - 1, 0) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y1 = dataset.data[x + Mathf.Min(y + 1, dimY - 1) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y2 = dataset.data[x + Mathf.Max(y - 1, 0) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int z1 = dataset.data[x + y * dataset.dimX + Mathf.Min(z + 1, dimZ - 1) * (dataset.dimX * dataset.dimY)]; int z2 = dataset.data[x + y * dataset.dimX + Mathf.Max(z - 1, 0) * (dataset.dimX * dataset.dimY)]; Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange); cols[iData] = new Color(grad.x, grad.y, grad.z, (float)dataset.data[iData] / (float)dataset.maxDataValue); } } } dataset.texture.SetPixels(cols); dataset.texture.Apply(); Texture3D tex = dataset.texture; const int noiseDimX = 512; const int noiseDimY = 512; Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY); TransferFunction tf = Program.instance.transferFunctionManager.CreateTransferFunction(); Texture2D tfTexture = tf.GetTexture(); volObj.transferFunction = tf; tf.histogramTexture = HistogramTextureGenerator.GenerateHistogramTexture(dataset); TransferFunction2D tf2D = new TransferFunction2D(); tf2D.AddBox(0.05f, 0.1f, 0.8f, 0.7f, Color.white, 0.4f); volObj.transferFunction2D = tf2D; meshRenderer.sharedMaterial.SetTexture("_DataTex", tex); meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture); meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture); meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR"); meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP"); meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF"); return(volObj); }
public static VolumeRenderedObject CreateObject(VolumeDataset dataset) { GameObject obj = GameObject.Instantiate((GameObject)Resources.Load("VolumeRenderedObject")); VolumeRenderedObject volObj = obj.GetComponent <VolumeRenderedObject>(); MeshRenderer meshRenderer = obj.GetComponent <MeshRenderer>(); volObj.dataset = dataset; int dimX = dataset.dimX; int dimY = dataset.dimY; int dimZ = dataset.dimZ; int maxRange = dataset.maxDataValue - dataset.minDataValue; Color[] cols = new Color[dataset.data.Length]; for (int x = 0; x < dataset.dimX; x++) { for (int y = 0; y < dataset.dimY; y++) { for (int z = 0; z < dataset.dimZ; z++) { int iData = x + y * dimX + z * (dimX * dimY); int x1 = dataset.data[Math.Min(x + 1, dimX - 1) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int x2 = dataset.data[Math.Max(x - 1, 0) + y * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y1 = dataset.data[x + Math.Min(y + 1, dimY - 1) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int y2 = dataset.data[x + Math.Max(y - 1, 0) * dataset.dimX + z * (dataset.dimX * dataset.dimY)]; int z1 = dataset.data[x + y * dataset.dimX + Math.Min(z + 1, dimZ - 1) * (dataset.dimX * dataset.dimY)]; int z2 = dataset.data[x + y * dataset.dimX + Math.Max(z - 1, 0) * (dataset.dimX * dataset.dimY)]; Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange); cols[iData] = new Color(grad.x, grad.y, grad.z, (float)dataset.data[iData] / (float)dataset.maxDataValue); } } } dataset.texture.SetPixels(cols); dataset.texture.Apply(); Texture3D tex = dataset.texture; const int noiseDimX = 512; const int noiseDimY = 512; Texture2D noiseTexture = NoiseTextureGenerator.GenerateNoiseTexture(noiseDimX, noiseDimY); TransferFunction tf = new TransferFunction(); tf.AddControlPoint(new TFColourControlPoint(0.0f, new Color(0.11f, 0.14f, 0.13f, 1.0f))); tf.AddControlPoint(new TFColourControlPoint(0.2415f, new Color(0.469f, 0.354f, 0.223f, 1.0f))); tf.AddControlPoint(new TFColourControlPoint(0.3253f, new Color(1.0f, 1.0f, 1.0f, 1.0f))); tf.AddControlPoint(new TFAlphaControlPoint(0.0f, 0.0f)); tf.AddControlPoint(new TFAlphaControlPoint(0.1787f, 0.0f)); tf.AddControlPoint(new TFAlphaControlPoint(0.2f, 0.024f)); tf.AddControlPoint(new TFAlphaControlPoint(0.28f, 0.03f)); tf.AddControlPoint(new TFAlphaControlPoint(0.4f, 0.546f)); tf.AddControlPoint(new TFAlphaControlPoint(0.547f, 0.5266f)); tf.GenerateTexture(); Texture2D tfTexture = tf.GetTexture(); volObj.transferFunction = tf; tf.histogramTexture = HistogramTextureGenerator.GenerateHistogramTexture(dataset); TransferFunction2D tf2D = new TransferFunction2D(); tf2D.AddBox(0.05f, 0.1f, 0.8f, 0.7f, Color.white, 0.4f); volObj.transferFunction2D = tf2D; meshRenderer.sharedMaterial.SetTexture("_DataTex", tex); meshRenderer.sharedMaterial.SetTexture("_NoiseTex", noiseTexture); meshRenderer.sharedMaterial.SetTexture("_TFTex", tfTexture); meshRenderer.sharedMaterial.EnableKeyword("MODE_DVR"); meshRenderer.sharedMaterial.DisableKeyword("MODE_MIP"); meshRenderer.sharedMaterial.DisableKeyword("MODE_SURF"); return(volObj); }