Hough变换检测椭圆 附带matlab与opencv代码
由椭圆的公式(1)可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度。如果用传统的Hough变换方法,参数空间需要五维。这种方法在计算过程中所耗费的时间和空间资源是惊人的,根本无法应用于实际。为此,人们提出了很多新的改进算法。
改进算法主要分为两种:
- 1)随机Hough变换(RHT),采用多到一的映射,但是随机采样会带来大量无效的计算,当点数很大时,算法的性能急剧下降。
- 2)利用椭圆的几何特征降低参数的维度。
本文所提出的椭圆检测方法也是基于第二种方法。在讲该方法之前,先引入椭圆的一个几何定理:
定理 设平面上有一个椭圆,点 c 为椭圆中心,任取平面上一点 p(不同于点 c),点 p 距椭圆上点的最大距离一 定大于点 c 距椭圆上点的最大距离。
该定理是该方法的核心思想,也可表达为:椭圆中心(P,Q)是平面上所有点中,距离椭圆轮廓上点最大距离最小的点
利用这一几何性质,降低Hough 参数空间的维度。这句话听起来比较别扭,意思很简单。
通俗的说,就是计算 图像中每一点与椭圆(椭圆边界)最远的距离L,其中,L最小的点就是椭圆的中心,L就是椭圆的短轴a .
算法的具体步骤:
- 1)首先对图像进行边缘检测,得到二值化的边缘轮廓图,将边缘图上的点坐标存入数组 A。
- 2)对图像上的每一点, 计算与上一步所得数组 A 中点的距离,得到每一点距数组 A 中点的最大距离,所有点中最大距离最小的点,即是椭圆中心(p, q),该最大距离即是椭圆长轴长度 a。
- 3)将数组A中每一点的数值和刚才得到的3个椭圆参数p、q、a 代入椭圆方程 (1)。
- 4)在二维参数空间上对参数 b、θ 进行统计,得到峰值超过一定阈值的一组参数即为椭圆。
实验结果:
结果分析:本文运用了椭圆的几何性质,把hough参数空间减少到2维。减少了运算量。由于第一步要得到椭圆的轮廓图,如果,图像中几个椭圆有重叠部分,无法保证提取的轮廓是一个椭圆,则无法检测出椭圆。
openCV代码(VS2010+opencv2.4.11):http://download.csdn.net/detail/u012507022/9405763
Matlab代码:
clc
clear all
I = imread('22.png');
[m,n,L] = size(I); %m图像的高度,n图像的宽度,L通道数
if L>1 I = rgb2gray(I);
end
BW1 = edge(I,'sobel'); %自动选择阈值用Sobel算子进行边缘检测(二值化)figure(1)
subplot(121)
imshow(BW1); title('边缘检测');
se = strel('square',2);
BW=imdilate(BW1,se);%图像A1被结构元素B膨胀hough_circle=zeros(m,n,3);
[Limage, num] = bwlabel(BW,8); %num 连通区域个数
for N=1:num%[rows,cols] = find(BW); % 找出二值图中的所有非零元素,并将这些元素的线性索引值返回到[rows,cols] 即找出边缘[rows,cols] = find(Limage==N); % 找出二值图中的所有非零元素,并将这些元素的线性索引值返回到[rows,cols] 即找出边缘pointL=length(rows); %非零元素个数,椭圆的周长max_distan=zeros(m,n);distant=zeros(1,pointL);for i=1:m for j=1:nfor k=1:pointLdistant(k)=sqrt((i-rows(k))^2+(j-cols(k))^2); %计算所有点 到椭圆边界的点的距离endmax_distan(i,j)=max(distant); %(i,j)点到椭圆边界的最大距离endendmin_distan=min(min(max_distan)); %图像中所有的点到椭圆边界最大距离 的最小值,这个最小值对应的坐标位置 就是椭圆的中心。[center_yy,center_xx] = find(min_distan==max_distan); %检索出椭圆中心的位置,center_y=(min(center_yy)+max(center_yy))/2; %由于计算误差,椭圆中心可能是一簇点,所以选择中心点center_x=(min(center_xx)+max(center_xx))/2; %center_x,center_y为椭圆的中心a=min_distan; %a为椭圆的长轴%% 下面进行Hough变换 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%hough_space = zeros(round(a+1),180); %Hough空间for k=1:pointLfor w=1:180 %thetaG=w*pi/180; %角度转换为弧度XX=((cols(k)-center_x)*cos(G)+(rows(k)-center_y)*sin(G))^2/(a^2);YY=(-(cols(k)-center_x)*sin(G)+(rows(k)-center_y)*cos(G))^2;B=round(sqrt(abs(YY/(1-XX)))+1);if(B>0&&B<=a) % 计算时,B的值可能很大,这里进行异常处理hough_space(B,w)=hough_space(B,w)+1;endendend%% 搜索超过阈值的聚集点max_para = max(max(max(hough_space))); % 找出累积最大值[bb,ww] = find(hough_space>=max_para); %找出累积最大值在hough_space位置坐标(坐标值就是b和 theta)if(max_para<=pointL*0.33*0.25) % 如果累积最大值 不足一定的阈值 则判断不存在椭圆disp('No ellipse'); return ;endb=max(bb); % b为椭圆的短轴W=min(ww); % %thetatheta=W*pi/180;%% 标记椭圆for k=1:pointLXXX=((cols(k)-center_x)*cos(theta)+(rows(k)-center_y)*sin(theta))^2/(a^2);YYY=(-(cols(k)-center_x)*sin(theta)+(rows(k)-center_y)*cos(theta))^2/(b^2);if((XXX+YYY)<=1) %实心椭圆%if((XXX+YYY)<=1.1&&(XXX+YYY)>=0.99) % 椭圆轮廓hough_circle(rows(k),cols(k),1) = 255;endendendsubplot(122)imshow(hough_circle);title('检测结果');title('检测结果');
参考文献:
[1] 周 祥,孔晓东,曾贵华.一种新的基于 Hough 变换的椭圆轮廓检测方法
Hough变换检测椭圆 附带matlab与opencv代码相关推荐
- hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线
Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...
- MATLAB编程 利用Hough变换检测圆
MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸.更多下载资源.学习资料请访问CSDN下载频道.ht ...
- Hough变换检测直线与圆的原理
霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体.霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的 ...
- hough变换检测圆周_Python OpenCV 霍夫变换
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原 ...
- hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)
引言 本文讲述霍夫变换的一些内容,并加入一些理解性东西,参考了部分博客等相关性内容.希望能对霍夫变换有所了解,也希望看到的人如果发现错误及时帮忙纠正.博主水平有限,还望赐教. 历史和简介 历史 霍夫变 ...
- hough变换检测圆周_hough变换原理以及实现(转载)
原理链接如下:陌归:霍夫(Hough)变换之直线检测 代码链接:Ganso:Fundamentals--从车道线检测谈到霍夫变换 同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理 ...
- 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆
我正在尝试使用霍夫变换来检测圆圈. 使用我当前的代码,我可以检测到下面的代码 但我想在我发现的圆圈内找到黑洞. 然而,改变houghcircle方法的参数对我没有帮助.实际上它找到了不存在的圆圈. 此 ...
- hough变换检测圆周_【视觉】视觉检测人应该了解的缺陷检测方法
本文参考并摘引:李少波, 杨静, 王铮, 朱书德, 杨观赐. 缺陷检测技术的发展与应用研究综述. 自动化学报, 2020, 46(11): 2319−2336. doi: 10.16383/j.aas ...
- 小白学习图像处理7——Hough变换检测直线
文章目录 一.Hough变换的原理 1.过定点的直线方程 2.两点确定一条直线 3.方程的形式 二.实现过程 三.程序代码 1.程序片段 2.总程序 四.matlab 的hough函数 一.Hough ...
最新文章
- 深入理解MySQL执行过程及执行顺序
- Matlab 区域扫描,30+行Matlab代码实现文件扫描
- 精确监听AbsListView滚动至底部
- Nginx 常见问题解决
- smarty去除html标签,Smarty与脚本中的html标签爆裂
- 【转】宏定义中#和##的使用
- Android之面试题精选,自己收藏下
- 如何删除集合(数组)中指定的元素
- spark 的RDD各种转换和动作
- jsp文件创建后自动设置其pageEncoding的属性值为UTF-8
- 2022道路运输企业安全生产管理人员操作证考试题及在线模拟考试
- 联想H61主板BIOS刷新(启天M7100系列)
- css动画钟表——transform之rotate
- python播放背景音乐_Python帮你打包下载所有抖音背景音乐
- 生活小技巧 | win10开热点给手机使用
- 查PHP代码有哪些软件,成语查询系统PHP
- Word中常见的论文三线表(表格)制作
- 有时候,当我们要进入某个外网时,很慢很慢,等很久才进得去
- VOS客户端动态黑名单功能配置详解
- 访客模式 无痕模式 区别_旧访客设计模式的新生活
热门文章
- 使用 dataset 管理数据
- [MacOSX]_[Mac Book电脑的快捷键*长期更新]
- 「APIO2016」划艇 (dp+组合数+区间离散化)(考试)
- 密码管理工具-KeePass入门指南
- java如何把汉字转换成拼音
- python筛选同义词_关于python:使用WordNet查找同义词,定义和例句
- MySQL NDB Cluster 8.0.X 错误集锦(持续更新)
- Vue 生命周期篇探索 - 第二篇:生命周期-挂载流程
- 论c++里的string(原地址:https://www.byvoid.com/blog/cpp-string)
- [数据库汇总]-- sql 的基本知识