Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。圆的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。附录中的MATLAB程序为网上比较常见的,实际运行中存在一些问题,这里进行些修改。原理:

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。

我们先看这样一个问题:设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用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)。这个性质就为我们解决问题提供了方法:

首先,我们初始化一块缓冲区,对应于参数平面,将其所有数据置为0.

对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。

最后,找到参数平面上最大点的位置,这个位置就是原图像上直线的参数。     上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线,最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。

在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。

在看下面一个问题:我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。

把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还是找参数空间中的峰值点。不过,这个方法显然需要大量的内存,运行速度也会是很大问题。

有什么更好的方法么?我们前面假定的图像都是黑白图像(2值图像),实际上这些2值图像多是彩色或灰度图像通过边缘提取来的。我们前面提到过,图像边缘除了位置信息,还有方向信息也很重要,这里就用上了。根据圆的性质,圆的半径一定在垂直于圆的切线的直线上,也就是说,在圆上任意一点的法线上。这样,解决上面的问题,我们仍采用2维的参数空间,对于图像上的每一前景点,加上它的方向信息,都可以确定出一条直线,圆的圆心就在这条直线上。这样一来,问题就会简单了许多。

接下来还有许多类似的问题,如检测出椭圆,正方形,长方形,圆弧等等。这些方法大都类似,关键就是需要熟悉这些几何形状的数学性质。霍夫变换的应用是很广泛的,比如我们要做一个支票识别的任务,假设支票上肯定有一个红颜色的方形印章,我们可以通过霍夫变换来对这个印章进行快速定位,在配合其它手段进行其它处理。霍夫变换由于不受图像旋转的影响,所以很容易的可以用来进行定位。     霍夫变换有许多改进方法,一个比较重要的概念是广义霍夫变换,它是针对所有曲线的,用处也很大。就是针对直线的霍夫变换也有很多改进算法,比如前面的方法我们没有考虑图像上的这一直线上的点是否连续的问题,这些都要随着应用的不同而有优化的方法。

实现:

上文中提到了检测圆的切线的方法,这里暂且不讨论,这里讨论经典HOUGH算法。下面为我写的利用极坐标表示圆的一种算法流程。

1.图像灰度化,二值化(注意:二值化的好坏对检测结果有很大影响,常用的有SOBEL算子)

2.检测图像中的边缘点,并保存其坐标位置。设置角度theta的变化范围和步长,半径r的变换范围和步长。

3.利用公式x=a+rcos(theta),y=b+rsin(theta)求出a和b的值。(注意:x和y为实际的图像空间某个边缘点的坐标,a和b为其对应的参数空间的坐标),如果a和b的值在合理的范围之类,则对该位置进行累加。

例如:

for i=1:ecount

for r=1:size_r

for k=1:size_angle

a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));

b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));

if(a>0&a<=m&b>0&b<=n)

hough_space(a,b,r) = hough_space(a,b,r)+1;

end

end

end

end

4.检索完毕,寻找最大值,求出圆心坐标与半径,保存。

附录:程序中红色的部分是我修改的。修改后编译通过。

function [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p);

%[HOUGH_SPACE,HOUGH_CIRCLE,PARA] = HOUGH_CIRCLE(BW,STEP_R,STEP_ANGLE,R_MAX,P)

%------------------------------算法概述-----------------------------

% 该算法通过a = x-r*cos(angle),b = y-r*sin(angle)将圆图像中的边缘点

% 映射到参数空间(a,b,r)中,由于是数字图像且采取极坐标,angle和r都取

% 一定的范围和步长,这样通过两重循环(angle循环和r循环)即可将原图像

% 空间的点映射到参数空间中,再在参数空间(即一个由许多小立方体组成的

% 大立方体)中寻找圆心,然后求出半径坐标。

%-------------------------------------------------------------------

%------------------------------输入参数-----------------------------

% BW:二值图像;

% step_r:检测的圆半径步长

% step_angle:角度步长,单位为弧度

% r_min:最小圆半径

% r_max:最大圆半径

% p:以p*hough_space的最大值为阈值,p取0,1之间的数

%-------------------------------------------------------------------

%------------------------------输出参数-----------------------------

% hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数

% hough_circl:二值图像,检测到的圆

% para:检测到的圆的圆心、半径

%-------------------------------------------------------------------

% From Internet,Modified by mhjerry,2011-12-11

[m,n] = size(BW);

size_r = round((r_max-r_min)/step_r)+1;

size_angle = round(2*pi/step_angle);

hough_space = zeros(m,n,size_r);

[rows,cols] = find(BW);

ecount = size(rows);

% Hough变换

% 将图像空间(x,y)对应到参数空间(a,b,r)

% a = x-r*cos(angle)

% b = y-r*sin(angle)

for i=1:ecount

for r=1:size_r

for k=1:size_angle

a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));

b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));

if(a>0&a<=m&b>0&b<=n)

hough_space(a,b,r) = hough_space(a,b,r)+1;

end

end

end

end

% 搜索超过阈值的聚集点

max_para = max(max(max(hough_space)));

index = find(hough_space>=max_para*p);

length = size(index);

hough_circle=zeros(m,n);

for i=1:ecount

for k=1:length

par3 = floor(index(k)/(m*n))+1;

par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

if((rows(i)-par1)^2+(cols(i)-par2)^2

(rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5)

hough_circle(rows(i),cols(i)) = 1;

end

end

end

% 打印结果

for k=1:length

par3 = floor(index(k)/(m*n))+1;

par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

par3 = r_min+(par3-1)*step_r;

fprintf(1,'Center %d %d radius %d\n',par1,par2,par3);

para(:,k) = [par1,par2,par3]';

end

代码我已经上传到我的资源里,需要下载的,可以进我的空间下载。

注意半径范围的选取,直接影响到你想要检测的圆。而且,如果图像太大,且步长取得太小,可能会存在内存不够的情况。

程序:

运行结果:

原图:

边缘检测后:

检测结果:Center 62 59 radius 52

hough变换检测圆周_Hough变换检测圆(附:MATLAB程序)相关推荐

  1. hough变换检测圆周_hough变换原理以及实现(转载)

    原理链接如下:陌归:霍夫(Hough)变换之直线检测 代码链接:Ganso:Fundamentals--从车道线检测谈到霍夫变换 同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理 ...

  2. (附Matlab程序)(一)基于DCT编码的图像压缩:显示灰度图像 反余弦变换恢复图 DCT变换图 余弦变换系数图

    问题一:随机选取一整幅图像(命名"x.jpg"),编写Matlab程序显示灰度图像.反余弦变换恢复图.DCT变换图.余弦变换系数图,并与原始图像对比. clcclearclose ...

  3. (附Matlab程序)(二)基于DCT编码的图像压缩:对分解后的每个数据小方块进行DCT及IDCT变换

    问题一:随机选取一幅图像x.jpg,先将图像分解为8x8个数据块,然后分别对分解后的每个数据小方块进行DCT及IDCT变换,分别保留左上角3.10.15.32个系数进行处理,并对结果进行对比分析. c ...

  4. 激光雷达的检测仿真代码详解(附Matlab源码详解)

    一.创建velodyneFileReader 本示例中的激光雷达数据来自安装在车辆上的激光雷达Velodyne HDL32E.创建velodyneFileReader对象以读取录制的PCAP文件. f ...

  5. hough变换检测圆周_用点Hough变换实现圆检测的方法

    图像中圆的检测及其参数确定是计算机视觉和模式识 别中一项重要任务.常用的圆检测技术有形状分析法.环路积分微分法[1].圆变换()HoughCHT [2]等.是目前应用CHT 最为广泛的圆检测方法,该方 ...

  6. 直线/曲线检测:Randon变换与Hough变换

    一. Randon 变换 Radon变换简介 Tips: Radon变换的基本原理: 一个平面内沿不同的直线(直线与原点的距离为d,方向角为alfa)对f(x,y)做线积分,得到的像F(d,alfa) ...

  7. 【图像检测-道路检测】基于hough变换实现道路检测直线检测附matlab代码

    1 内容介绍 随着遥感技术和计算机技术的飞速发展,遥感图像的采集变得越来越容易,遥感图像中的物体特征识别及检测变得越来越重要,直线是图像中物体基本的特征之一,研究图像中直线的检测算法对计算机视觉和模式 ...

  8. c++ hough变换代码_hough变换原理以及实现(转载)

    原理链接如下:陌归:霍夫(Hough)变换之直线检测 代码链接:Ganso:Fundamentals--从车道线检测谈到霍夫变换 同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理 ...

  9. MATLAB仿真高速目标检测-基于keystone变换的微弱目标检测

    MATLAB仿真高速目标检测-基于keystone变换的微弱目标检测 高速目标检测具有跨距离走动,不易相参积累,而相参积累时间内,目标的距离走动不能超过半个距离单元,对于高距离分辨雷达或观测高速目标的 ...

  10. opencv 检测直线、线段、圆、矩形

    转自:http://blog.csdn.net/byxdaz/archive/2009/12/01/4912136.aspx 检测直线:cvHoughLines,cvHoughLines2 检测圆:c ...

最新文章

  1. numpy.matmul处理一维数组的 3维以上的性质
  2. JS判断数字字母中文
  3. 分布式系统——向zabbix中添加监控项, 以nginx和mysql为例
  4. 流与文件 java_java流与文件处理,请看代码:
  5. LeetCode Permutations
  6. SQL Servr 2008空间数据应用系列一:空间信息基础
  7. 【实践】飞猪交通个性化搜索推荐技术的实践与创新(附PPT下载链接)
  8. struts2:表单标签续(datetimepicker标签)
  9. linux解压压缩命令
  10. MATLAB模式识别基本操作函数解析
  11. windows做软件界面
  12. 微信小程序实例开发:跑起来
  13. 抠图软件有哪些?这些软件可以做到一键抠图
  14. three tables described the hot movie information in recent years
  15. XCode11上传ipa到AppStoreConnect
  16. linux6 下dns配置,RHEL6中DNS配置
  17. app分发源码完整­­|免签封装
  18. CNCC 2018 经典计算机算法技术论坛全解读 | CNCC 2018
  19. 4G数传图传一体模块 GSLINK-A2使用手册
  20. 水晶报表打印纸张设置

热门文章

  1. 图论及其应用 2016年 期末考试 答案总结
  2. 谨防!黑客是这样偷窥你的智能手机
  3. SPPnet论文总结
  4. java ssm旅游网站系统源码jsp maven项目推荐
  5. 利用Ejb开发WebService
  6. WinRAR 4.00 beta1 简体中文版
  7. java便利店库存管理系统_便利店库存管理系统可以做什么?
  8. weblogic启动项目失败查看_weblogic 部署项目成功,但是再界面上取不到数据
  9. 求大佬帮帮忙 ubuntu 安装完成vsftpd后用windows10的上安装的cutftp连接出现下面的情况 远程主机主动拒绝了对其进行的连接尝试
  10. java环境已经弄好jar文件还是打不开解决方法