2009-09-11 50 views
3

我实现了霍夫在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; 
        } 
       } 
      } 

于是,到了我的理解,我现在已经找到了所有曲线的交点的theta和半径。那我怎么找到真正的线?

一些人声称我需要找到斜坡和点,但我现在还不清楚该怎么做。

感谢您的帮助,乔纳森

回答

2

的“maxMapIntensity”代码被发现在霍夫输出的单亮的点的坐标,所以这只能找到一个行(你与你的点的集合定义)。 Hough输出中的单个亮点对应于原始图像中的单个线条。你发现所有这些点都经过了一条线。 goodRadiusgoodTheta是您正在查找的变量 - 该行的参数。

计算原始行,你先会计算从原点开始的切线(从原点出发,使的角度goodTheta,然后从原点goodRadius旅行的距离)。然后在这一点上,您感兴趣的线(您找到的线)与您刚创建的原点线相垂直。在该图中,goodRadius写为ρ,和goodTheta写为θ

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