/// <summary> /// Gradient approximation to fill hole - uses the 4 edges of a covering rectangle to fill each pixel based on its distance from them. /// Throws error if hole touches the edges of the image. /// </summary> public void FillHoleApproximateGradient(Hole hole) { if (hole.CoveringRectangle.TopRight.Value == -1 || hole.CoveringRectangle.BottomLeft.Value == -1 || hole.CoveringRectangle.TopLeft.Value == -1 || hole.CoveringRectangle.BottomRight.Value == -1) { throw new Exception("Better-Approximation does not work if the hole touches the edges of the image."); } var horizontalDistance = hole.CoveringRectangle.BottomRight.Y - hole.CoveringRectangle.TopLeft.Y; var verticalDistance = hole.CoveringRectangle.BottomRight.X - hole.CoveringRectangle.TopLeft.X; foreach (var pix in hole.HolePixels) { var distanceToStart = DistanceMeasures.ChebyshevDistance(pix, hole.CoveringRectangle.TopLeft); var distanceToEnd = DistanceMeasures.ChebyshevDistance(pix, hole.CoveringRectangle.BottomRight); float pixValue; if (distanceToStart <= distanceToEnd) { var valueY = (hole.CoveringRectangle.TopRight.Value - hole.CoveringRectangle.TopLeft.Value) * (pix.Y - hole.CoveringRectangle.TopLeft.Y) / horizontalDistance; var valueX = (hole.CoveringRectangle.BottomLeft.Value - hole.CoveringRectangle.TopLeft.Value) * (pix.X - hole.CoveringRectangle.TopLeft.X) / verticalDistance; pixValue = hole.CoveringRectangle.TopLeft.Value + valueX + valueY; } else { var valueY = (hole.CoveringRectangle.BottomLeft.Value - hole.CoveringRectangle.BottomRight.Value) * (hole.CoveringRectangle.BottomRight.Y - pix.Y) / horizontalDistance; var valueX = (hole.CoveringRectangle.TopRight.Value - hole.CoveringRectangle.BottomRight.Value) * (hole.CoveringRectangle.BottomRight.X - pix.X) / verticalDistance; pixValue = hole.CoveringRectangle.BottomRight.Value + valueX + valueY; } if (pixValue > 1) { pixValue = 1; } else if (pixValue < 0) { pixValue = 0; } pix.Value = pixValue; } _image.IsHoled = false; }
public float GetWeight(Pixel x, Pixel y) { return(1 / (_e + (float)Math.Pow(DistanceMeasures.ChebyshevDistance(x, y), _z))); }