利用Hough变换实现直线检测的代码
2014-01-16 09:54
513 查看
http://www.cnblogs.com/fly-height/articles/2095240.html
vc图像处理程序中经常要用到直线检测,常用的直线检测方法是Hough变换。
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。
以下代码实现了最简单的Hough变换直线检测,输入为width*height的二值图(背景为0,前景为255),存放在矩阵src中,iThreshold为判断为直线的域值。输出pR为原点到直线的距离,pTh为直线的角度。
复制内容到剪贴板
程序代码
void Hough(BYTE *src,int width,int height, int *pR, int *pTh, int iThreshold)
{
int *pArray;
int iRMax = (int)sqrt(width * width + height * height) + 1;
int iThMax = 361;
int iTh = 0;
int iR;
int iMax = -1;
int iThMaxIndex = -1;
int iRMaxIndex = -1;
pArray = new int[iRMax * iThMax];
memset(pArray, 0, sizeof(int) * iRMax * iThMax);
float fRate = (float)(PI/180);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if(*src == 255)
{
for(iTh = 0; iTh < iThMax; iTh += 1)
{
iR = (int)(x * cos(iTh * fRate) + y * sin(iTh * fRate));
if(iR > 0)
{
pArray[iR/1 * iThMax + iTh]++;
}
}
}
src++;
} // x
} // y
for(iR = 0; iR < iRMax; iR++)
{
for(iTh = 0; iTh < iThMax; iTh++)
{
int iCount = pArray[iR * iThMax + iTh];
if(iCount > iMax)
{
iMax = iCount;
iRMaxIndex = iR;
iThMaxIndex = iTh;
}
}
}
if(iMax >= iThreshold)
{
*pR = iRMaxIndex;
*pTh = iThMaxIndex;
}
delete []pArray;
return;
} // end of Hough
vc图像处理程序中经常要用到直线检测,常用的直线检测方法是Hough变换。
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。
以下代码实现了最简单的Hough变换直线检测,输入为width*height的二值图(背景为0,前景为255),存放在矩阵src中,iThreshold为判断为直线的域值。输出pR为原点到直线的距离,pTh为直线的角度。
复制内容到剪贴板
程序代码
void Hough(BYTE *src,int width,int height, int *pR, int *pTh, int iThreshold)
{
int *pArray;
int iRMax = (int)sqrt(width * width + height * height) + 1;
int iThMax = 361;
int iTh = 0;
int iR;
int iMax = -1;
int iThMaxIndex = -1;
int iRMaxIndex = -1;
pArray = new int[iRMax * iThMax];
memset(pArray, 0, sizeof(int) * iRMax * iThMax);
float fRate = (float)(PI/180);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if(*src == 255)
{
for(iTh = 0; iTh < iThMax; iTh += 1)
{
iR = (int)(x * cos(iTh * fRate) + y * sin(iTh * fRate));
if(iR > 0)
{
pArray[iR/1 * iThMax + iTh]++;
}
}
}
src++;
} // x
} // y
for(iR = 0; iR < iRMax; iR++)
{
for(iTh = 0; iTh < iThMax; iTh++)
{
int iCount = pArray[iR * iThMax + iTh];
if(iCount > iMax)
{
iMax = iCount;
iRMaxIndex = iR;
iThMaxIndex = iTh;
}
}
}
if(iMax >= iThreshold)
{
*pR = iRMaxIndex;
*pTh = iThMaxIndex;
}
delete []pArray;
return;
} // end of Hough
相关文章推荐
- 利用Hough变换实现直线检测的代码
- 【转】利用Hough变换实现直线检测的代码
- Hough变换 直线检测原理及其Matlab实现
- 霍夫变换直线检测houghlines及opencv的实现分析
- opencv+vs2008实现canny边缘检测与hough变换检测直线并用红线在原图标出直线
- Hough变换直线检测的MATLAB实现
- Matlab实现Hough变换检测图像中的直线 分类: 图像处理 2014-06-14 22:07 641人阅读 评论(0) 收藏
- Matlab实现Hough变换检测图像中的直线
- OpenCV2马拉松第22圈——Hough变换直线检测原理与实现
- Hough变换——直线检测(投票方法实现)
- 基于Hough 变换的直线检测(Matlab实现)
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
- Hough变换检测直线的Java实现
- Hough变换之cvHoughLines2霍夫函数检测直线
- hough变换 正在的c代码风格实现
- DSP实现快速Hough变换圆检测算法
- hough变换检测直线和圆
- Hough变换检测直线
- (转+改)Hough变换--直线检测
- 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较)