您的位置:首页 > 其它

图像分割之霍夫变换(Hough)

2016-03-25 10:31 246 查看
在图像分割边缘检测一文中介绍了一些有效的边缘检测方法,但在实际中由于噪声和光照不均等因素,使得很多情况下获得的边缘点不连续,必须通过边缘连接将它们转换为有意义的边缘。一般的做法是对经过边缘检测的图像进一步使用连接技术,从而将边缘要素组合成完整的边缘。霍夫变换就是实现着一功能的方法,它是一个非常重要的检测间断点边界的方法。它通过将图像坐标空间变换到参数空间,来实现直线和曲线的拟合。

1, 直线检测

在坐标空间中,经过一点p的直线可以有无数条,对应于不同的斜率(a)和截距(b)。如果将p点的坐标视为常数,而将原本得到的参数a与b视为变量,便可变换到参数平面a-b。这个变换就是直角坐标对于p的Hough变换。该直线是图像坐标空间中的点p在参数空间的唯一方程。考虑图像坐标空间中另一点q,它在参数空间中也有相应的一条直线,p与q在参数空间的直线交于一点o,这一点o就是图像坐标空间中p和q所确定的直线的参数。也就是说,在参数空间相交于同一点的所有直线,在图像空间都有共线的点与之对应。根据这个特性,给定图像坐标空间的一些边缘点,就可以通过Hough变换确定连接这些点的直线方程。具体计算时,可以把参数空间视为离散。建立一个二维累加数组A(a,b),第一维的范围是图像坐标空间中直线斜率的可能范围,第二维的范围是图像坐标空间中直线截距的可能范围。这类数组也被称为Hough矩阵。与直角坐标类似,极坐标中的Hough变换也将图像坐标空间中的点变换到参数空间中。在极坐标下,图像坐标空间中共线的点变换到参数空间之后,在参数空间都相交于同一点,此时得到的极坐标即为所求直线的极坐标参数。与直角坐标不同的是,用极坐标表示时,图像坐标空间的共线两点映射到参数空间是两条正弦曲线。

2, 曲线检测

Hough变换同样适用于方程已经知道的曲线检测。图像坐标空间中的一点,在参数空间中也可以映射为相应的轨迹曲线或者曲面。若参数空间中对应各个间断点的曲线或者曲面能够相交,就能够找到参数空间的极大值以及对应的参数,若参数空间中对应各个间断点的曲线或者曲面不能相交,则说明这间断点不符合某已知曲线,Hough变换做曲线检测时,最重要的是写出图像坐标空间到参数空间的变换公式,曲线检测也可以有极坐标的形式。

3, 任意形状的检测

用Hough变换去检测某一任意形状边界的图形。首先需要选择该图形中的任意一点p为参考点,然后从该图形的边缘上每一点计算其切线方向和到参考点p位置偏移矢量,以及该矢量与x轴的夹角。具体的步骤为(1)在预知区域形状的条件下,将物体边缘形状编成参考表。对于每个边缘点计算梯度角,对每一个梯度角算出对应于参考点的距离和角度。(2)在参数空间建立一个二维累加数组A,初值为0,对边缘上的每一点,计算出该点处的梯度角,然后计算出每一个可能的参考点的位置值,对相应的数组元素加一。(3)计算结束后,具有最大值的数组元素A所对应的坐标值即为图像坐标中所求的参考点,求出参考点后,整个目标的边界就可以确定了。

Hough变换直线检测的openCV实现

void huoFu(){
Mat srcImg = imread("hw.bmp");
//  imshow("SRC", srcImg);

Mat midImg, dstImg;
Canny(srcImg, midImg, 50,200,3);
cvtColor(midImg, dstImg, CV_GRAY2BGR);
//imshow("dst", dstImg);

vector<Vec2f>lines;
HoughLines(midImg, lines, 1, CV_PI / 180, 190, 0, 0);

for (size_t i = 0; i < lines.size(); ++i){
//rho表示直线到原点的垂距离,theta代表x轴到直线垂直的角度
float rho = lines[i][0], theta=lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);//坐标转换映射到参数空间
double x0 = a*rho, y0 = b*rho;
//确定直线的起始点
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
//连接起始点
line(srcImg, pt1, pt2, Scalar(55, 100, 195), 4, CV_AA);
}
imshow("GUO", srcImg);

waitKey(0);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: