霍夫变换

图像矫正-基于opencv实现

只谈情不闲聊 提交于 2020-03-16 02:26:33
一、引言 上篇文章中四种方法对图像进行倾角矫正都非常有效。Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块(必须含有一条与倾角有关的直线)进行操作,从而减小运算量。这里Hough变换法和Radon变换法进行倾角检测的最大精度为1度。它们的优点是可以计算有断点的直线的倾角。最小二乘法的优点就是运算量小,但是其抗干扰能力比较差,容易受到噪声的影响。两点法虽然理论简单,但由于采样点比较多而且这些点服从随机分布,计算均值后能有效抑制干扰,实验表明其矫正效果很好,最大精度可以明显小于1度,而且计算量也很小。最小二乘法和两点法不能计算有断点的直线倾角,这是这两种方法的缺点。 二、基于opencv的图像矫正实现 对图像进行旋转矫正,关键是获取旋转角度是多少,在获取旋转角度后,可以用仿射变换对图像进行矫正。本文是基于opencv的houghline变换实现的图像旋转角度获取,具体代码为: _grayimage = cv2.cvtColor(self._srcimage,cv2.COLOR_RGB2GRAY) _cannyimage = cv2.Canny(_grayimage,CANNY_LOW_THRESHOLD, CANNY_HIGH_THRESHOLD, apertureSize=3) lines

houghpeaks

会有一股神秘感。 提交于 2020-01-11 04:20:44
文章目录 Syntax Description Examples Input Arguments H —霍夫变换矩阵 numpeaks —要识别的最大峰数 Name-Value Pair Arguments “阈值” —视为峰值的最小值 'NHoodSize'-抑制邻居的大小 'Theta'-霍夫变换theta值 Output Arguments houghpeaks:识别霍夫变换中的峰 Syntax peaks = houghpeaks ( H , numpeaks ) peaks = houghpeaks ( ___ , Name , Value , . . . ) Description peaks = houghpeaks(H,numpeaks)在由霍夫函数生成的霍夫变换矩阵H中定位峰。 numpeaks指定要识别的最大峰数。 该函数返回峰的矩阵,其中包含峰的行和列坐标。 peaks = houghpeaks(___,Name,Value,…)在Hough变换矩阵中定位峰,命名的参数控制操作的各个方面。 Examples 在旋转图像的霍夫变换中定位并显示峰 I = imread ( 'circuit.tif' ) ; 创建二进制图像。 [ H , T , R ] = hough ( BW ) ; 在图像的霍夫变换中找到峰并绘制它们。 P = houghpeaks ( H ,

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

孤街醉人 提交于 2019-12-07 16:08:52
霍夫变换原理 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。 直线可以由直角坐标或极坐标表示,直线可以由直角坐标或极坐标表示,直角坐标表示直线时,垂直于x轴的直线斜率不能表示,所以选择极坐标 对于霍夫变换, 我们将采用第二种方式极坐标系来表示直线. 因此, 直线的表达式可为: 化简便可得到: 一般来说对于点, 我们可以将通过这个点的一族直线统一定义为: 这就意味着每一对坐标代表一条通过点(x0,y0)的直线。 如果对于一个给定点我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面): 我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面相交, 这就意味着它们通过同一条直线. 5.以上的说明表明,一般来说, 一条直线能够通过在平面 寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。霍夫变换它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值,则认为是一条直线。 实例 #include

图像变换之霍夫变换

帅比萌擦擦* 提交于 2019-12-05 20:37:33
第一个霍夫直线变换 Houghlines() ////HoughlinesP函数的使用 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main() { VideoCapture capture(0 ); while (1) { //【1】载入原始图和Mat变量定义 Mat srcImage; capture >> srcImage; Mat midImage, dstImage;//临时变量和目标图的定义 //【2】进行边缘检测和转化为灰度图 Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测 cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图 //【3】进行霍夫线变换 vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合 HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10); //【4】依次在图中绘制出每条线段 for (size_t i = 0; i < lines

opencvC++学习20霍夫变换-直线

匿名 (未验证) 提交于 2019-12-03 00:32:02
霍夫直线变换介绍 Hough Line Transform用来做直线检测 平面空间到极坐标空间转换 对于任意一条直线上的所有点来说 变换到极坐标中,从[0~360]空间,可以得到r的大小 属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线 从平面坐标变换到霍夫空间(极坐标) API: 标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是 霍夫变换直线概率 cv::HoughLinesP最终输出是直线的两个点 。 cv::HoughLines( InputArray src, // 输入图像,必须8-bit的灰度图像 OutputArray lines, // 输出的极坐标来表示直线 double rho, // 生成极坐标时候的像素扫描步长 double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180 int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线 double srn=0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换 double stn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换 double min_theta=0; // 表示角度扫描范围 0

霍夫变换

。_饼干妹妹 提交于 2019-11-27 22:03:40
目录 霍夫线变换   标准霍夫变换SHT   多尺度霍夫变换MSHT   累计概率霍夫变换PPHT 霍夫圆变换   霍夫梯度法   霍夫梯度法缺点 霍夫直线变换 一条直线在图像二维空间可以由两个变量表示。 笛卡尔坐标系:可有参数斜率和截距表示; 极坐标系:可由(r,θ)极径和极角表示; 对于霍夫变换,我们用极坐标系来表示直线: 通过点(x 0 ,y 0 )的一族直线统一定义为: 即每一对(r θ ,θ)代表一条通过(x 0 ,y 0 )的直线。 对于一个定点(x 0 ,y 0 ),绘制出(r θ ,θ)曲线,例: 只绘出满足r>0,0<θ<2π 每个点都绘制图这样一条曲线,如果两个不同的点的曲线相交,就意味着它们通过同一条直线。 越多的曲线相交于一点,意味着这个交点表示的直线由更多的点组成。一般设置直线上点的阈值来定义多少条曲线交于一点,这样才认为检测到了一条直线。 霍夫圆变换 对于直线来说,一条直线能够由极径极角(r,θ)表示,而对于圆来说,需要三个参数表示一个圆: 霍夫梯度法 1、先对图像进行边缘检测; 2、对边缘图像中的每个非零点,考虑其局部梯度,就是用sobel函数计算x和y方向的sobel一阶导数得到梯度; 3、由斜率指定一条直线,将直线上的每个点都累加起来。这里的斜率是从一个指定的最小值到指定的最大值的距离; 4、标记边缘图像中每一个非0像素的位置; 5