霍夫变换(一)霍夫线性变换

霍夫变换(一)线性霍夫变换

概述:霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫线变换和霍夫圆变换两种。

霍夫线变换:

  1. OpenCv中的霍夫线变换:

<1>标准霍夫变换(StandardHough Transform,SHT),由HoughLines函数调用。

<2>多尺度霍夫变换(Multi-ScaleHough Transform,MSHT),由HoughLines函数调用。

<3>累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。

多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。

  1. 霍夫线变换的原理

【1】众所周知, 一条直线在图像二维空间可由两个变量表示. 如:

<1>在笛卡尔坐标系: 可由参数: 斜率和截距(m,b) 表示。

<2>在极坐标系: 可由参数: 极径和极角表示。

 

对于霍夫变换, 我们将采用第二种方式极坐标系来表示直线. 因此, 直线的表达式可为:

 

化简便可得到:

【2】一般来说对于点, 我们可以将通过这个点的一族直线统一定义为:

 

这就意味着每一对代表一条通过点的直线。

【3】如果对于一个给定点我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面):

 

只绘出满足下列条件的点  和   .

【4】我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面相交, 这就意味着它

们通过同一条直线. 例如,接上面的例子我们继续对点  和点  绘图, 得到下图:

 

这三条曲线在平面相交于点 (0.925, 9.6), 坐标表示的是参数对  或者是说点, 点和点组成的平面内的的直线。

 

【5】以上的说明表明,一般来说, 一条直线能够通过在平面  寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。

【6】这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数对在原图像中为一条直线。

  1. 3.       void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )

l   第一个参数:8位单通道二进制图像。

l   InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0~垂直线,π/2~水平线)

l   Rho,直线搜索时的进步尺寸的单位半径;以像素为单位。

l   Theta:直线搜索时的进步尺寸的单位角度;以弧度为单位,

l   第五个参数:Threshold:累加参数和的阈值,即是只有某条直线上识别到的点大于这个阈值的时候才能被返回带结果中去。

l   第六个参数:srn 默认值为0.对于多尺度的霍夫变换,这是第三个参数rho的除数距离,粗略的累加器的进步尺寸是rho,而精确的累加器的进步尺寸为rho/srn.

l   第七个参数:stn 默认值为0,对于多尺度的霍夫变换,这是第三个参数theta的除数距离,若有srn和stn同时为0 的时候就表示经典的霍夫变换,否则都应该为正数。

补充:

l  cvTclor();此函数可以实现图像类型的转化,一般在要求的函数需要哪种类型的传入图像时,使用这个函数进行处理就可以了。

l  CV_PI这个东西就是在OPENCV中表示1度的弧度制的值。

l  对于第二个参数的解释,用矢量结构vetor<vec2f> 来定义。其中若定义一个Line 对象,Line是一个二维矩阵,Line[i][0]表示第i个线段矢量的P值,Line[i][1]表示第i个线段矢量的θ值.

l  对于矢量的定义:使用vector<…>进行定义:例如定义一个4变量整形的矢量:vector<Vec4i>;定义一个2个变量的float的矢量为vector<Vec2f>.实际上vector是一个动态数组,当不知道使用多大内存时可以使用。应该理解为存在一种数据类型Vec4i,而vector的作用就是生成一个Vec4i的动态数组。Vector<vector<…>> a:表示定义的是…类型的二维数组a;

  1. void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

l   第一个参数:8位单通道二进制图像。

l  第二个参数:经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有四个元素的矢量(X1,X2,X3,X4)表示,其中(X1,Y1)和(X2,Y2)是每个检测到的线段的结束点。

l   Rho,直线搜索时的进步尺寸的单位半径;以像素为单位。

l   Theta:直线搜索时的进步尺寸的单位角度;以弧度为单位,

l   第五个参数:Threshold:累加参数和的阈值,即是只有某条直线上识别到的点大于这个阈值的时候才能被返回带结果中去。

l   第六个参数:minLineLength 默认值为0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。

l   第七个参数:maxLineGap 默认值为0 允许将同一行的点连接起来的最大距离。

时间: 2024-10-27 11:57:51

霍夫变换(一)霍夫线性变换的相关文章

20、【opencv入门】霍夫变换:霍夫线变换,霍夫圆变换合辑

一.引言 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.最基本的霍夫变换是从黑白图像中检测直线(线段). 二.霍夫变换概述 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状

学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换

在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法. 先尝鲜一下其中一个示例程序的运行截图: 一.引言 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确的检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像识别几何形状的基

python数字图像处理(15):霍夫线变换

在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如

霍夫线变换,霍夫圆变换

在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.最基本的霍夫变换是从黑白图像中检测直线(线段). 1.霍夫变换 ⑴霍夫变换概述 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形

霍夫圆检测 opencv

进行霍夫圆变换中有一个API:HoughCircles(). 第五个参数为double类型的minDist(),为霍夫变换检测到的圆的圆心之间的最小距离,即让算法能明显区分的两个不同圆之间的最小距离.这个参数如果设置太小,多个相邻的圆可能被错误的检测成了一个重合的圆.反之,如果设置太大,某些圆就不能检测出来. 第七个参数,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了. 1 #include<opencv2/opencv.hpp> 2 3 usin

opencv之霍夫曼变换

霍夫变换不仅可以找出图片中的直线,也可以找出圆,椭圆,三角形等等,只要你能定义出直线方程,圆形的方程等等. 不得不说,现在网上的各种博客质量真的不行,网上一堆文章,乱TM瞎写,误人子弟.本身自己就没有理解的很清楚,又不去读算法实现的源码,写的云山雾罩的,越看越懵逼. 霍夫变换本身的思路是很简明的.这篇文章我们就以霍夫直线变换说明算法的思想. 霍夫变换 思考一下,二维平面里我们怎么表达直线. 有两种表达方式: 直角坐标系(也叫笛卡尔坐标系) 极坐标系(也叫球坐标系) 第一种就是最常见的直角坐标系下

opencv —— HoughLines、HoughLinesP 霍夫线变换(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)

霍夫线变换的原理 一条直线在图像二维空间可由两个变量表示,有以下两种情况: ① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示. ② 在极坐标系中:可由参数极经和极角(r,θ)表示. 对于霍夫线变换,我们将采用第二种方式极坐标系来表示直线,因此直线的表达式可为: 化简便可得到: 对于(x0,y0),我们可以将通过这一点的所有直线统一定义为: 这就意味着每一对  代表一条通过点  的直线. 对于一个给定点   ,我们可以在直角坐标系中,绘出所有通过它的直线(θ 为 x 轴,r 为 y 轴).最

[BZOJ1002] [FJOI2007] 轮状病毒 (基尔霍夫矩阵)

Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 HINT Source Solution 基尔霍夫矩阵,左转生成树的计数及其应用 推出本题的递推式:f[n] = f[n - 1] * 3 - f[n - 2] + 2 如果你能看懂,拜托给我讲讲,本人不懂. 注意要使用高精度 1 #include <cstri

基于python的二元霍夫曼编码译码详细设计

一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图片转为灰度的bmp图像,此时每个像素点可以用单个像素点来表示. ②:二元霍夫曼编码: 程序流程图: 详细设计: 统计像素点频率,首先通过python自带的PIL库的图像像素点读取函数read()获取灰度图像的所有像素点,通过循环遍历每个像素点,将每个出现的像素点值以及其次数以键值对的形式放入到pyt