C# 霍夫变换问题

C# 霍夫变换问题,c#,math,computer-vision,hough-transform,C#,Math,Computer Vision,Hough Transform,我用C#实现了Hough变换,方法如下: 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)); f

我用C#实现了Hough变换,方法如下:

        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;
                    }
                 }
            }
List forme=new List();
表格.增补(新订第(260307)点);
表格增订(新订第(268302)点);
表格.增补(新点(273299));
表格.增补(新点(279295));
表格.增补(新点(285292));
表格.增补(新点(291288));
表格.增补(新订第(298283)点);
表格.增补(新点(305,280));
表格增订(新订第(312277)点);
增加(新的点(319274));
表格.增补(新点(325271));
表格.增补(新订第(333268)点);
增加(新的点(340264));
增加(新的点(350259));
增加(新的点(356256));
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=宽度/2;int-halfHeigh=高度/2;
double pmax=Math.Sqrt((宽度*宽度)+(高度*高度));
双tmax=Math.PI*2;
//步长
双dp=pmax/(双)宽度;
双dt=tmax/(双)高度;
int[,]A=新的int[宽度,高度];//累加器阵列
foreach(表格中的p点)
{ 
对于(intθ=1;θ<高度;θ++)
{
双半径=((双)(p.X)*数学Cos(dt*(双)θ))+((双)(p.Y)*数学Sin(dt*(双)θ));
int k=(int)((半径/pmax)*宽度);
如果(k>=0&&kmaxMapIntensity)
{
maxMapIntensity=A[半径,θ];
goodRadius=半径;
好θ=θ;
}
}
}
根据我的理解,我现在已经找到了所有曲线交点的θ和半径。那我怎么才能找到真正的线路呢

有人说我需要找到坡度和一个点,但我现在真的不清楚该怎么办

感谢您的帮助,“maxMapIntensity”代码正在查找Hough输出中单个最亮点的坐标,因此这将只查找一条线(您已使用点集定义)。Hough输出中的单个亮点对应于原始图像中的一条直线。你找到了一条所有这些点都穿过的线。
goodRadius
goodTheta
是您要查找的变量-该行的参数

要计算原始直线,首先要计算从原点开始的切线(从原点开始,形成一个角度goodTheta,然后离开原点goodRadius)。然后在这一点上,感兴趣的线(你找到的那条)与你刚刚创建的原点的线垂直。在该图中,goodRadius表示为ρ,goodTheta表示为θ