代码之家  ›  专栏  ›  技术社区  ›  user366312

Hough峰值检测

  •  1
  • user366312  · 技术社区  · 6 年前

    我已经实现了Hough峰值检测。输出如下:

    enter image description here

    如何将检测到的线限制在源线的长度之间?

    例如,

    enter image description here

    .

    源代码

    public class Line
    {
        public Point Start { get; set; }
        public Point End { get; set; }
    
        public Line(Point start, Point end)
        {
            Start = start;
            End = end;
        }
    }
    
    public class HoughLineTransform
    {
        public HoughMap Accumulator { get; set; }
    
        public HoughLineTransform()
        {
        }
    
        public List<Line> GetLines(int threshold)
        {
            if (Accumulator == null)
            {
                throw new Exception("HoughMap is null");
            }
    
            int houghWidth = Accumulator.Width;
            int houghHeight = Accumulator.Height;
            int imageWidth = Accumulator.Image.Width;
            int imageHeight = Accumulator.Image.Height;
    
            List<Line> lines = new List<Line>();
    
            if (Accumulator == null)
                return lines;
    
            for (int rho = 0; rho < houghWidth; rho++)
            {
                for (int theta = 0; theta < houghHeight; theta++)
                {
                    if ((int)Accumulator[rho, theta] >= threshold)
                    {
                        int peak = Accumulator[rho, theta];
    
                        for (int ly = -4; ly <= 4; ly++)
                        {
                            for (int lx = -4; lx <= 4; lx++)
                            {
                                if ((ly + rho >= 0 && ly + rho < houghWidth) && (lx + theta >= 0 && lx + theta < houghHeight))
                                {
                                    if ((int)Accumulator[rho + ly, theta + lx] > peak)
                                    {
                                        peak = Accumulator[rho + ly, theta + lx];
                                        ly = lx = 5;
                                    }
                                }
                            }
                        }
    
                        if (peak > (int)Accumulator[rho, theta])
                            continue;
    
                        int x1, y1, x2, y2;
                        x1 = y1 = x2 = y2 = 0;
    
                        double rad = theta * Math.PI / 180;
    
                        if (theta >= 45 && theta <= 135)
                        {
                            x1 = 0;
                            y1 = (int)(((double)(rho - (houghWidth / 2)) - ((x1 - (imageWidth / 2)) * Math.Cos(rad))) / Math.Sin(rad) + (imageHeight / 2));
                            x2 = imageWidth - 0;
                            y2 = (int)(((double)(rho - (houghWidth / 2)) - ((x2 - (imageWidth / 2)) * Math.Cos(rad))) / Math.Sin(rad) + (imageHeight / 2));
                        }
                        else
                        {
                            y1 = 0;
                            x1 = (int)(((double)(rho - (houghWidth / 2)) - ((y1 - (imageHeight / 2)) * Math.Sin(rad))) / Math.Cos(rad) + (imageWidth / 2));
                            y2 = imageHeight - 0;
                            x2 = (int)(((double)(rho - (houghWidth / 2)) - ((y2 - (imageHeight / 2)) * Math.Sin(rad))) / Math.Cos(rad) + (imageWidth / 2));
                        }
    
                        lines.Add(new Line(new Point(x1, y1), new Point(x2, y2)));
                    }
                }
            }
    
            return lines;
        }
    }
    

    Hough Line Transform implementation

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rob Audenaerde    6 年前

    一个简单的方法是在原始图像上覆盖生成的houghlines,并检查像素重叠的位置(使用特定的窗口)。

    如果它们开始或结束重叠,则具有线段的开始/结束。

    顺便说一句:我没有检查过你的算法,但我自己在15年前写了一个。我记得有一个迭代的方法,你一次只能找到一条线(就是累积图像中的最大值)。 然后找到第二条最重要的线。等等。