public TransData(VolumetricData vData, int[] t, double fi, double[] ax)
        {
            rnd              = new Random();
            this.vData       = vData;
            this.Measures    = new int[3];
            this.Measures[0] = 100;             //vData.Measures[0] - t[0] - 400;
            this.Measures[1] = 80;              //vData.Measures[1] - t[1] - 400;
            this.Measures[2] = 120;             //vData.Measures[2] - t[2] - 400;

            fi            = Math.PI * fi / 180; //degrees to radians
            this.xSpacing = vData.XSpacing;
            this.ySpacing = vData.YSpacing;
            this.zSpacing = vData.ZSpacing;

            this.RotationM = Matrix <double> .Build.Dense(3, 3);

            this.Translation = Vector <double> .Build.Dense(3);

            this.Translation[0] = t[0] * XSpacing;
            this.Translation[1] = t[1] * YSpacing;
            this.Translation[2] = t[2] * ZSpacing;

            this.RotationM[0, 0] = Math.Cos(fi) + ax[0] * ax[0] * (1 - Math.Cos(fi));
            this.RotationM[0, 1] = ax[0] * ax[1] * (1 - Math.Cos(fi)) - ax[2] * Math.Sin(fi);
            this.RotationM[0, 2] = ax[0] * ax[2] * (1 - Math.Cos(fi)) + ax[1] * Math.Sin(fi);
            this.RotationM[1, 0] = ax[0] * ax[1] * (1 - Math.Cos(fi)) + ax[2] * Math.Sin(fi);
            this.RotationM[1, 1] = Math.Cos(fi) + ax[1] * ax[1] * (1 - Math.Cos(fi));
            this.RotationM[1, 2] = ax[1] * ax[2] * (1 - Math.Cos(fi)) - ax[0] * Math.Sin(fi);
            this.RotationM[2, 0] = ax[0] * ax[2] * (1 - Math.Cos(fi)) - ax[1] * Math.Sin(fi);
            this.RotationM[2, 1] = ax[1] * ax[2] * (1 - Math.Cos(fi)) + ax[0] * Math.Sin(fi);
            this.RotationM[2, 2] = Math.Cos(fi) + ax[2] * ax[2] * (1 - Math.Cos(fi));
        }
Пример #2
0
        public VolumetricData CutVol(int[] translation)
        {
            int xRes = Measures[0] - translation[0];
            int yRes = Measures[1] - translation[1];
            int zRes = Measures[2] - translation[2];

            int[][,] cut = new int[zRes][, ];

            for (int k = 0; k < zRes; k++)
            {
                cut[k] = new int[xRes, yRes];
                for (int i = 0; i < xRes; i++)
                {
                    for (int j = 0; j < yRes; j++)
                    {
                        cut[k][i, j] = VData[translation[2] + k][translation[0] + i, translation[1] + j];
                    }
                }
            }

            Data           copy  = new Data(this.Data);
            VolumetricData vDnew = new VolumetricData(copy);

            vDnew.VData    = cut;
            vDnew.Measures = new int[] { xRes, yRes, zRes };

            return(vDnew);
        }
Пример #3
0
        public static TransData SettingFakeData(string macro, int[] translation, double phi, double[] axis)
        {
            VolumetricData vDataMacro = new VolumetricData(macro);
            TransData      td         = new TransData(vDataMacro, translation, phi, axis);

            iDataMicro = td;
            iDataMacro = vDataMacro;

            return(td);
        }
Пример #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="point"></param>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <param name="v3"></param>
        /// <param name="xRes"></param>
        /// <param name="yRes"></param>
        /// <param name="zRes"></param>
        /// <param name="spacing"></param>
        /// <returns></returns>
        public VolumetricData Cut3D(double[] point, double[] v1, double[] v2, double[] v3, int xRes, int yRes, int zRes, double spacing)
        {
            ISpacing = spacing;

            double[] vertical2 = Orthogonalize2D(v1, v2);
            double[] vertical3 = Orthogonalize3D(v1, vertical2, v3);
            double   lengthV1  = Math.Sqrt(ScalarProduct(v1, v1));
            double   lengthV2  = Math.Sqrt(ScalarProduct(vertical2, vertical2));
            double   lengthV3  = Math.Sqrt(ScalarProduct(vertical3, vertical3));

            double[] unitVector1 = new double[3];
            double[] unitVector2 = new double[3];
            double[] unitVector3 = new double[3];
            for (int i = 0; i < v1.Length; i++)
            {
                unitVector1[i] = v1[i] * ISpacing / lengthV1;
                unitVector2[i] = vertical2[i] * ISpacing / lengthV2;
                unitVector3[i] = vertical3[i] * ISpacing / lengthV3;
            }

            int[][,] cut = new int[zRes][, ];
            double x, y, z;

            for (int k = 0; k < zRes; k++)
            {
                cut[k] = new int[xRes, yRes];
                for (int i = 0; i < xRes; i++)
                {
                    x = point[0] + i * unitVector2[0] + k * unitVector3[0];
                    y = point[1] + i * unitVector2[1] + k * unitVector3[1];
                    z = point[2] + i * unitVector2[2] + k * unitVector3[2];

                    for (int j = 0; j < yRes; j++)
                    {
                        cut[k][i, j] = (int)GetValueMatrixCoordinates(x, y, z);

                        x += unitVector1[0];
                        y += unitVector1[1];
                        z += unitVector1[2];
                    }
                }
            }

            VolumetricData vDnew = new VolumetricData(Data);

            vDnew.VData = cut;

            return(vDnew);
        }
Пример #5
0
        public static void TestFeatureVector(string macro, int countPoints, int countSimilarities, int a)
        {
            Random           rnd        = new Random();
            IFeatureComputer fc         = new FeatureComputerNormedRings();
            VolumetricData   vDataMacro = new VolumetricData(macro);

            iDataMacro = vDataMacro;
            ISampler s = new Sampler(configuration);

            Point3D[] pointsM = s.Sample(iDataMacro, countPoints);


            double[] distanceFC   = new double[countSimilarities];
            double[] distanceReal = new double[countSimilarities];
            Console.WriteLine("Computing similarities");
            int index1 = rnd.Next(0, countPoints);
            int index2 = index1;

            //Point3D p1 = pointsM[index1];
            //List<Point3D> pMacro = GetSphere(p1, 15, countSimilarities);
            //Point3D[] pointsMacro = pMacro.ToArray();
            //double[] point = new double[] { p1.X, p1.Y, p1.Z };

            //FeatureVector f1 = fc.ComputeFeatureVector(iDataMacro, p1);
            for (int i = 0; i < countSimilarities; i++)
            {
                if (i % 10000 == 0)
                {
                    Console.WriteLine("i= " + i);
                }
                Point3D       p1 = pointsM[index1];
                Point3D       p2 = pointsM[index2];
                FeatureVector f2 = fc.ComputeFeatureVector(iDataMacro, p2);
                FeatureVector f1 = fc.ComputeFeatureVector(iDataMacro, p1);
                // counting similarity
                distanceFC[i]   = f1.DistTo2(f2);
                distanceReal[i] = Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y) + (p1.Z - p2.Z) * (p1.Z - p2.Z));
                index2          = rnd.Next(0, countPoints);
                index1          = rnd.Next(0, countPoints);
            }

            //WriteCSVdouble(point, "d:\\FC_test/point" + a + ".csv");
            WriteCSVdouble(distanceFC, "d:\\FC_test/distanceFC" + a + ".csv");
            WriteCSVdouble(distanceReal, "d:\\FC_test/distanceReal" + a + ".csv");
        }
Пример #6
0
        public Point3D[] Sample(VolumetricData d, int count, int radius)
        {
            this.pointsMax = new Point3D[count];
            this.pointsMin = new Point3D[count];
            int[]  measures = d.Measures;
            Random r        = new Random(); // change rnd

            for (int i = 0; i < count; i++)
            {
                double x = r.Next(translationX + radius, measures[0] - radius);
                double y = r.Next(translationY + radius, measures[1] - radius);
                double z = r.Next(translationZ + radius, measures[2] - radius);

                pointsMax[i] = new Point3D(x, y, z);
            }
            GetSamples2();
            return(pointsMax);
        }
Пример #7
0
        public static void MainFunction(string micro, string macro, Point3D[] pointsMicro, Point3D[] pointsMacro) // the truly main function
        {
            //----------------------------------------PARAMETERS----------------------------------------------
            int              numberOfPointsMicro = 1_000;
            int              numberOfPointsMacro = 1_000;
            double           threshold           = 10; //percentage
            ISampler         s           = new Sampler(configuration);
            IFeatureComputer fc          = new FeatureComputer();
            IMatcher         matcher     = new Matcher();
            ITransformer     transformer = new Transformer3D();

            //----------------------------------------MICRO CT------------------------------------------------
            Console.WriteLine("Reading micro data.");
            VolumetricData vDataMicro = new VolumetricData(micro);

            iDataMicro = vDataMicro;
            Console.WriteLine("Data read succesfully.");
            Console.WriteLine("Sampling.");
            //Point3D[] pointsMicro = s.Sample(iDataMicro, numberOfPointsMicro);

            FeatureVector[] featureVectorsMicro = new FeatureVector[pointsMicro.Length];

            Console.WriteLine("Computing feature vectors.");
            for (int i = 0; i < pointsMicro.Length; i++)
            {
                featureVectorsMicro[i] = fc.ComputeFeatureVector(iDataMicro, pointsMicro[i]);
            }

            //----------------------------------------MACRO CT------------------------------------------------
            Console.WriteLine("\nReading macro data.");
            VolumetricData vDataMacro = new VolumetricData(macro);

            iDataMacro = vDataMacro;
            Console.WriteLine("Data read succesfully.");
            Console.WriteLine("Sampling.");
            //Point3D[] pointsMacro = s.Sample(iDataMacro, numberOfPointsMacro);

            FeatureVector[] featureVectorsMacro = new FeatureVector[pointsMacro.Length];

            Console.WriteLine("Computing feature vectors.");
            for (int i = 0; i < pointsMacro.Length; i++)
            {
                featureVectorsMacro[i] = fc.ComputeFeatureVector(iDataMacro, pointsMacro[i]);
            }

            //----------------------------------------MATCHES-------------------------------------------------
            Console.WriteLine("\nMatching.");
            Match[] matches = matcher.Match(featureVectorsMicro, featureVectorsMacro, threshold);
            Console.WriteLine("Count of matches: " + matches.Length);

            //------------------------------------GET TRANSFORMATION -----------------------------------------
            Console.WriteLine("Computing transformations.\n");

            List <Transform3D> transformations = new List <Transform3D>();

            for (int i = 0; i < matches.Length; i++)
            {
                transformations.Add(transformer.GetTransformation(matches[i], iDataMicro, iDataMacro));
                //transformations.Add(transformer.GetTransformation(matches[i], vData, vData2, configuration));
            }

            Candidate.initSums(iDataMicro.Measures[0] / iDataMicro.XSpacing, iDataMicro.Measures[1] / iDataMicro.YSpacing, iDataMicro.Measures[2] / iDataMicro.ZSpacing);
            Density     d        = new Density(); // finder, we need an instance for certain complicated reason
            Transform3D solution = d.Find(transformations.ToArray());

            Console.WriteLine("Solution found.");
            Console.WriteLine(solution);

            Cut(solution.RotationMatrix, solution.TranslationVector);
        }
 //Uses configuration file
 public Point3D[] Sample(VolumetricData d)
 {
     return(Sample(d, Convert.ToInt32(configuration["Sampling:count"])));
 }