Example #1
0
 /// <summary>
 /// Diamond Search Algorithm.
 /// </summary>
 /// <param name="referentBlock"></param>
 /// <param name="centerBlock"></param>
 /// <param name="image"></param>
 /// <returns></returns>
 private static Vector CalculateVector(PixelBlock referentBlock, PixelBlock centerBlock, Image image)
 {
     while (true)
     {
         Diamond diamond = new LargeDiamond(referentBlock, centerBlock, image);
         var     mins    = diamond.GetMinimums();
         if (diamond.IsCenterBlock(mins.Minimum))
         {
             diamond = new SmallDiamond(referentBlock, centerBlock, image);
             mins    = diamond.GetMinimums();
             return(new Vector(referentBlock.Position, mins.Minimum.Position));
         }
         centerBlock = mins.Minimum;
     }
 }
Example #2
0
        /// <summary>
        /// Medical Diamond Search Algorithm
        /// </summary>
        /// <param name="referentBlock"></param>
        /// <param name="centerBlock"></param>
        /// <param name="image"></param>
        /// <returns></returns>
        private static Vector CalculateVector(PixelBlock referentBlock, PixelBlock centerBlock, Image image)
        {
            var diamond = new LargeDiamond(referentBlock, centerBlock, image);
            var mins    = diamond.GetMinimums();

            //If first and second minimum are same as referent block return first of them.
            if (double.IsNaN(mins.Treshold))
            {
                return(new Vector(referentBlock.Position, mins.Minimum.Position));
            }

            if (mins.Treshold > _treshold)
            {
                if (diamond.IsCenterBlock(mins.Minimum))
                {
                    return(new Vector(referentBlock.Position, new SmallDiamond(referentBlock, diamond.CenterBlock, image).GetMinimums().Minimum.Position));
                }
                var flippedPoint = mins.Minimum.FindFlippedBlock(centerBlock);
                if (referentBlock.IsInSearchWindow(flippedPoint, MedicalDiamondSearchSettings.SearchParameterP,
                                                   MedicalDiamondSearchSettings.BlockSize, image.Width, image.Height))
                {
                    var flippedBlock = image.Blocks[flippedPoint];
                    return(flippedBlock.BlockDistortion(referentBlock) < mins.Minimum.BlockDistortion(referentBlock)
                        ? new Vector(referentBlock.Position, flippedPoint)
                        : new Vector(referentBlock.Position, mins.Minimum.Position));
                }
            }

            #region Get flipped position of minimums
            var dict = new Dictionary <PixelBlock, Vector>();
            var list = new List <PixelBlock>
            {
                mins.Minimum, mins.SecondMinimum
            };

            var firstAddValue =
                mins.Minimum.FindFlippedAndAddToVectorDictionary(centerBlock, referentBlock, image, dict);
            if (firstAddValue.HasValue)
            {
                list.Add(firstAddValue.Value);
            }

            var secondAddValue = mins.SecondMinimum.FindFlippedAndAddToVectorDictionary(centerBlock, referentBlock, image, dict);
            if (secondAddValue.HasValue)
            {
                list.Add(secondAddValue.Value);
            }
            #endregion


            for (int i = 0; i < 3; i++)
            {
                mins = list.GetMinimums(referentBlock);
                if (mins.Treshold > _treshold)
                {
                    return(new Vector(referentBlock.Position, mins.Minimum.Position));
                }
                list = new List <PixelBlock>
                {
                    mins.Minimum, mins.SecondMinimum
                };
                firstAddValue =
                    mins.Minimum.FindFlippedAndAddToVectorDictionary(referentBlock, image, dict);
                if (firstAddValue.HasValue)
                {
                    list.Add(firstAddValue.Value);
                }

                secondAddValue = mins.SecondMinimum.FindFlippedAndAddToVectorDictionary(referentBlock, image, dict);
                if (secondAddValue.HasValue)
                {
                    list.Add(secondAddValue.Value);
                }
            }
            _treshold += 0.05;
            return(new Vector(referentBlock.Position, mins.Minimum.Position));
        }