霍夫变换检测直线原理及实例

霍夫变换原理

  1. 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。
    在这里插入图片描述
  2. 直线可以由直角坐标或极坐标表示,直线可以由直角坐标或极坐标表示,直角坐标表示直线时,垂直于x轴的直线斜率不能表示,所以选择极坐标
    对于霍夫变换, 我们将采用第二种方式极坐标系来表示直线. 因此, 直线的表达式可为:

在这里插入图片描述
化简便可得到:
在这里插入图片描述
一般来说对于点, 我们可以将通过这个点的一族直线统一定义为:

在这里插入图片描述
这就意味着每一对坐标代表一条通过点(x0,y0)的直线。

  1. 如果对于一个给定点我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面):在这里插入图片描述
  2. 我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面相交, 这就意味着它们通过同一条直线. 在这里插入图片描述
    5.以上的说明表明,一般来说, 一条直线能够通过在平面 寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。霍夫变换它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值,则认为是一条直线。

实例

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>  //opencv申明
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
	Mat img = imread("D:\\program\\zheng1.png");
	Mat dst,src;
	Canny(img,src,50,50);  //边缘检测
	//方法1(标准霍夫变换)
	cvtColor(src, dst, CV_GRAY2BGR); //灰度

    vector<Vec2f> lines;
     HoughLines(src, lines, 1, CV_PI / 180, 80, 0, 0);
     for (size_t i = 0; i < lines.size(); i++) 
	 {
     float rho = lines[i][0]; // 极坐标中的r长度
     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));//对一个double型的数进行四舍五入,并返回一个整型数!
     pt1.y = cvRound(y0 + 1000 * (a));
     pt2.x = cvRound(x0 - 1000 * (-b));
     pt2.y = cvRound(y0 - 1000 * (a));
     line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
}
	 imshow("xiaoguotu",dst);
	 waitKey(0);
}

在这里插入图片描述

参数详解

第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。
第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

猜你喜欢

转载自blog.csdn.net/weixin_43491924/article/details/85044178