文档库 最新最全的文档下载
当前位置:文档库 › 霍夫变换直线检测C++程序代码

霍夫变换直线检测C++程序代码

霍夫变换直线检测C++程序代码
霍夫变换直线检测C++程序代码

霍夫变换直线检测C++程序代码

前段时间想在网上找个现成的霍夫变换直线检测的C++程序,发现找到的都是调用OpenCV 库函数来实现的,都不能用,没办法,回头只能自己写了。具体代码如下,如有问题还请多多指教!个人百度空间:https://www.wendangku.net/doc/f4673808.html,/new/zxw080800

// 接口参数描述

// pImg ----待检测图片指针

// width----图像宽

// height---图像高

// k----------返回检测到的直线的斜率

// b---------返回检测到的直线的纵截距

// FIT_POINT_PIX_VAL-----用于进行直线检测的拟合点的像素值(预先设定好)

void zxwHoughTransform(BYTE *pImg, int width, int height, double &k, double &b)

{

// 赋初值,检测角度的最大值和最小值

const int MinTheta = 0;

const int MaxTheta = 180;

int i, j;

int w, h;

int cosV, sinV;

int **count, max, nmax;

int theta, thro;

// 初始化

nmax = (int)sqrt(width * width + height * height);

count = new int * [MaxTheta];

for (i = 0; i < MaxTheta; i++)

{

count[i] = new int[nmax];

memset(count[i], 0, sizeof(int) * nmax);

}

// 统计count值

BYTE *pCur = pImg;

for(theta = MinTheta; theta < MaxTheta; theta += 1)

{

cosV = (int)(cos(PI * theta / 180) * 2048);

sinV = (int)(sin(PI * theta / 180) * 2048);

for(h = 0; h < height; h++)

{

for(w = 0; w < width; w++)

{

if(*(pCur + h * width + w) == FIT_POINT_PIX_VAL)

{

thro = (w * cosV + h * sinV)>>11;

if(thro < nmax && thro > 0)

{

count[theta][thro]++;

}

}

}

}

}

// 求取出现次数最多的count所对应的theta和thro

max = count[0][0];

theta = 0;

thro = 0;

for(i = MinTheta; i < MaxTheta; i++)

{

for(j = 0; j < nmax; j++)

{

if(count[i][j] > max)

{

max = count[i][j];

theta = i;

thro = j;

}

}

}

// 返回--坐标转换返回

k = - 1.0 / tan(PI * theta / 180);

b = thro / sin(PI * theta / 180);

// delete

for(i = 0; i < MaxTheta; i++)

{

delete []count[i];

}

delete []count;

}

以一般化视角串联霍夫变换(hough transform),从直线到圆再到广义霍夫变换

计算机视觉中经常需要识别或者定位某些几何图形,比如直线、圆、椭圆,还有其他一些图形。检测直线的霍夫变换提供了在图像中寻找直线的一种算法,是最简单的一种情形,后来发展到检测圆、椭圆、还有一般图形的霍夫变换,其核心思想是把图像中属于某种图形的点集(二维)映射到一个点(可以是高维)上,这个点记录了点集中点的数目,使得程序通过搜索峰值找到该点,这个点就是后面要说到的图形的参数,而该参数的范围就叫做参数空间。霍夫变换不仅能够识别出图像中有无需要检测的图形,而且能够定位到该图像(包括位置、角度等),这就非常有用了。接下来将通过分析从简单到复杂的霍夫变换,导出霍夫变换的实质。 直线:检测直线的霍夫变换使用含极坐标参数的直线表示型式简称极坐标式(不是极坐标方程, 因为还是在笛卡尔坐标下表示)—— 其中的两个参数的意义如下图: 为什么要用极坐标式而不直接用一般形式:ax+by=c(归一化可以去掉参数c),或者其他的如斜截式、截距式呢?首先它们都会遇到奇异情况,比如c=0,斜率=无穷大,其中一个截距=0;再一个是某些形式的参数空间不是闭的,比如斜截式的斜率k,取值范围从0到无穷大,给量化搜索带来了困难。而极坐标式就妙在距离和角度两个参数都是有界的,而且正余弦函数也有界不会发生奇异情况。 直线霍夫变换有两个参数,且这两个参数通过极坐标式相关联,所以程序在投票阶段(图形点集转换到一个点)只需要遍历其中一个,搜索峰值在二维参数空间进行。

圆:霍夫变换检测圆使用圆的标准式就可以了 —— 我们发现圆的方程又比直线多了一个参数,这三个参数通过上面的方程相关联,因此在投票阶段需要遍历其中两个,搜索峰值在三维参数空间进行。如果图像比较大,那么这样的遍历搜索是相当耗时的,所以为了满足实时性后来又发展出其他检测圆的霍夫变换,比如概率霍夫变换,结合梯度信息的霍夫变换。 霍夫变换检测椭圆如果使用椭圆的标准式,那么将会有五个参数,它们通过标准式相关,检测圆就已经相当耗时了,如果再用这中方程形式处理势必失去实际用途。 Ballard (1981) 一般化了霍夫变换(Hough,1962),利用图形梯度量加快算法速度,形成了一般霍夫变换。 透过前面的检测直线、圆、一般霍夫变换,已经可以提取出霍夫变换的一个本质——给出图形的一个描述模式,比如图形点集的方程、函数、表格等,然后利用这个模式加上遍历参数空间,把属于该模式的图形点集投射到参数空间的一个点(实际的离散情况一般不会完美的集中到一点),这个点记录的是图形点数目。 一般霍夫变换之所以能处理任意形状的图形并不是找到了可以表示任意图形的方程(这是不可能的),而是使用表的形式描述一种图形,把图形边缘点坐标保存在一张表中,那么该图形就确定下来了,所以其实无论是直线(其实是线段)、圆、椭圆还是其他形状的几何图形,都可以使用同一方法处理,所不同的是这时候的图形是自定义的,是实在的,而代数方程表示的模式是连续的、抽象的,圆的方程只有一种,但自定义的圆却是无穷的,只要你认为它足够圆了就可以。当然两种表示都会有各自的优势和局限。有了表之后就需要找到一种可以把图形点集投射到参数空间的一点的转换算法,例如直线和圆霍夫变换通过方程(函数)及遍历把点集进行投射,使得属于某直线或圆的点集中到一个点;那么仅有一张描述图形边缘坐标点的表如何进行投射呢?我们可以把这张表看作是模板,进行模板匹配,大部分的点匹配成功也就可以理解为这些点都投射到一个点上,不过这时候不需要再搜索参数空间峰值了,这种模式可以认为是参数间没有任何关联,所以是完全的遍历。但有旋转加上缩放的情况模板匹配型的霍夫变换是十分耗时的,也可以想象成因为参数不相关所以增加遍历搜索时间。Ballard (1981) 的一般霍夫变换最精妙之处在于为参数增加了两个关联,使得有平移和旋转(无缩放)的情况只需要遍历一个参数,三个参数分别是图形的中心坐标(横纵),旋转角度(相对参考图形),Ballard 的算法预先把参考图形边缘点对中心的径向量保存起来,利用待搜索图形边缘点的梯度方向(用相对坐标轴的角度表示)作为索引找到相应的径向量,加上该量后就完成了投射,所以要遍历的参数只有旋转角度,所以说有两个关联。当然如果加上缩放就要遍历两个参数,这也只是和霍夫检测圆的规模一样而已。这种一般霍夫变换的图形表不再是直接保存坐标,而是边缘点的梯度加上径向量,还有一个中心坐标,给出了这些量同样的也就能够表示出一种图形了。然而这种一般霍夫变换也是有缺陷的,不少后来者提出了改进方法,这不在本文讨论范围。 再来强调一次,霍夫变换就是通过图形的一种表示模式,加上一种转换方法,把图形的点集投射到一个点上以便检测。我们已经能够知道,参数个数越少,需要遍历的参数个数约少(关联越多),参数空间越小则处理速度越快。所以设计一种合理的转换方法非常关键。

霍夫变换

‘IEEE Transactions on Pattern Recognition And Machine Intelligence’ ‘IEEE Transactions on Image Processing’ 是最重要的两本,其它的如ICCV、CVPR、ECCV、NIPS、BMVC等的会议文章也非常好。 最小二乘线性拟合算法、随机霍夫变换、局部霍夫变换、 canny算子边缘检测、图像增强 霍夫变换 霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。 详细内容 我们先看这样一个问题:设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一组直线。方程y0=kx0+b在参数k--b平面上是一条直线(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(2,2)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。 应用 这个性质就为我们解决问题提供了方法:首先,我们初始化一块缓冲区,对应于参数 平面,将其所有数据置为0.对于图像上每一前景点,求出参数平面对应的直线,把这 直线上的所有点的值都加1。最后,找到参数平面上最大点的位置,这个位置就是原 图像上直线的参数。上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参 数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最 终在参数平面上就会看到两个峰值点,依此类推。在实际应用中,y=k*x+b形式的直 线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用 中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就 对应到参数p—theta平面上的一条曲线上。其它的还是一样。 应用实例1

图像处理之霍夫变换

图像处理之霍夫变换(直线检测算法) 霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何 形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪 声干扰。经典的霍夫变换常用来检测直线,圆,椭圆等。 霍夫变换算法思想: 以直线检测为例,每个像素坐标点经过变换都变成都直线特质有贡献的统一度量,一个简单 的例子如下:一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式, 可以表达出直线的离散点几何等式如下: X *cos(theta) + y * sin(theta) = r 其中角度theta指r与X轴之间的夹角,r为 到直线几何垂 直距离。任何在直线上点,x, y都可以表达,其中r,theta是常量。该公式图形表示如下: 然而在实现的图像处理领域,图像的像素坐标P(x, y)是已知的,而r, theta则是我们要寻找 的变量。如果我们能绘制每个(r, theta)值根据像素点坐标P(x, y)值的话,那么就从图像笛卡

尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫变换。变换 通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,每个像素 坐标点P(x, y)被转换到(r, theta)的曲线点上面,累加到对应的格子数据点,当一个波峰出现 时候,说明有直线存在。同样的原理,我们可以用来检测圆,只是对于圆的参数方程变为如 下等式: (x –a ) ^2 + (y-b) ^ 2 = r^2其中(a, b)为圆的中心点坐标,r圆的半径。这样霍夫的参数空间就 变成一个三维参数空间。给定圆半径转为二维霍夫参数空间,变换相对简单,也比较常用。 编程思路解析: 1. 读取一幅带处理二值图像,最好背景为黑色。 2. 取得源像素数据 3. 根据直线的霍夫变换公式完成霍夫变换,预览霍夫空间结果 4. 寻找最大霍夫值,设置阈值,反变换到图像RGB值空间(程序难点之一) 5. 越界处理,显示霍夫变换处理以后的图像 关键代码解析: 直线的变换角度为[0 ~ PI]之间,设置等份为500为PI/500,同时根据参数直线参数方程的取值 范围为[-r, r]有如下霍夫参数定义: [java]view plaincopy 1.// prepare for hough transform 2.int centerX = width / 2; 3.int centerY = height / 2;

【CN109948470A】基于霍夫变换的停车线距离检测方法及系统【专利】

(19)中华人民共和国国家知识产权局 (12)发明专利申请 (10)申请公布号 (43)申请公布日 (21)申请号 201910154827.0 (22)申请日 2019.03.01 (71)申请人 武汉光庭科技有限公司 地址 430000 湖北省武汉市东湖新技术开 发区凤凰园三路一号 (72)发明人 苏晓聪 杨颖  (74)专利代理机构 武汉河山金堂专利事务所 (普通合伙) 42212 代理人 胡清堂 (51)Int.Cl. G06K 9/00(2006.01) G06K 9/46(2006.01) (54)发明名称基于霍夫变换的停车线距离检测方法及系统(57)摘要本发明所述一种基于霍夫变换的停车线距离检测方法及系统,其无需依靠GPS信号或GPS信息的定位,只需要在要停车的位置在地面画一条等宽的白色横线,利用相机检测离地面白色横线,采用图像像素与距离遍历的方式拟合成一个距离多项式,计算出所标记横线中间距离当前车辆参考点的垂直距离,并以一定帧率将该线离车辆的垂直距离发送给控制系统,为该系统在倒车最后停车时提供一个较为精准的停车位置点,从而达到精准倒车的目的;其计算简单,但计算结果精确,既达到了与控制系统联调实现±10cm的停车精度,又避免了通过复杂的步骤计算相机姿 态从而获得距离。权利要求书3页 说明书7页 附图6页CN 109948470 A 2019.06.28 C N 109948470 A

1.一种基于霍夫变换的停车线距离检测方法,其特征在于,所述基于霍夫变换的停车线距离检测方法包括以下步骤: S1、在停车位的倒车终点位置画一条相对于倒车方向垂直的停车线,并在车体上安装相机,所述相机与地面形成一定倾角,使得车辆最后停止区域在相机垂直照射区域内; S2、用相机拍摄已知大小的棋盘图,对拍摄得到的棋盘图像按像素值位置进行图像遍历,把像素位置定义为自变量,实际位置距离定义为因变量,通过计算自变量与因变量的对应关系找到距离拟合多项式; S3、在车辆自动倒车时,相机实时采集彩色图像,通过直线段角度阈值和纵坐标方向像素距离阈值对采集的彩色图像进行干扰区域筛选,将直线段定位到停车线区域; S4、根据停车线上当前像素点和周围邻域间像素关系来区分检测结果是停车线的上沿还是下沿,根据上沿或下沿的位置确定停车线中间位置到相机的垂直距离; 其中, 所述距离拟合多项式的具体公式如下: 上式中,u,v为棋盘格角点的像素位置,x,y为棋盘格角点与相机之间的实际位置距离,P ij 、q ij 为拟合多项式的参数。 2.根据权利要求1所述基于霍夫变换的停车线距离检测方法,其特征在于,所述步骤S2包括以下分步骤: S21、选一个能覆盖相机垂直视野的棋盘格,将棋盘格的最底部边沿放置在相机的最下沿视野; S22、用安装在车体上的相机拍摄棋盘图,将棋盘中的角点提取出来并标定各角点的物理坐标值; S23、将多个角点的物理坐标值作为自变量,棋盘格角点的实际位置距离作为因变量拟合得到的一个二元二次的距离拟合多项式; S24、量出棋盘格左上角点到相机的物理垂直距离,将测量物理垂直距离作为多项式的常量相加即为图像上在任意像素点的位置与相机之间的垂直方向物理距离。 3.根据权利要求1所述基于霍夫变换的停车线距离检测方法,其特征在于,所述步骤S3包括以下分步骤: S31、在车辆自动倒车时,相机实时采集彩色图像,将彩色图像转换为灰度图像,并对图像使用坎尼算子来检测图像所有边缘; S32、在检测到边缘区域后,用累积霍夫变换来获取直线段候选区域; S33、通过直线段的斜率来保留图像中的横向直线段,并保留纵坐标上离相机最近的一个直线段; S34、将得到的直线段转换为点集,并将同一行上的点集集中起来用最小二乘法拟合成一条直线段,得到停车线的两条边沿直线。 4.根据权利要求1所述基于霍夫变换的停车线距离检测方法,其特征在于,所述步骤S4 权 利 要 求 书1/3页2CN 109948470 A

图像处理之霍夫变换圆检测算法

图像处理之霍夫变换圆检测算法 一:霍夫变换检测圆的数学原理 根据极坐标,圆上任意一点的坐标可以表示为如上形式, 所以对于任意一个圆, 假设中心像素点p(x0, y0)像素点已知, 圆半径已知,则旋转360由极坐标方程可以得到每个点上得坐标同样,如果只是知道图像上像素点, 圆半径,旋转360°则中心点处的坐标值必定最强.这正是霍夫变换检测圆的数学原理. 二:算法流程 该算法大致可以分为以下几个步骤 三:运行效果

图像从空间坐标变换到极坐标效果, 最亮一点为圆心. 图像从极坐标变换回到空间坐标,检测结果显示: 四:关键代码解析 个人觉得这次注释已经是非常的详细啦,而且我写的还是中文注释[java]view plaincopy 1./** 2. * 霍夫变换处理 - 检测半径大小符合的圆的个数 3. * 1. 将图像像素从2D空间坐标转换到极坐标空间 4. * 2. 在极坐标空间中归一化各个点强度,使之在0?255之间 5. * 3. 根据极坐标的R值与输入参数(圆的半径)相等,寻找2D空间的像素点 6. * 4. 对找出的空间像素点赋予结果颜色(红色) 7. * 5. 返回结果2D空间像素集合 8. * @return int [] 9. */ 10.public int[] process() { 11.

12.// 对于圆的极坐标变换来说,我们需要360度的空间梯度叠加值 13. acc = new int[width * height]; 14.for (int y = 0; y < height; y++) { 15.for (int x = 0; x < width; x++) { 16. acc[y * width + x] = 0; 17. } 18. } 19.int x0, y0; 20.double t; 21.for (int x = 0; x < width; x++) { 22.for (int y = 0; y < height; y++) { 23. 24.if ((input[y * width + x] & 0xff) == 255) { 25. 26.for (int theta = 0; theta < 360; theta++) { 27. t = (theta * 3.14159265) / 180; // 角度值0 ~ 2*PI 28. x0 = (int) Math.round(x - r * Math.cos(t)); 29. y0 = (int) Math.round(y - r * Math.sin(t)); 30.if (x0 < width && x0 > 0 && y0 < height && y0 > 0) { 31. acc[x0 + (y0 * width)] += 1; 32. } 33. } 34. } 35. } 36. } 37. 38.// now normalise to 255 and put in format for a pixel array 39.int max = 0; 40. 41.// Find max acc value 42.for (int x = 0; x < width; x++) { 43.for (int y = 0; y < height; y++) { 44. 45.if (acc[x + (y * width)] > max) { 46. max = acc[x + (y * width)]; 47. } 48. } 49. } 50. 51.// 根据最大值,实现极坐标空间的灰度值归一化处理 52.int value; 53.for (int x = 0; x < width; x++) { 54.for (int y = 0; y < height; y++) {

霍夫变换检测直线圆流程+

Hough 变换直线检测是直接按照hough 变换的定义来进行的, 算法如下: 1) 对原始的图像进行二值化, 假设0代表背景, 1代表物体特征点; 2) 在参数空间ρ, θ里建立一个累加的数组[],H ρθ , 并且置数组H 中的每 一个元素的初值都为零; 对于二值图像中每个以1 表示的点(,)x y , 我们让θ取遍θ轴上所有可能的值, 并根据式(3-3)计算对应的ρ; 再根据ρ与θ的值(假设都已经取整) 对数组进行累加计算([][],,1H H ρθρθ=+) ; 3) 然后对数组[],H ρθ 进行局部的峰值检测, 得到被检测直线的参数ρ和θ。上述的算法受直线中的间隙与噪声的影响较小, 鲁棒性比较强,但其具有运算量太大的缺点, 极端情况下, 它的运算复杂度为3 ()n ο 。 传统随机hough 变换的具体算法如下: (a)构造一个边缘点集D , 然后初始化参数单元集P NULL = ,循环的次数K = 0 ; (b)从D 中随机的选取3 个点; (c)由这3个点解特征的参数p ; (d)在P 中寻找一个c p ,使它满足p c p δ-≤,如果找到则转(f);否则就转(e); (e)将p 插入到P 中,其对应的计数值变为1,转(g); (f)将c p 所对应的计数的值加1,如果小于指定阈值t N ,转(g);否则就转(h); (g)1k k =+;如果 max k k > ,则结束;否则,转(b); (h)c p 是候选圆的特征参数,如果该参数对应圆上的边缘的点数min pc M M >,转(i); (i) c p 是真实的圆参数,把落在参数c p 对应的特征上的点从D 中去除,然 后判断已经检测到的圆的数目是否已达到规定的数目,若是就结束,否 则的话重置P NULL =,0K =,转(b)。 其中max k 是规定的检测一个圆的过程中所允许采样的最大的循环次数。min M 为圆所必需的最小的点数, 通常设为2r πλ,其中λ是一个固定系数,r 是候选圆的半径。P 是参数空间中的参数单元的集合,它是一个动态的链表结构。pc M 是图像空间中落到了候选圆上的点数。

根据matlab的霍夫变换

基于matlab的霍夫变换 一、简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。 二、基本原理 Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线(圆的方程为:(x-a)^2+(y-b)^2=r^2,通过Hough变换,将图像空间对应到参数空间)。 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。 三、hough变换检测直线 设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点 (x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。如下图1所示: 从图1中可看出,x-y坐标和k-b坐标有点----线的对偶性。x-y坐标中的点P1、P2对应于k-b坐标中的L1、L2;而k-b坐标中的点P0对应于x-y坐标中的线L0 。 这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我

霍夫变换算子的分析与改进

第一章绪论 Hough变换(Hough Transformation,HT) 是直线检测中常用的方法之一,是由PaulHough在1962年提出的。它所实现的是一种从图像空间到参数空间的映射关系。Hough变换将图像空间中复杂的边缘特征信息映射为参数空间中的聚类检测问题。Duda和Hart于1972年首次用该方法提取直线。他们发现,当许多点的分布近似为一条直线时,这条直线可以用Hough变换的方法确定。经典HT常被用于直线、线段、圆和椭圆的检测。广义霍夫变换(Generalized Hough Transformation,GHT)可以推广至检测任意形状的图形。 Hough变换的突出优点就是将图像空间中较为困难的全局检测问题转化为参数空间中相对容易解决的局部峰值检测问题。也就是说,通过Hough变换之后,工作的重点就是如何更准确地、有效地检测出参数空间中共同投票区域的投票积累峰值。当参数空间证据积累完成以后,通常采用给定阈值的方法确定备选估计参数。但是,由于Hough变换自身的特点,使得提取出来的备选估计参数远远多于真实参数的个数,而且有好多备选估计参数来源于同一直线上数据点的投票积累。若直接以备选估计参数作为检测到的直线参数输出直线,则是不符合实际、不正确的。所以,在确定最终参数时,需要对备选估计参数做一定的处理,从而保证检测的准确性。Hough 变换方法还具有明了的几何解析性、一定的抗干扰能力和易于实现并行处理点.Hough变换是从图像中识别几何形状的基本方法之一,因此有着广泛的应用。例如:基于Hough变换的航片框标定位算法,霍夫变换在潮位相关分析中的应用等。 第二章 Hough变换 2. 1 基本原理 Hough变换的基本原理是将影像空间中的曲线(包括直线)变换到参数空间中,通过检测参数空间中的极值点,确定出该曲线的描

霍夫变换

霍夫变换

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

霍夫变换检测圆和直线

霍夫变换检测任意形状 一、实验目的 1.掌握MATLAB软件的使用,以及其设计流程; 2.掌握霍夫变换的实现方法; 3.用MATLAB语言设计基于霍夫变换的任意图形的识别。 二、实验仪器或设备 装MATLAB软件的微机一台 三、总体设计原理及流程图 1、程序设计的原理 霍夫变换的基本思想就是把图像平面上的点对应到参数平面上的曲线,最后通过统计特性来解决问题。具有良好的抗噪声性能和对部分遮盖的不敏感等特性。 2、程序流程图

四、主要程序代码 1、霍夫变换检测圆程序 clear all; close all; clc; % [cr,st]=circle_product;%st(1)->x,st(2)->y,st(3)->r cr=imread('sample.bmp');%circle1.bmp figure; imshow(cr); [row,range]=size(cr); p=row*range;a=0;Y=zeros(1,p);Q=zeros(1,p); for k1=1:1:row for k2=1:1:range if cr(k1,k2)==0 a=a+1; XXX=k2-1;YYY=row+1-k1; Y(a)=YYY;Q(a)=XXX; end end end for k3=1:1:p if Y(k3)==0&Q(k3)==0 break; end end % z=ones(1,5); % a=1:1:300;b=1:1:300; % z1=sqrt((a-Q(1)).^2+(b-Y(1)).^2); % z2=sqrt((a-Q(2)).^2+(b-Y(2)).^2); % z3=sqrt((a-Q(3)).^2+(b-Y(3)).^2); % z4=sqrt((a-Q(4)).^2+(b-Y(4)).^2); % z5=sqrt((a-Q(5)).^2+(b-Y(5)).^2); % % z1=sqrt((a-Q(1))*(a-Q(1))+(b-Y(1))*(b-Y(1))); % % Z1=(a-Q(1)).^2+(b-Y(1)).^2; r0=(abs(z1-z2)<=0.1&abs(z1<=z3)<=0.1&abs(z1<=z4)<=0.1&abs(z1<=z5)<=0.1&abs(z2<=z3)< =0.1&abs(z2<=z4)<=0.1&abs(z2<=z5)<=0.1); % r=r0.*z1; % aa=r0.*a; % bb=r0.*b; % rrr=round(r(r0~=0)) % aaa=aa(r0~=0) % bbb=bb(r0~=0) k7=floor(k3/6);k5=2; a=1:1:300;b=1:1:300;rrr=zeros(1,p);aaa=zeros(1,p);bb=zeros(1,p);k6=0;as=0;k11=1; for k5=1:1:k7

霍夫变换+最小二乘法 直线检测

霍夫变换中直线拟合的最小二乘法 ichriZ 1.基本概念 (1)霍夫变换 霍夫变换(Hough Transform) 是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线或线段。 (2)最小二乘法 曲线拟合方法的一种,通过最小化误差的平方和寻找数据的最佳函数匹配。 2.适用情况 霍夫变换是基于统计的方法,能将图像中的噪声或干扰点的影响消除,但其结果存在精度不够与直线有效区间不易控制的问题;最小二乘法是直线拟合的有效方法,但直接用于拟合时易受干扰点或噪声点影响。在检测图像中的直线段时,先利用霍夫变换消除无效点的影响,再结合最小二乘法法进行拟合,可以提高检测效果。 3.霍夫变换原理与实现方法 (一)霍夫变换原理 在平面直角坐标系中一条直线,任取其上一点,有 表示参数平面中的一条直线。再取上另一点则有 表示参数平面中的一条直线。与相交于一点,对应于坐标系 中直线 即:同一直线上的不同的点在对应的参数平面中对应不同的直线,但都交于同一点,所以可以通过坐标系中的交点来寻找坐标系中的直线。当坐标系中的直 线数量为R时,坐标系中对应R个峰值交点,它们对应于坐标系中的R 条直线。 此种方法不能够表示这类直线,实际中常将原有直线表示为参数方程 此直线上的点对应坐标系中的一族三角函数曲线,它们在有效区间内交于一点

,对应于坐标系中的。下图是一个具体例子: 交点坐标 (二)最小二乘法原理 对于给定数据,要求在某个函数类 中寻求一个函数 ,使 本文中讨论的是直线的最小二乘法,故均取一次多项式。 设具有如下格式 霍夫变换—>

结合NNDR与霍夫变换的匹配方法

结合NNDR 与霍夫变换的匹配方法 在建立两幅图像之间局部特征的匹配关系时,可以参照Marr 等人错误!未找到引用源。提出的匹配应该满足唯一性、相似性、连续性三个基本约束条件,即物体表面任意一点到观察点的距离是唯一的,因此其视差是唯一的,给定一幅图像中的一点,其在另一幅图像中对应的匹配点最多只有一个;对应的特征应有相同的属性,在某种度量下,同一物理特征在两幅图像中具有相似的描述符;与观察点的距离相比,物体表面因凹凸不平引起的深度变化是缓慢的,因而视差变化是缓慢的,或者说视差具有连续性。 1 基于NNDR 的匹配策略 目前常用的目标匹配策略有两种:一种是距离阈值法(Threshold-based Matching ),即待匹配目标与模型之间的距离小于某个阈值,则认为匹配上了,该方法非常简单,但是阈值的确定非常困难,而且目标很容易匹配上多个模型,从而产生大量的误匹配;另一种是最小距离法(Minimum Distance),即目标只匹配与其距离最近的模型,实际应用中一般还需要满足距离小于某个阈值的条件,该方法只有一个最佳的匹配结果,相对于距离阈值法来说,正确率要高。 由于图像的内容千差万别,加上场景中的运动物体、不重叠内容以及图像质量等因素的存在,一幅图像中的局部特征并不一定能够在另一幅图像中找到相似的特征,这就需要采取措施剔除那些产生干扰的噪声点,通常把这样的点称为“外点”。许多图像的背景比较相似并不具有区分性,如天空、旷野之类,它们的局部特征之间的距离要小于有用的特征之间的距离,但是它们并不能描述图像的主要内容,所以设置一个全局性的距离阈值来决定局部特征匹配与否显然是不合适的。 对SIFT 特征的研究错误!未找到引用源。表明,可以通过比较最近邻(First Nearest Neighbor )特征和次近邻(Second Nearest Neighbor )特征的距离可以有效地甄别局部特征是否正确匹配。这就是最邻近距离比值法(Nearest Neighbor Distance Ratio, NNDR ),其表述如下,如果待匹配特征为A D ,其最邻近特征为B D ,次邻近特征为C D ,那么判断该特征匹配的条件为: A B A C D D t D D -<- (5-1) 该方法理论来源是,如果一个特征在一幅图像中与两个特征的距离都很相近,

霍夫变换函数

霍夫变换函数:hough;houghpeaks;houghlines(1) (2014-03-31 11:50:36) 转载▼ 分类:matlab 图像处理工具箱提供了三个与霍夫变换有关的函数。函数hough实现了前面讨论的概念,函数houghpeaks寻找霍夫变换的峰值(累加单元的高计数),函数houghlines以来自其他两个函数的结果为基础在原始图像中提取线段。 1. 函数hough 函数hough支持任意的默认语法: [H, theta, rho] = hough(f) 还支持完整的语法形式: [H, theta, rho] = hough(f, 'ThetaRes', val1, 'RhoRes', val2) 其中,H是霍夫变换矩阵,theta(以度计)和rho是ρ和θ值向量,在这些值上产生霍夫变换。输入f是二值图像,val1是0到90的标量,指定了沿θ轴霍夫变换的间距(默认是1),val2是0 例10.5 霍夫变换的说明 在这个例子中,我们用简单的合成图像来说明hough函数的机理:>> f = zeros(101, 101); >> f(1, 1) = 1; f(101, 1) = 1; f(1, 101) = 1; >> f(101, 101) = 1; f(51, 51) = 1; 图10-10(a)显示了我们的测试图像,下面使用默认值计算并显示霍夫变换的结果:

>> H = hough(f) >> Imshow(H,[]) 图10-10(b)显示了结果,以熟悉的方法使用imshow函数来显示。在带有标度轴的较大图中显现霍夫变换常常更有用。 在接下来的代码片段中,我们调用带有三个参数的hough函数。然后把向量theta和rho作为附加输入参量传递给imshow,从而控制水平轴和垂直轴的标度。我们还要把'InitialMagnification'选项传递给带有值'fit'的imshow函数,因此,整个图像将被强迫在图形窗口中进行装配。axis 函数被用来打开轴标记,并使其显示填充图的矩形框。最后,xlabel和ylabel函数(见2.3.1节)用希腊字母LaTeX字体符号在轴上标值: >> [H, theta, rho] = hough(f); >> imshow(H, [], 'XData', theta, 'YData', rho ,'InitialMagnification', 'fit') >> axis on, axis normal >> xlabel('\theta'), ylabel('\rho') 图10-10(c)显示了标上值之后的结果。三条曲线(直线也可考虑为曲线)在±45°处的交点指出:f中有两组三个共线的点。两条曲线在 (ρ,θ)=(0,-90)、(-100,-90)、(0,0)和(100,0)处的交点指出:有4组位于垂直线和水平线上的共线点。

霍夫变换

3.3.3 提取图形区域(Extracting Graphic Region ) 图形的描述相对较复杂,考虑到文档图象中常见的图形主要是直线,因此我们在实际处理中仅检测各方向的直线。 由于在文档的光电转换中,如扫描等,常会出现图象倾斜,Stuart 等[30]指出,进行倾斜校正会使压缩比提高1%左右,因此有必要对倾斜的图象进行校正。同时,使原本水平和竖直的直线更加容易发现。此外,在图象中除了水平和竖直的直线外,通常还会出现其它方向的直线。为了能够检测到不是水平或竖直的直线,我们需要构造具有一定方向性的形态学算子。在本文中,我们检测图象中的各直线段方向,然后构造相应的结构元素将其检测出。 (1) HOUGH 变换 在检测直线中,很容易想到利用Hough 变换[60]。下面简单介绍Hough 变换。 直线y = mx + b 可用极坐标表示为: )sin()cos(θθy x r +=,也可表示为: y x tg y x r =++= )()sin(2 2??θ,其中 式(3.15) 其中,(r ,θ)定义了一个从原点到该直线最近点的向量,显然,这个向量与该直线垂直。如图3.7所示。 图3.7 直线的极坐标表示 Fig3.7 Polar Coordinates of a line 考虑一个以参数r 和θ构成的二维空间。x,y 平面的任意一直线对应了r,θ平面上的一个点。因此,x,y 平面上的任意一直线的Hough 变换是r, θ平面上的一个点。 现在考虑x,y 平面的一个特定的点(x 0,y 0)。过该点的直线可以有很多,每一条都对应了r, θ空间中的一个点。然而这些点必须是满足以x 0,y 0作为常量时

霍夫变换

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。 我们先看这样一个问题: 设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。 我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法: 1.首先,我们初始化一块缓冲区,对应于参数平面,将其所有数据置为0. 2.对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点 的值都加1。 3.最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。 上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。 在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程 p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数 p---theta平面上的一条曲线上。其它的还是一样。 再看下面一个问题: 我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。 在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。 把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还是找参数空间中的峰值点。不过,这个

霍夫变换直线检测C++程序代码

霍夫变换直线检测C++程序代码 前段时间想在网上找个现成的霍夫变换直线检测的C++程序,发现找到的都是调用OpenCV 库函数来实现的,都不能用,没办法,回头只能自己写了。具体代码如下,如有问题还请多多指教!个人百度空间:https://www.wendangku.net/doc/f4673808.html,/new/zxw080800 // 接口参数描述 // pImg ----待检测图片指针 // width----图像宽 // height---图像高 // k----------返回检测到的直线的斜率 // b---------返回检测到的直线的纵截距 // FIT_POINT_PIX_VAL-----用于进行直线检测的拟合点的像素值(预先设定好) void zxwHoughTransform(BYTE *pImg, int width, int height, double &k, double &b) { // 赋初值,检测角度的最大值和最小值 const int MinTheta = 0; const int MaxTheta = 180; int i, j; int w, h; int cosV, sinV; int **count, max, nmax; int theta, thro; // 初始化 nmax = (int)sqrt(width * width + height * height); count = new int * [MaxTheta]; for (i = 0; i < MaxTheta; i++) { count[i] = new int[nmax]; memset(count[i], 0, sizeof(int) * nmax); } // 统计count值 BYTE *pCur = pImg; for(theta = MinTheta; theta < MaxTheta; theta += 1) { cosV = (int)(cos(PI * theta / 180) * 2048); sinV = (int)(sin(PI * theta / 180) * 2048); for(h = 0; h < height; h++) { for(w = 0; w < width; w++) {

相关文档