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);
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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();
    }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
        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);
    }
Ejemplo n.º 7
0
    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);
    }
Ejemplo n.º 11
0
    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);
    }