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

Hough变换C#码[闭合]

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

    this C# implementation ,

            ... ...
    
            // get source image size
            int width       = image.Width;
            int height      = image.Height;
            int halfWidth   = width / 2;
            int halfHeight  = height / 2;
    
            // make sure the specified rectangle recides with the source image
            rect.Intersect( new Rectangle( 0, 0, width, height ) );
    
            int startX = -halfWidth  + rect.Left;
            int startY = -halfHeight + rect.Top;
            int stopX  = width  - halfWidth  - ( width  - rect.Right );
            int stopY  = height - halfHeight - ( height - rect.Bottom );
    
            int offset = image.Stride - rect.Width;
    
            // calculate Hough map's width
            int halfHoughWidth = (int) Math.Sqrt( halfWidth * halfWidth + halfHeight * halfHeight );
            int houghWidth = halfHoughWidth * 2;
    
            houghMap = new short[houghHeight, houghWidth];
    
            // do the job
            unsafe
            {
                byte* src = (byte*) image.ImageData.ToPointer( ) +
                    rect.Top * image.Stride + rect.Left;
    
                // for each row
                for ( int y = startY; y < stopY; y++ )
                {
                    // for each pixel
                    for ( int x = startX; x < stopX; x++, src++ )
                    {
                        if ( *src != 0 )
                        {
                            // for each Theta value
                            for ( int theta = 0; theta < houghHeight; theta++ )
                            {
                                int radius = (int) Math.Round( cosMap[theta] * x - sinMap[theta] * y ) + halfHoughWidth;
    
                                if ( ( radius < 0 ) || ( radius >= houghWidth ) )
                                    continue;
    
                                houghMap[theta, radius]++;
                            }
                        }
                    }
                    src += offset;
                }
            }
    
            ... ... ...
    

    Q、 一。 rect.Intersect(new Rectangle( 0, 0, width, height));

    Q、 2。 为什么使用 rect

    int startX = -halfWidth  + rect.Left;
    int startY = -halfHeight + rect.Top;
    int stopX  = width  - halfWidth  - ( width  - rect.Right );
    int stopY  = height - halfHeight - ( height - rect.Bottom );
    

    Q、 三。 为什么y和x循环从一个负点开始?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Cris Luengo    6 年前

    Q、 一。

    这条线只是确保边界矩形完全位于图像内部。如果你跳过这个,然后 rect

    请注意,像素访问是通过指针完成的,每x增量指针递增1,然后 offset 每增加一个y。如果 矩形 矩形 只是移到图像边界之外,但不要太大,我们会读取与我们使用的坐标不对应的像素。

    请注意

    int stopX  = width  - halfWidth  - ( width  - rect.Right );
    int stopY  = height - halfHeight - ( height - rect.Bottom );
    

    int stopX  = - halfWidth  + rect.Right;
    int stopY  = - halfHeight + rect.Bottom;
    

    代码定义了图像中间坐标系的原点。这段代码移动了边界框(最初定义在[0, width height ))到新的坐标系。

    通常,Hough变换是用左上角的像素定义的。但原则上,坐标系的定义并不重要,这只会修改直线的参数化。对于每个输入像素绘制的正弦曲线将是不同的,但是局部最大值仍然会出现在对应于图像中的线的参数集合中。