public PointMatchDialog(PointMatchSettings settings) { this.settings = settings; InitializeComponent(); InitializeDefaults(); this.MaximumSize = Size; }
public static void ScanImage(bool[,] sampleMaskArray, int sampleMaskWidth, int sampleMaskHeight, int sampleXCenter, int sampleYCenter, PointMatchSettings settings, int[,] imageArray, int imageWidth, int imageHeight, List<PointMatchTriplet> pointsCreated) { // loop through image to first on-pixel for (int x = 0; x < imageWidth; x++) { for (int y = 0; y < imageHeight; y++) { bool firstMax = true; int onCount = 0, xSum = 0, ySum = 0; int xMin = imageWidth, xMax = 0; int yMin = imageHeight, yMax = 0; double correlationMax = 0.0; RecurseThroughOnRegion(sampleMaskArray, sampleMaskWidth, sampleMaskHeight, sampleXCenter, sampleYCenter, imageArray, imageWidth, imageHeight, x, y, ref firstMax, ref onCount, ref xSum, ref ySum, ref xMin, ref xMax, ref yMin, ref yMax, ref correlationMax); // save max if its correlation is positive and the point is not too big. a zero // correlation is would be expected from two uncorrelated sets of pixels, and // a negative correlation means the sets of pixels are inverses if (!firstMax && (correlationMax > 0) && (xMax - xMin < settings.pointSize) && (yMax - yMin < settings.pointSize)) { PointMatchTriplet p = new PointMatchTriplet(); if (onCount < 0) onCount = 1; p.x = (int)((double)xSum / (double)onCount + 0.5); p.y = (int)((double)ySum / (double)onCount + 0.5); p.correlation = correlationMax; pointsCreated.Add(p); } } } }
//Matches a point to the sample matched point public static void MatchSamplePoint(Image imageProcessed, PointMatchSettings settings, List<Point> samplePointPixels, List<Point> pointsExisting, List<PointMatchTriplet> pointsCreated) { // create sample point array bool[,] sampleMaskArray; int sampleMaskWidth = 0, sampleMaskHeight = 0; int sampleXCenter, sampleYCenter; ConvertSampleToArray(samplePointPixels, out sampleMaskArray, ref sampleMaskWidth, ref sampleMaskHeight, out sampleXCenter, out sampleYCenter); // create image array int[,] imageArray; int imageWidth, imageHeight; ConvertImageToArray(imageProcessed, out imageArray, out imageWidth, out imageHeight); RemovePixelsNearCurrentPoints(imageArray, imageWidth, imageHeight, pointsExisting, settings.pointSeparation); List<PointMatchTriplet> listCreated = new List<PointMatchTriplet>(); ScanImage(sampleMaskArray, sampleMaskWidth, sampleMaskHeight, sampleXCenter, sampleYCenter, settings, imageArray, imageWidth, imageHeight, listCreated); Comparison<PointMatchTriplet> comparison = new Comparison<PointMatchTriplet>(CompareTriplet); listCreated.Sort(comparison); foreach (PointMatchTriplet t in listCreated) { pointsCreated.Add(t); } }
public static bool IsolateSampleMatchPoint(List<Point> samplePointPixels, BitmapData bmData, PointMatchSettings settings, int xStart, int yStart, int x, int y) { if ((x < 0) || (y < 0) || (bmData.Width <= x) || (bmData.Height <= y)) return false; // out of bounds if (!NuGenDiscretize.ProcessedPixelIsOn(bmData, x, y)) return false; // pixel is off if (Math.Abs(x - xStart) > settings.pointSize / 2) return false; // point is too far from start if (Math.Abs(y - yStart) > settings.pointSize / 2) return false; // point is too far from start bool found = (samplePointPixels.Count > 0); if (found) { foreach (Point p in samplePointPixels) { if (p.X == x && p.Y == y) { found = true; break; } found = false; } } if (found) return true; // already in list // add this point samplePointPixels.Add(new Point(x, y)); // recurse. diagonal points are included so single-pixel wide polygonal outlines will be traversed, // but for a 2x speed increase we only go diagonal if the adjacent nondiagonal pixels are off bool right = IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x + 1, y); bool up = IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x, y + 1); bool left = IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x - 1, y); bool down = IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x, y - 1); if (!right && !up) IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x + 1, y + 1); if (!up && !left) IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x - 1, y + 1); if (!left && !down) IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x - 1, y - 1); if (!down && !right) IsolateSampleMatchPoint(samplePointPixels, bmData, settings, xStart, yStart, x + 1, y - 1); return true; }
public NuGenMatchSet(PointMatchSettings settings) { this.settings = settings; }