示例#1
0
文件: Harris.cs 项目: FunRock11/ITOI
        public Harris(Img image, int windowradius, double r)
        {
            Image        = image;
            WindowRadius = windowradius;
            R            = r;

            GaussMatrix = new GaussCore(windowradius, 1);
            MTX         = F.Svertka(Image.GrayMatrixDouble, Image.Width, Image.Height, GaussMatrix.Matrix, GaussMatrix.Radius, 1);

            Derivative();
            Minl();
            IntPoints1();
            PColor(1);
        }
示例#2
0
文件: Moravek.cs 项目: FunRock11/ITOI
        public Moravek(Img image, int windowradius, double r)
        {
            Image = image;

            GaussCore GaussMatrix = new GaussCore(1);

            Mtx          = F.Svertka(Image.GrayMatrixDouble, Image.Width, Image.Height, GaussMatrix.Matrix, GaussMatrix.Radius, 1);
            WindowRadius = windowradius;
            R            = r;

            MoravekS();
            IntPoints1();
            IWP(1);
        }
示例#3
0
文件: SIFT.cs 项目: FunRock11/ITOI
        private void Piramids()
        {
            double sigma0 = 1.6;                              // sigma 0
            double k      = Math.Pow(2.0, (1.0 / (double)S)); // Интервал между масштабами

            int minr = Math.Min(BeginImage.Width, BeginImage.Height);

            O = 0;
            while (minr > 32)
            {
                minr /= 2;
                O++;
            }

            Piramida = new Img[O + 1, S + 3];
            DoG      = new Img[O + 1, S + 2];

            Img    TekImg   = new Img(BeginImage.Bitmap);
            double sigmaD   = sigma0;                      // Действительная сигма
            double sigmaTEK = sigma0;
            int    qq       = 1;

            GaussCore GaussMatrix = new GaussCore(sigma0);

            TekImg.SvertkaWithNormalize(GaussMatrix.Matrix, GaussMatrix.Radius, 1);
            Piramida[0, 0] = new Img(TekImg.Bitmap);

            GlobalSigma = new double[O + 1, S + 3];
            Sigma       = new double[O + 1, S + 3];


            Sigma[0, 0]       = sigmaTEK;
            GlobalSigma[0, 0] = sigmaD;

            for (int o = 0; o < O + 1; o++)
            {
                TekImg = new Img(Piramida[o, 0].Bitmap);
                for (int s = 1; s < S + 3; s++)
                {
                    double sigma1 = sigma0 * Math.Pow(k, (s - 1));
                    double sigma2 = sigma0 * Math.Pow(k, s);
                    sigmaTEK          = Math.Sqrt(sigma2 * sigma2 - sigma1 * sigma1); // Текущая сигма
                    Sigma[o, s]       = sigma2;
                    sigmaD            = sigma0 * Math.Pow(k, qq);
                    GlobalSigma[o, s] = sigmaD;
                    qq++;
                    GaussMatrix = new GaussCore(sigmaTEK);
                    TekImg.SvertkaWithNormalize(GaussMatrix.Matrix, GaussMatrix.Radius, 1);
                    Piramida[o, s] = new Img(TekImg.Bitmap);

                    if ((o + 1) != (O + 1) && s == S)
                    {
                        Piramida[o + 1, 0] = new Img(TekImg.Bitmap);
                        Piramida[o + 1, 0].Downsample();

                        Sigma[o + 1, 0]       = sigma0;
                        GlobalSigma[o + 1, 0] = sigmaD;
                    }
                }
                qq = qq - 2;
            }

            for (int o = 0; o < O + 1; o++)
            {
                for (int s = 0; s < S + 2; s++)
                {
                    double[,] RMtx = new double[Piramida[o, 0].Height, Piramida[o, 0].Width];
                    for (int y = 0; y < Piramida[o, 0].Height; y++)
                    {
                        for (int x = 0; x < Piramida[o, 0].Width; x++)
                        {
                            RMtx[y, x] = Math.Abs(Piramida[o, s + 1].GrayMatrixDouble[y, x] - Piramida[o, s].GrayMatrixDouble[y, x]);
                        }
                    }
                    DoG[o, s] = new Img(RMtx, Piramida[o, 0].Width, Piramida[o, 0].Height);
                    DoG[o, s].Save(BasePath + "Lab 6/i" + Convert.ToString(o) + Convert.ToString(s) + ".png");
                }
            }
        }
示例#4
0
文件: Harris.cs 项目: FunRock11/ITOI
        private void Descr5(int NewHeight, int NewWidth)
        {
            Descriptors  = new double[NewPoints, 16 * 8];
            Descriptors2 = new double[NewPoints, 16 * 8];
            for (int i = 0; i < NewPoints; i++)
            {
                Descriptors2[i, 0] = -1;
            }
            GaussCore gauss = new GaussCore(8, 1);

            double[,] korzina  = new double[8, 2];
            double[,] korzinaO = new double[36, 2];
            for (int i = 0; i < 8; i++)
            {
                korzina[i, 0] = (Math.PI / 4) * i;
                korzina[i, 1] = (Math.PI / 4) * (i + 1);
            }
            for (int i = 0; i < 36; i++)
            {
                korzinaO[i, 0] = (Math.PI / 18) * i;
                korzinaO[i, 1] = (Math.PI / 18) * (i + 1);
            }

            int point = -1;

            for (int y = 0; y < NewHeight; y++)
            {
                for (int x = 0; x < NewWidth; x++)
                {
                    if (InterestingPointsAdd[y, x])
                    {
                        point++;
                        double[] D      = new double[36];
                        int      region = 0;
                        for (int RegionY = -2; RegionY < 2; RegionY++)
                        {
                            for (int RegionX = -2; RegionX < 2; RegionX++)
                            {
                                for (int dy = 0; dy < 4; dy++)
                                {
                                    for (int dx = 0; dx < 4; dx++)
                                    {
                                        double L  = SobelAdd[y + RegionY * 4 + dy, x + RegionX * 4 + dx];
                                        double Fi = ThetaAdd[y + RegionY * 4 + dy, x + RegionX * 4 + dx];
                                        if (Fi == 0)
                                        {
                                            Fi = Math.PI * 2;
                                        }
                                        int    korzina1 = -10, korzina2 = -10; // смежные корзины
                                        double c1 = 0, c2 = 0;                 // коэф-ты для корзин
                                        for (int i = 0; i < 36; i++)
                                        {
                                            if (Fi == korzinaO[i, 1])
                                            {
                                                korzina1 = i;
                                                korzina2 = i + 1;
                                                if (korzina2 == 36)
                                                {
                                                    korzina2 = 0;
                                                }
                                                c1 = 0.5;
                                                c2 = 0.5;
                                            }
                                        }
                                        if (korzina1 == -10 || korzina2 == -10)
                                        {
                                            for (int i = 0; i < 36; i++)
                                            {
                                                if (Fi > korzinaO[i, 0] && Fi < korzinaO[i, 1])
                                                {
                                                    korzina1 = i;
                                                    double a1 = korzinaO[i, 1] - Fi;
                                                    double a0 = Fi - korzinaO[i, 0];
                                                    if (a0 > a1)
                                                    {
                                                        korzina2 = i + 1;
                                                        if (korzina2 == 36)
                                                        {
                                                            korzina2 = 0;
                                                        }

                                                        double d = Math.PI / 18;
                                                        double b = a1 + (Math.PI / 36);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else if (a1 > a0)
                                                    {
                                                        korzina2 = i - 1;
                                                        if (korzina2 == -1)
                                                        {
                                                            korzina2 = 35;
                                                        }

                                                        double d = Math.PI / 18;
                                                        double b = a0 + (Math.PI / 36);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else
                                                    {
                                                        korzina2 = 0;
                                                        c1       = 1;
                                                        c2       = 0;
                                                    }
                                                }
                                            }
                                        }

                                        double L1 = L * gauss.Matrix[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                        D[korzina1] += L1 * c1;
                                        D[korzina2] += L1 * c2;
                                    }
                                }
                                region++;
                            }
                        }
                        //double[] DR = new double[36];

                        /*
                         * for (int i = 0; i < 36; i++)
                         * {
                         *  for (int j = 0; j < 16; j++)
                         *  {
                         *      DR[i] = D[j * 36 + i];
                         *  }
                         * }*/
                        /* Ищем пики */
                        double GMaxVal1 = -999999999;
                        double GMaxVal2 = -999999999;
                        int    GMax1    = 0;
                        int    GMax2    = 0;

                        for (int i = 0; i < 36; i++)
                        {
                            if (D[i] > GMaxVal1)
                            {
                                GMaxVal1 = D[i];
                                GMax1    = i;
                            }
                        }
                        for (int i = 0; i < 36; i++)
                        {
                            if (i == GMax1)
                            {
                                continue;
                            }
                            else if (D[i] > GMaxVal2)
                            {
                                GMaxVal2 = D[i];
                                GMax2    = i;
                            }
                        }

                        double alpha1 = (korzinaO[GMax1, 1] - korzinaO[GMax1, 0]) / 2 + korzinaO[GMax1, 0];
                        /*------------------------*/

                        int[,] mX = new int[16, 16];
                        int[,] mY = new int[16, 16];

                        for (int cy = 0; cy < 16; cy++)
                        {
                            for (int cx = 0; cx < 16; cx++)
                            {
                                int dx = cx - 8;
                                int dy = cy - 8;
                                mX[cy, cx] = Convert.ToInt32(Math.Round(dx * Math.Cos(alpha1) + dy * Math.Sin(alpha1)));
                                mY[cy, cx] = Convert.ToInt32(Math.Round(dy * Math.Cos(alpha1) - dx * Math.Sin(alpha1)));
                            }
                        }

                        D      = new double[16 * 8];
                        region = 0;
                        for (int RegionY = -2; RegionY < 2; RegionY++)
                        {
                            for (int RegionX = -2; RegionX < 2; RegionX++)
                            {
                                for (int dy = 0; dy < 4; dy++)
                                {
                                    for (int dx = 0; dx < 4; dx++)
                                    {
                                        //int Nx = x + RegionX * 4 + dx;
                                        //int Ny = y + RegionY * 4 + dy;

                                        int cx = mX[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                        int cy = mY[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];

                                        double L  = SobelAdd[y + cy, x + cx];
                                        double Fi = ThetaAdd[y + cy, x + cx] - alpha1;

                                        if (Fi <= 0)
                                        {
                                            Fi = Fi + Math.PI * 2;
                                        }
                                        int    korzina1 = -10, korzina2 = -10; // смежные корзины
                                        double c1 = 0, c2 = 0;                 // коэф-ты для корзин
                                        for (int i = 0; i < 8; i++)
                                        {
                                            if (Fi == korzina[i, 1])
                                            {
                                                korzina1 = i;
                                                korzina2 = i + 1;
                                                if (korzina2 == 8)
                                                {
                                                    korzina2 = 0;
                                                }
                                                c1 = 0.5;
                                                c2 = 0.5;
                                            }
                                        }
                                        if (korzina1 == -10 || korzina2 == -10)
                                        {
                                            for (int i = 0; i < 8; i++)
                                            {
                                                if (Fi > korzina[i, 0] && Fi < korzina[i, 1])
                                                {
                                                    korzina1 = i;
                                                    double a1 = korzina[i, 1] - Fi;
                                                    double a0 = Fi - korzina[i, 0];
                                                    if (a0 > a1)
                                                    {
                                                        korzina2 = i + 1;
                                                        if (korzina2 == 8)
                                                        {
                                                            korzina2 = 0;
                                                        }

                                                        double d = Math.PI / 4;
                                                        double b = a1 + (Math.PI / 8);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else if (a1 > a0)
                                                    {
                                                        korzina2 = i - 1;
                                                        if (korzina2 == -1)
                                                        {
                                                            korzina2 = 7;
                                                        }

                                                        double d = Math.PI / 4;
                                                        double b = a0 + (Math.PI / 8);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else
                                                    {
                                                        korzina2 = 0;
                                                        c1       = 1;
                                                        c2       = 0;
                                                    }
                                                }
                                            }
                                        }

                                        double L1 = L * gauss.Matrix[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                        D[region * 8 + korzina1] += L1 * c1;
                                        D[region * 8 + korzina2] += L1 * c2;
                                    }
                                }
                                region++;
                            }
                        }
                        D = F.NormalizeVector(D, 16 * 8, 0, 1);
                        for (int i = 0; i < 16 * 8; i++)
                        {
                            if (D[i] > 0.2)
                            {
                                D[i] = 0.2;
                            }
                        }
                        D = F.NormalizeVector(D, 16 * 8, 0, 1);
                        for (int i = 0; i < 16 * 8; i++)
                        {
                            Descriptors[point, i] = D[i];
                        }

                        /*------------------------*/

                        if (GMaxVal2 / GMaxVal1 >= 0.8)
                        {
                            double alpha2 = (korzinaO[GMax2, 1] - korzinaO[GMax2, 0]) / 2 + korzinaO[GMax2, 0];
                            /*------------------------*/

                            mX = new int[16, 16];
                            mY = new int[16, 16];

                            for (int cy = 0; cy < 16; cy++)
                            {
                                for (int cx = 0; cx < 16; cx++)
                                {
                                    mX[cy, cx] = Convert.ToInt32(Math.Round(cx * Math.Cos(alpha2) + cy * Math.Sin(alpha2)));
                                    mY[cy, cx] = Convert.ToInt32(Math.Round(cy * Math.Cos(alpha2) - cx * Math.Sin(alpha2)));
                                }
                            }

                            D      = new double[16 * 8];
                            region = 0;
                            for (int RegionY = -2; RegionY < 2; RegionY++)
                            {
                                for (int RegionX = -2; RegionX < 2; RegionX++)
                                {
                                    for (int dy = 0; dy < 4; dy++)
                                    {
                                        for (int dx = 0; dx < 4; dx++)
                                        {
                                            //int Nx = x + RegionX * 4 + dx;
                                            //int Ny = y + RegionY * 4 + dy;

                                            int cx = mX[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                            int cy = mY[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];

                                            double L  = SobelAdd[y + cy - 8, x + cx - 8];
                                            double Fi = ThetaAdd[y + cy - 8, x + cx - 8] - alpha2;
                                            if (Fi <= 0)
                                            {
                                                Fi = Fi + Math.PI * 2;
                                            }
                                            int    korzina1 = -10, korzina2 = -10; // смежные корзины
                                            double c1 = 0, c2 = 0;                 // коэф-ты для корзин
                                            for (int i = 0; i < 8; i++)
                                            {
                                                if (Fi == korzina[i, 1])
                                                {
                                                    korzina1 = i;
                                                    korzina2 = i + 1;
                                                    if (korzina2 == 8)
                                                    {
                                                        korzina2 = 0;
                                                    }
                                                    c1 = 0.5;
                                                    c2 = 0.5;
                                                }
                                            }
                                            if (korzina1 == -10 || korzina2 == -10)
                                            {
                                                for (int i = 0; i < 8; i++)
                                                {
                                                    if (Fi > korzina[i, 0] && Fi < korzina[i, 1])
                                                    {
                                                        korzina1 = i;
                                                        double a1 = korzina[i, 1] - Fi;
                                                        double a0 = Fi - korzina[i, 0];
                                                        if (a0 > a1)
                                                        {
                                                            korzina2 = i + 1;
                                                            if (korzina2 == 8)
                                                            {
                                                                korzina2 = 0;
                                                            }

                                                            double d = Math.PI / 4;
                                                            double b = a1 + (Math.PI / 8);
                                                            c1 = b / d;
                                                            c2 = 1 - c1;
                                                        }
                                                        else if (a1 > a0)
                                                        {
                                                            korzina2 = i - 1;
                                                            if (korzina2 == -1)
                                                            {
                                                                korzina2 = 7;
                                                            }

                                                            double d = Math.PI / 4;
                                                            double b = a0 + (Math.PI / 8);
                                                            c1 = b / d;
                                                            c2 = 1 - c1;
                                                        }
                                                        else
                                                        {
                                                            korzina2 = 0;
                                                            c1       = 1;
                                                            c2       = 0;
                                                        }
                                                    }
                                                }
                                            }

                                            double L1 = L * gauss.Matrix[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                            D[region * 8 + korzina1] += L1 * c1;
                                            D[region * 8 + korzina2] += L1 * c2;
                                        }
                                    }
                                    region++;
                                }
                            }
                            D = F.NormalizeVector(D, 16 * 8, 0, 1);
                            for (int i = 0; i < 16 * 8; i++)
                            {
                                if (D[i] > 0.2)
                                {
                                    D[i] = 0.2;
                                }
                            }
                            D = F.NormalizeVector(D, 16 * 8, 0, 1);
                            for (int i = 0; i < 16 * 8; i++)
                            {
                                Descriptors2[point, i] = D[i];
                            }

                            /*------------------------*/
                        }
                    }
                }
            }
        }
示例#5
0
文件: Harris.cs 项目: FunRock11/ITOI
        private void Descr4(int NewHeight, int NewWidth)
        {
            Descriptors = new double[NewPoints, 16 * 8];
            GaussCore gauss = new GaussCore(8, 1);

            double[,] korzina = new double[8, 2];
            for (int i = 0; i < 8; i++)
            {
                korzina[i, 0] = (Math.PI / 4) * i;
                korzina[i, 1] = (Math.PI / 4) * (i + 1);
            }

            int point = -1;

            for (int y = 0; y < NewHeight; y++)
            {
                for (int x = 0; x < NewWidth; x++)
                {
                    if (InterestingPointsAdd[y, x])
                    {
                        point++;
                        double[] D      = new double[16 * 8];
                        int      region = 0;
                        for (int RegionY = -2; RegionY < 2; RegionY++)
                        {
                            for (int RegionX = -2; RegionX < 2; RegionX++)
                            {
                                for (int dy = 0; dy < 4; dy++)
                                {
                                    for (int dx = 0; dx < 4; dx++)
                                    {
                                        double L = SobelAdd[y + RegionY * 4 + dy, x + RegionX * 4 + dx];
                                        double Fi = ThetaAdd[y + RegionY * 4 + dy, x + RegionX * 4 + dx];
                                        int    korzina1 = -10, korzina2 = -10; // смежные корзины
                                        double c1 = 0, c2 = 0;                 // коэф-ты для корзин
                                        for (int i = 0; i < 8; i++)
                                        {
                                            if (Fi == korzina[i, 1])
                                            {
                                                korzina1 = i;
                                                korzina2 = i + 1;
                                                if (korzina2 == 8)
                                                {
                                                    korzina2 = 0;
                                                }
                                                c1 = 0.5;
                                                c2 = 0.5;
                                            }
                                        }
                                        if (korzina1 == -10 || korzina2 == -10)
                                        {
                                            for (int i = 0; i < 8; i++)
                                            {
                                                if (Fi > korzina[i, 0] && Fi < korzina[i, 1])
                                                {
                                                    korzina1 = i;
                                                    double a1 = korzina[i, 1] - Fi;
                                                    double a0 = Fi - korzina[i, 0];
                                                    if (a0 > a1)
                                                    {
                                                        korzina2 = i + 1;
                                                        if (korzina2 == 8)
                                                        {
                                                            korzina2 = 0;
                                                        }

                                                        double d = Math.PI / 4;
                                                        double b = a1 + (Math.PI / 8);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else if (a1 > a0)
                                                    {
                                                        korzina2 = i - 1;
                                                        if (korzina2 == -1)
                                                        {
                                                            korzina2 = 7;
                                                        }

                                                        double d = Math.PI / 4;
                                                        double b = a0 + (Math.PI / 8);
                                                        c1 = b / d;
                                                        c2 = 1 - c1;
                                                    }
                                                    else
                                                    {
                                                        korzina2 = 0;
                                                        c1       = 1;
                                                        c2       = 0;
                                                    }
                                                }
                                            }
                                        }

                                        double L1 = L * gauss.Matrix[(RegionY + 2) * 4 + dy, (RegionX + 2) * 4 + dx];
                                        D[region * 8 + korzina1] += L1 * c1;
                                        D[region * 8 + korzina2] += L1 * c2;
                                    }
                                }
                                region++;
                            }
                        }

                        D = F.NormalizeVector(D, 8 * 16, 0, 1);
                        for (int i = 0; i < 8 * 16; i++)
                        {
                            if (D[i] > 0.2)
                            {
                                D[i] = 0.2;
                            }
                        }
                        D = F.NormalizeVector(D, 8 * 16, 0, 1);
                        for (int i = 0; i < 8 * 16; i++)
                        {
                            Descriptors[point, i] = D[i];
                        }
                    }
                }
            }
        }
示例#6
0
        /* Пирамида */
        private void button3_Click(object sender, EventArgs e)
        {
            bool mTr = true;

            if (textBox1.Text == "" || textBox2.Text == "")
            {
                mTr = false;
                MessageBox.Show("Введите данные", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if (mTr)
            {
                F.ClearDir(BasePath + "Lab 2");
                F.ClearDir(BasePath + "Lab 2/Core");

                double sigma0 = Convert.ToDouble(textBox1.Text);  // Сигма 0
                int    S      = Convert.ToInt32(textBox2.Text);   // Число масштабов в октаве
                double k      = Math.Pow(2.0, (1.0 / (double)S)); // Интервал между масштабами

                int minr = Math.Min(IWidth, IHeight);
                int O    = 0;                              // Число октав
                while (minr > 32)
                {
                    minr /= 2;
                    O++;
                }

                Img TekImg = new Img(GrayImg.GrayMatrix, IWidth, IHeight);
                TekImg.Save(BasePath + "Lab 2/000.png");
                double sigmaD   = sigma0;                      // Действительная сигма
                double sigmaTEK = sigma0;
                double qq       = 1;

                GaussCore GaussMatrix = new GaussCore(sigma0);
                Img       GaussImg    = new Img(GaussMatrix.Matrix, GaussMatrix.Size, GaussMatrix.Size);
                TekImg.SvertkaWithNormalize(GaussMatrix.Matrix, GaussMatrix.Radius, 1);
                TekImg.Save(BasePath + "Lab 2/" + "00"
                            + " - S1=" + Convert.ToString(Math.Round(sigma0, 2)) + " - Sd=" + Convert.ToString(Math.Round(sigma0, 2)) + ".png");
                GaussImg.Save(BasePath + "Lab 2/Core/" + "00" + ".png");

                for (int o = 0; o < O; o++)
                {
                    for (int s = 1; s <= S; s++)
                    {
                        double sigma1 = sigma0 * Math.Pow(k, (s - 1));
                        double sigma2 = sigma0 * Math.Pow(k, s);
                        sigmaTEK = Math.Sqrt(sigma2 * sigma2 - sigma1 * sigma1);// Текущая сигма
                        sigmaD   = sigma0 * Math.Pow(k, qq);
                        qq++;
                        GaussMatrix = new GaussCore(sigmaTEK);
                        GaussImg    = new Img(GaussMatrix.Matrix, GaussMatrix.Size, GaussMatrix.Size);
                        TekImg.SvertkaWithNormalize(GaussMatrix.Matrix, GaussMatrix.Radius, 1);
                        TekImg.Save(BasePath + "Lab 2/" + Convert.ToString(o) + Convert.ToString(s)
                                    + " - S1=" + Convert.ToString(Math.Round(sigma2, 2)) + " - Sd=" + Convert.ToString(Math.Round(sigmaD, 2)) + ".png");
                        GaussImg.Save(BasePath + "Lab 2/Core/" + Convert.ToString(o) + Convert.ToString(s) + ".png");
                    }
                    TekImg.Downsample();
                    TekImg.Save(BasePath + "Lab 2/" + Convert.ToString(o + 1) + "0"
                                + " - S1=" + Convert.ToString(Math.Round(sigma0, 2)) + " - Sd=" + Convert.ToString(Math.Round(sigmaD, 2)) + ".png");
                }
            }
        }