/// <summary> /// Преобразование Хафа. /// </summary> /// <param name="CompressionImage">Сжатое изображение</param> /// <param name="processedImage">Изображение обработанное фильтрами</param> /// <param name="countCompression">Коэффициент сжатия изображения</param> public static List <StraightLine> HoughTransform(Bitmap CompressionImage, byte[] processedImage, double countCompression) { var width = CompressionImage.Width; var height = CompressionImage.Height; var diagonal = (int)Math.Ceiling(Math.Sqrt(width * width + height * height)); var houghSpace = new HoughSpace(diagonal); var result = new List <StraightLine>(); houghSpace.FillHoughSpace(CompressionImage, processedImage); for (int i = 0; i < 4; i++) { var maxLine = GetMaxStraightLine(houghSpace); houghSpace.ClearPartHoughSpace(maxLine); maxLine.Distance = (int)(maxLine.Distance * countCompression) + 2; result.Add(maxLine); } return(result); }
/// <summary> /// Поиск самой длинной линии на изображении. /// </summary> /// <param name="houghSpace">Пространство Хафа(фазовое пространство параметров: длина перпендикуляра до прямой и угол отклонения перпендикуляра)</param> private static StraightLine GetMaxStraightLine(HoughSpace houghSpace) { var max = new StraightLine(0, 0, 0); var midDistance = houghSpace.DiagonalImage; var midStep = houghSpace.Size.Width / 2; var pRes = Parallel.For(0, houghSpace.Accumulator.GetLength(0), angle => { for (int distance = 0; distance < houghSpace.Accumulator.GetLength(1); distance++) { var vote = houghSpace.Accumulator[angle, distance]; if (vote > max.Vote && distance - midDistance > 0) { max = new StraightLine(distance - midDistance, (angle - midStep) * HoughSpace.stepForAngle + HoughSpace.shiftForAngle, vote); } } }); if (!pRes.IsCompleted) { throw new Exception("Parallel error"); } return(max); }