/// <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; } }
/// <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)); }