霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆.
经过几天的学习,发现各位大牛的理解方式之前都是有一些区别的,但是核心的思想没有变化,因此记录一下自己对霍夫变换直线检测的认识。
一、原理介绍:
1、对于直角坐标系中的任意一点A(x0,y0),经过点A的直线满足Y0=k*X0+b.(k是斜率,b是截距)
2、那么在X-Y平面过点A(x0,y0)的直线簇可以用Y0=k*X0+b表示,但对于垂直于X轴的直线斜率是无穷大的则无法表示。因此将直角坐标系转换到极坐标系就能解决该特殊情况。
3、在极坐标系中表示直线的方程为ρ=xCosθ+ySinθ(ρ为原点到直线的距离),如图所示:
4、如上图,假定在一个8*8的平面像素中有一条直线,并且从左上角(1,8)像素点开始分别计算θ为0°、45°、90°、135°、180°时的ρ,图中可以看出ρ分别为1、(9√2)/2、8、(7√2)/2、-1,并给这5个值分别记一票,同理计算像素点(3,6)点θ为0°、45°、90°、135°、180°时的ρ,再给计算出来的5个ρ值分别记一票,此时就会发现ρ = (9√2)/2的这个值已经记了两票了,以此类推,遍历完整个8*8的像素空间的时候ρ = (9√2)/2就记了5票, 别的ρ值的票数均小于5票,所以得到该直线在这个8*8的像素坐标中的极坐标方程为 (9√2)/2=x*Cos45°+y*Sin45°,到此该直线方程就求出来了。(PS:但实际中θ的取值不会跨度这么大,一般是PI/180)。
二、Opencv实现直线检测:
Opencv2.4.9版本:
#include<opencv2\imgproc\imgproc.hpp> #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; int main() { Mat Image = imread(".//res//street.jpg", 0); Mat CannyImg; Canny(Image, CannyImg, 140, 250, 3); imshow("CannyImg", CannyImg); Mat DstImg; cvtColor(Image, DstImg, CV_GRAY2BGR); vector<Vec4i> Lines; HoughLinesP(CannyImg, Lines, 1, CV_PI / 360, 170,30,15); for (size_t i = 0; i < Lines.size(); i++) { line(DstImg, Point(Lines[i][0], Lines[i][1]), Point(Lines[i][2], Lines[i][3]), Scalar(0, 0, 255), 2, 8); } imshow("HoughLines_Detect", DstImg); imwrite(".//res//HoughLines_Detect.jpg", DstImg); waitKey(0); return 0; }
效果图:
三、推荐一个国外公路直线检测的大神的个人主页(有很多资源和源码):
Mohamed Aly:http://www.vision.caltech.edu/malaa/research/
他研究了公路上的直线(斑马线)等的检测。
Hough变换把图像空间中给定的曲线按曲线的参数表达式变换成参数空间中的点,然后通过在参数空间中寻找峰值来达到在图像空间中寻找曲线的目的。可以使用Hough变换来寻找图像中的直线。
直线Hough变换与Radon变换的区别在于前者是直线参数变换的离散形式,而后者则是直线参数变换的连续形式。所以Hough变换直接应用在二值图像上,而Radon变换直接应用在灰度图像上。另外,由于二值图像只需要处理前景或者背景像素,所以Hough变换速度一般更快。Hough变换通常用在几何形状检测、文档版面分割等领域。
而Radon变换也有独特的优势。由于二值图像的不连续性,表面上看Hough变换结果中峰值位置明显,效果比Radon变换好,但实际上由于通常意义上难以对一幅图像进行恰当的二值分割,所以在一般情况下Radon变换要比Hough变换更精致而且准确。Radon变换是全面的变换,可以从Radon变换的结果重建变换前的图像。所以在断层扫描中大量使用了Radon变换及其逆变换。
原文地址:http://blog.csdn.net/ycj9090900/article/details/52944708
http://www.cnblogs.com/YCwavelet/p/3622457.html