zoukankan      html  css  js  c++  java
  • 图像直线检测——霍夫线变换


    霍夫变换用来从图像中检测出具有某种特征的几何形状,如直线、圆、椭圆等。霍夫线变换的思想是:霍夫线变换必须应用在二值图像上,它认为图像上每一个点都有可能是某条直线上的一个点,对过每点的所有直线进行投票,根据设定的权重做最终的判断,这个是霍夫线变换的理论基础。


    1. 对于xy坐标平面的一个点(x0,y0),经过该点的一条直线用  y0=k*x0+b来表示,k是斜率,b是直线的截距,即x0=0时,y0对应的值:


    2. 上式也可以用b=y0-k*x0来表述,即在b k坐标平面,直线可以用一个点(-k,b)来表示:


    3. 推而广之,经过xy平面上一个点(x0,y0)的所有直线在b k坐标平面就形成了一条曲线:




    4. xy平面上一条由n个像素点组成的直线上所有点的所有直线在b k平面形成了n条曲线,并且n条曲线交于一点,该点坐标反推到xy平面即是那条n个像素点所组成的直线:




    如此一来,在b k平面上,若曲线相交与点(b0,k0),则该点的权重加1,最后统计b k平面所有点的权重,大于一定阈值的点,即代表x y平面上具有该点所对应的直线。


    在实际应用在,所谓的b k平面其实就是极坐标平面,公式为:


    ρ=x*cosθ+y*sinθ


    从下边这幅图像中查找直线,直观印象就是水和山之间的分界线检测出直线的可能性比较大:




    使用Opencv中HoughLines检测霍夫直线:


    #include "core/core.hpp"
    #include "highgui/highgui.hpp"
    #include "imgproc/imgproc.hpp"
    
    using namespace cv;
    
    int main(int argc,char *argv[])
    {
    	Mat image=imread(argv[1]);
    	Mat imageGray;
    	cvtColor(image,imageGray,CV_RGB2GRAY);
    	GaussianBlur(imageGray,imageGray,Size(3,3),1);  //滤波
    	threshold(imageGray,imageGray,100,255,CV_THRESH_OTSU); //大津阈值
    	imshow("OTSU",imageGray);
    	Canny(imageGray,imageGray,100,230);  //Canny边缘检测
    	imshow("Canny",imageGray);
    	vector<Vec2f>lines;
    	HoughLines(imageGray,lines,1,CV_PI/180,250);  //霍夫直线变换	
    	for(int i=0;i<lines.size();i++)    //画出直线
    	{  
    		float rho=lines[i][0];  
    		float 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(image,pt1,pt2,Scalar(0,0,255),2);  
    	}  
    	imshow("直线",image); 
    	waitKey();
    	return 0;
    }
    


    图像转化成灰度图像之后先进行一个大津阈值分割:




    之后用Canny检测边缘:




    在Canny图像的基础上,检测直线段,并输出到原始图像上:




    HoughLines函数第5个参数“threshold”代表的就是对累计平面上的点是否是直线的阈值判断,在笛卡尔坐标系中其实就是连续直线段的像素数,直观的理解就是直线段的长度。


  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411971.html
Copyright © 2011-2022 走看看