Ejemplo n.º 1
0
        /// <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)));
 }