我用C#实现了Hough Transform:
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;
}
}
}
所以,根据我的理解,我现在已经找到了所有曲线的交点的θ和半径。那么我怎样才能找到实线?
有些人声称我需要找到斜率和一个点,但我现在还不清楚该怎么做。
感谢你的帮助,Jonathan
答案 0 :(得分:3)
“maxMapIntensity”代码是在霍夫输出中找到单个最亮点的坐标,因此这只会找到一条线(你用你的一组点定义)。霍夫输出中的单个亮点对应于原始图像中的单个线。你找到了一条所有这些要点的线。 goodRadius
和goodTheta
是您要查找的变量 - 该行的参数。
要计算原始线,首先要计算从原点开始的切线(从原点开始,使角度为 goodTheta ,然后离开原点 goodRadius )。然后在那一点上,感兴趣的线(你找到的线)垂直于你刚刚创建的原点的线。在此图中, goodRadius 写为ρ, goodTheta 写为θ。
explanation of r theta http://saadjomaa.com/projects/ht/images/image002.jpg