霍夫变换C#代码

时间:2018-08-15 17:06:02

标签: c# image-processing hough-transform

让我们看看this C# implementation

df<-read.table(text="
           Date      Vals
           8/1/11     2.5
           8/2/11     2.6
           8/3/11     1.6
           8/4/11     3.6
           8/5/11     3.5
           8/6/11     3.1
           8/7/11     3.8
           8/8/11     2.1
           8/9/11     1.6
           8/10/11    3.1
           ",header=TRUE)

Q.1。 ... ... // 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.2。 为什么在以下代码中使用rect.Intersect(new Rectangle( 0, 0, width, height));修改值:

rect

Q.3。 为什么y和x循环从负点开始?

1 个答案:

答案 0 :(得分:2)

Q.1。

此行仅确保边界矩形完全位于图像内部。如果您跳过此步骤,而rect(部分)在图片之外,那么最终将超出索引范围。

请注意,像素访问是通过指针完成的,指针每x增量增加1,每y增量增加offset。如果rect大于图像,我们将指针增加到图像缓冲区之外。如果仅将rect移出图像范围,但又不要太大,则我们将读取与我们使用的坐标不对应的像素。

Q.2。

请注意

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和[0,height]范围内定义))移到新坐标系。

通常,霍夫变换是用左上角像素中的原点定义的。但是原则上,如何定义坐标系并不重要,这只是修改了线的参数化。为每个输入像素绘制的正弦曲线将有所不同,但是对于与图像中的线相对应的参数集,局部最大值仍将出现。