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