【问题标题】:Hough Transform question霍夫变换问题
【发布时间】:2009-09-11 09:23:00
【问题描述】:

我以这种方式在 C# 中实现了霍夫变换:

        List<Point> forme = new List<Point>();

        forme.Add(new Point(260, 307));
        forme.Add(new Point(268, 302));
        forme.Add(new Point(273, 299));
        forme.Add(new Point(279, 295));
        forme.Add(new Point(285, 292));
        forme.Add(new Point(291, 288));
        forme.Add(new Point(298, 283));
        forme.Add(new Point(305, 280));
        forme.Add(new Point(312, 277));
        forme.Add(new Point(319, 274));
        forme.Add(new Point(325, 271));
        forme.Add(new Point(333, 268));
        forme.Add(new Point(340, 264));
        forme.Add(new Point(350, 259));
        forme.Add(new Point(356, 256));

            int width =  Math.Abs(forme[0].X - forme[forme.Count - 1].X);
            int height =  Math.Abs(forme[0].Y - forme[forme.Count - 1].Y);

            int halfWidth = width / 2; int halfHeigh = height / 2;

            double pmax = Math.Sqrt((width * width) + (height * height));
            double tmax = Math.PI * 2;

            // step sizes
            double dp = pmax / (double)width;
            double dt = tmax / (double)height;

            int[,] A = new int[width , height]; // accumulator array

            foreach (Point p in forme)
            { 

               for (int Theta = 1; Theta < height; Theta++)
                        {
                            double radius = ((double)(p.X) * Math.Cos(dt * (double)Theta)) + ((double)(p.Y) * Math.Sin(dt * (double)Theta)) ;

                            int k = (int)((radius / pmax) * width);
                            if (k >= 0 && k < width) A[k, Theta]++;
                        }

            }
            int goodTheta = 0;
            int goodRadius = 0;

            // maxMapIntensity c'est l'intensité maximale
            int maxMapIntensity = 0;
            for (int radius = 0; radius < width; radius++)
            {
                for (int theta = 0; theta < height; theta++)
                {
                    if (A[radius, theta] > maxMapIntensity)
                    {
                        maxMapIntensity = A[radius, theta];
                        goodRadius = radius;
                        goodTheta = theta;
                    }
                 }
            }

所以,据我了解,我现在已经找到了所有曲线相交点的 theta 和半径。那怎么才能找到真线呢?

有人声称我需要找到斜率和一个点,但我现在真的不清楚该怎么做。

感谢您的帮助,乔纳森

【问题讨论】:

    标签: c# math computer-vision hough-transform


    【解决方案1】:

    “maxMapIntensity”代码在 Hough 输出中查找单个最亮点的坐标,因此只会找到一条线(您已使用一组点定义)。霍夫输出中的单个亮点对应于原始图像中的一条线。您正在找到一条所有这些点都经过的线。 goodRadiusgoodTheta 是您要查找的变量 - 该行的参数。

    要计算原线,首先要计算从原点开始的切线(从原点开始,做 goodTheta 的角度,然后远离原点 goodRadius )。然后在那一点上,感兴趣的线(您找到的那条线)垂直于您刚刚创建的原点的线。在这个图中,goodRadius写成ρgoodTheta写成θ

    explanation of r theta http://saadjomaa.com/projects/ht/images/image002.jpg

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2019-10-26
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多