Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- namespace DigitalImage.util
- {
- public class RasterRegion
- {
- public int regId = 0;
- public List<Point> points = new List<Point>();
- public Boolean momentiOdredjeni = false;
- public int n = 0; // ukupan broj tacaka
- public double c20 = 0;
- public double c11 = 0;
- public double c02 = 0;
- #region osnovne statisticke osobine regiona
- public double xM = 0;
- public double yM = 0;
- public double theta = 0;
- public double eccentricity = 0;
- public double majorAxisLength = 0;
- public double minorAxisLength = 0;
- #endregion
- public void odrediMomente()
- {
- if (momentiOdredjeni == true)
- return;
- n = points.Count;
- foreach (Point pp in points)
- {
- xM += pp.X;
- yM += pp.Y;
- }
- xM = xM / n;
- yM = yM / n;
- foreach (Point pp in points)
- {
- c20 += (pp.X - xM) * (pp.X - xM);
- c11 += (pp.X - xM) * (pp.Y - yM);
- c02 += (pp.Y - yM) * (pp.Y - yM);
- }
- // sad imamo vrednosti covariance matrix
- // c20 c11
- // c11 c02
- // odrediti karakteristicne vrednosti
- double a = 1;
- double b = -(c20 + c02);
- double c = c20 * c02 - c11 * c11;
- double D = b * b - 4 * c;
- double alfa1 = 0;
- double alfa2 = 0;
- if (D > 0)
- {
- D = Math.Sqrt(D);
- alfa1 = (-b + D) / 2 * a;
- alfa2 = (-b - D) / 2 * a;
- double temp1 = Math.Max(alfa1, alfa2);
- double temp2 = Math.Min(alfa1, alfa2);
- alfa1 = temp1;
- alfa2 = temp2;
- if (alfa1 != 0)
- eccentricity = alfa2 / alfa1;
- majorAxisLength = alfa1;
- minorAxisLength = alfa2;
- }
- theta = 0.5 * Math.Atan2(2 * c11, (c20 - c02));
- }
- public byte[,] odrediSliku()
- {
- int minX = int.MaxValue;
- int maxX = int.MinValue;
- int minY = int.MaxValue;
- int maxY = int.MinValue;
- for (int i = 0; i < points.Count; i++)
- {
- if (points[i].X < minX)
- {
- minX = points[i].X;
- }
- if(points[i].X > maxX)
- {
- maxX = points[i].X;
- }
- if (points[i].Y < minY)
- {
- minY = points[i].Y;
- }
- if (points[i].Y > maxY)
- {
- maxY = points[i].Y;
- }
- }
- byte[,] slika = new byte[maxY - minY+2, maxX - minX+2];
- /*for (int i = 0; i < maxX - minX; i++)
- {
- for (int j = 0; j < maxY - minY; j++)
- {
- for (int p = 0; p < points.Count; p++)
- {
- if (i == points[p].X - minX && j == points[p].Y - minY)
- {
- slika[i, j] = 0;
- }
- else
- slika[i, j] = 255;
- }
- }
- }*/
- for (int i = 0; i < maxY - minY +2; i++)
- {
- for (int j = 0; j < maxX - minX+2; j++)
- {
- slika[i, j] = 255;
- }
- }
- for (int i = 0; i < points.Count; i++)
- {
- slika[points[i].Y-minY, points[i].X-minX] = 0;
- }
- return slika;
- }
- public byte[,] odrediNSliku()
- {
- List<Point> points1 = new List<Point>();
- double alfa = Math.PI/2-Math.Abs(theta);
- for (int i = 0; i < points.Count; i++)
- {
- int x = (int)(Math.Cos(alfa) * (points[i].X - xM) - Math.Sin(alfa) * (points[i].Y - yM) + xM);
- int y = (int)(Math.Sin(alfa) * (points[i].X - xM) + Math.Cos(alfa) * (points[i].Y - yM) + yM);
- Point point = new Point(x,y);
- points1.Add(point);
- }
- points = points1;
- return odrediSliku();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement