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); }
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); }
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"); } } }
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]; } /*------------------------*/ } } } } }
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]; } } } } }
/* Пирамида */ 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"); } } }