public void RankPicture(string filename) { var bitmap = new ColorsBitmap <ColorRgb>(filename); double totalDist = 0; foreach (var circle in Query.Circles) { if (circle.X >= bitmap.Width || circle.Y >= bitmap.Height) { // this happens, but why?? how could this error happen? // are the data mixed up in some way? return; } var targetPoint = circle.FindMeantPixel(bitmap); var targetColor = bitmap.GetPixel(targetPoint.X, targetPoint.Y); var distX = circle.X - targetPoint.X; var distY = circle.Y - targetPoint.Y; // TODO: make use of ALL methods in the delegate, not just the last one var lastRmDist = rmDistances(circle.Color, targetColor, distX, distY); totalDist += lastRmDist; } double avgDist = totalDist / Query.Circles.Length; ranks.TryAdd(Path.GetFileName(filename), avgDist); }
public void Draw <T>(Bitmap bitmapToDraw, ColorsBitmap <T> bitmapToSearchTarget, bool showRadius, bool showTarget, bool showOrderOfCircles) where T : Color3d, new() { var g = Graphics.FromImage(bitmapToDraw); foreach (Circle c in Circles) { if (showTarget) { var target = c.FindMeantPixel(bitmapToSearchTarget); var pen2 = new Pen(Color.LightSkyBlue, 3); g.DrawLine(pen2, c.X, c.Y, target.X, target.Y); } var pen = new Pen((Color)c.Color.ConvertToRgb(), 5); g.DrawEllipse(pen, c.X - 5, c.Y - 5, 10, 10); if (showOrderOfCircles) { var brush = Brushes.Coral; var font = new Font(FontFamily.GenericSansSerif, 6, FontStyle.Bold); g.DrawString(c.EntryOrder.ToString(), font, brush, c.X, c.Y); } if (showRadius) { var pen2 = new Pen(Color.GreenYellow, 1); g.DrawEllipse(pen2, c.X - SearchDiameter / 2, c.Y - SearchDiameter / 2, SearchDiameter, SearchDiameter); } } }
/// <param name="frame"></param> /// <param name="MaxAllowedDistance">Maximum distance of colors in one cluster. If 0, default value will be used.</param> public ColorClusterer(ColorsBitmap <T> image, int MaxAllowedDistance = 0) { this.image = image.GetRgbBitmap(); if (MaxAllowedDistance > 0) { this.MaxAllowedDistance = MaxAllowedDistance; } }
private void _annotatePicture <T>() where T : Color3d, new() { var bitmapForDrawing = (Bitmap)MainPictureBox.Image; var bitmapForSearching = new ColorsBitmap <T>(new Bitmap(MainPictureBox.Image)); var p = new Picture(Program.DbConn); p.Load(CurrentPicturePath, circleFilter); foreach (var ans in p.Answers) { ans.Draw( bitmapToDraw: bitmapForDrawing, bitmapToSearchTarget: bitmapForSearching, showRadius: checkBoxShowRadius.Checked, showTarget: checkBoxTarget.Checked, showOrderOfCircles: checkBoxNumbers.Checked ); } }
public Point FindMeantPixel <T>(ColorsBitmap <T> bitmap) where T : Color3d, new() { int beginX = Math.Max(0, X - SearchDiameter / 2); int beginY = Math.Max(0, Y - SearchDiameter / 2); Point closestPoint = new Point(X, Y); double closestColorDistance = Color.Get4dDistanceL2(bitmap.GetAveragePixel(X, Y), 0); for (int iX = 0; iX < SearchDiameter; iX++) { for (int iY = 0; iY < SearchDiameter; iY++) { int currentPointX = beginX + iX; int currentPointY = beginY + iY; if (currentPointX < 0 || currentPointY < 0 || currentPointX >= bitmap.Width || currentPointY >= bitmap.Height) { continue; } int distFromPoint = (int)Math.Sqrt((X - currentPointX) * (X - currentPointX) + (Y - currentPointY) * (Y - currentPointY)); if (distFromPoint <= SearchDiameter / 2) { var pixel = bitmap.GetAveragePixel(currentPointX, currentPointY); double colorDist = Color.Get4dDistanceL2(pixel, distFromPoint); if (colorDist > MinimumColorDist && colorDist < closestColorDistance) { closestColorDistance = colorDist; closestPoint = new Point(currentPointX, currentPointY); } } } } return(closestPoint); }