-
2022-03-18 01:20:35
1.算法简介
基于matlab程序hough变换检测圆源码
2.部分核心代码
rawimg = imread('test1.bmp'); tic; [accum, circen, cirrad] = CircularHough_Grd(rawimg, [15 60]); toc; %figure(1); imagesc(accum); axis image; %title('Accumulation Array from Circular Hough Transform'); figure(2); imagesc(rawimg); colormap('gray'); axis image; hold on; plot(circen(:,1), circen(:,2), 'r+'); for k = 1 : size(circen, 1), DrawCircle(circen(k,1), circen(k,2), cirrad(k), 32, 'b-'); end hold off; title(['Raw Image with Circles Detected ', ... '(center positions and radii marked)']); figure(3); surf(accum, 'EdgeColor', 'none'); axis ij; title('3-D View of the Accumulation Array'); % COMMENTS ON EXAMPLE #0: % Kind of an easy case to handle. To detect circles in the image whose % radii range from 15 to 60. Default values for arguments 'grdthres', % 'fltr4LM_R', 'multirad' and 'fltr4accum' are used. %
3.仿真截图与仿真视频演示
视屏演示
4.相关参考文献
[1]王诗旋, 贺新升, 张荣辉,等. 基于Matlab和优化Hough变换的高速公路车道线检测方法[J]. 科技资讯, 2011.
D197
更多相关内容 -
hough变换检测圆的matlab程序
2015-09-10 09:40:29应用Matlab程序编写的Hough变换圆检测方法 -
传统Hough算法检测圆的MATLAB实现
2017-07-20 20:35:26传统的霍夫算法迭代时间较长,但是检测圆形的结果比较可靠,不容易出现偏移,并且可以同时检测多个圆,代码可以直接运行。 -
matlab实现HOUGH变换的椭圆检测
2014-08-29 21:35:20matlab实现HOUGH变换的椭圆检测 -
改进的Hough变换检测圆方法_陈小艳
2018-03-20 10:51:11为了在实时系统中自动检测图像中的圆并且精确得到圆心和半径, 提出了一种改进的Hough变换检测圆的方法. 先对图像边界进行过滤, 得到连续边界, 然后对每条连续边界进行排序并等分, 选择三点进行圆心和半径计算, 将... -
MATLAB编程 利用Hough变换检测圆
2021-12-09 13:33:46MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载 最近,我学习了Hough变换,先介绍一下Hough变换:Hough变换(Hough Transform)是检测图像中直线和曲线的一种方法,其核心思想是建立一种...最近,我学习了Hough变换,先介绍一下Hough变换:Hough变换(Hough Transform)是检测图像中直线和曲线的一种方法,其核心思想是建立一种电线对偶关系,将图像从图像空间变换到参数空间,确定曲线的参数,进而确定图像中的曲线。
利用Hough变换原理最基本的是检测直线,因为截距式直线方程有两个参数k和b,利用Hough变换到参数空间只有两层循环,代码实现较为简单,执行时间也较短。
然而,圆的方程可不止两个参数,包括圆心点的坐标(a,b)和半径r,利用Hough变换到参数空间就要有多层循环。从图像空间的一个点对应参数空间的一个三维向量(a,b,r),在参数空间确定三维向量的个数的大小排列,取其中前几个参数向量,用其参数在图像空间刻画复现圆,这就实现了Hough检测圆。
编程思路:
(1)首先读取一张图片,并且将其进行边缘检测,我用的是canny边缘检测。
(2)然后,先准备好一会儿要用到的数学模型,一个a_max(纵坐标最大值),b_max(横坐标最大值),r_max(半径最大值),circle_num(要检测出圆的个数),yuzhi(阈值,此变量用于避免图像空间中的多个圆重复表示参数空间的一组参数a,b,r),A(a_max,b_max,r_max)(参数空间三维数组,用于存储该组参数对应多少点,即同一个圆上有几个点),max1(存储A数组中值最大的a参数值),max2(存储A数组中值最大的b参数值),max3(存储A数组中值最大的r参数值)。
(3)然后对整个边缘检测结果图片进行双层for循环遍历,判断此点灰度值是否大于0,这一步是用来找到图像边缘(白色像素)。然后将该点变换到参数空间,即用极坐标方程组表示此点的(a,b,r);a,b是圆心坐标,r是半径。在代码实现中,要多次利用for循环,循环变量是theta(范围从1到360度)和半径r(r的范围是自定义的最小值到r_max),在带入方程之前要对theta变量变为用pi表示的数值,即做theta/180*pi的操作。经过两层循环,就有了该点(a,b,r)参数值,再对(a,b)变量进行筛选,(a,b)表示圆心坐标,所以此点一般情况下要落在图像范围内。筛选之后对应的A数组的值加1。经过对所有点进行此操作,得到的参数空间A数组就是我们所需要的。
(4)然后对A数组进行三层循环遍历,找到前circle_num个最大值,并且将其三个参数a,b,r分别存储到max1,max2,max3数组中。
(5)这样,我们就得到了参数空间的circle_num个圆的参数,现在我们要将这些参数在图像空间中复原。还是利用圆的极坐标方程表示出x,y。然后用plot函数进行展示x和y的关系。
这样,就得到了图像空间中的圆,实现了Hough变换检测圆。
检测结果:(可以检测任意多个圆,通过修改代码中的circle_num的值,值越大等待时间越久。此外,不同的圆设置了不同的颜色以及圆的线条宽度)
检测7个圆:
检测20个圆:
-
Hough变换圆检测MatLab代码 | 学步园
2021-04-19 06:37:36%求出hough变换值最大值的坐标。 x = radius * cos(theta) + col - radius -1; y = radius * sin(theta) + row - radius - 1; plot(x, y); %半径为r的圆 for k = 1 : length(x) C(round(y(k)), round(x(k)), = [255...close all;
clear;
%%
I = imread('eight.tif');
C = cat(3, I, I, I);
thresh = [];
sigma = 2;
%The size of the filter is chosen automatically, based on SIGMA.
BW = edge(double(I),'canny',thresh,sigma);
imwrite(BW,'coins_bw.bmp')
radius = 38;
[Accumulator, xdim, ydim] = houghcircle2(BW, radius);
imwrite(mat2gray(Accumulator),'Accumulator.bmp')
num = 4;
figure;imshow(BW);
hold on
theta=0 : pi/1000 : 2*pi;
for i=1 : num
[y1,col1]=max(Accumulator);
[y2,col]=max(y1);
row=col1(col);
%求出hough变换值最大值的坐标。
x = radius * cos(theta) + col - radius -1;
y = radius * sin(theta) + row - radius - 1;
plot(x, y); %半径为r的圆
for k = 1 : length(x)
C(round(y(k)), round(x(k)),
= [255, 0, 0];
end
Accumulator(row,col)=0;
%为了避免重复计算,将计算过的点置0。
rhood=1;
chood=1;
top=max(row-rhood,1);
down=min(row+rhood,ydim);
left=max(col-chood,1);
right=min(col+chood,xdim);
Accumulator(top:down,left:right)=0;
end
imwrite(C,'HoughCircle.bmp')
function [Accumulator, xdim, ydim] = houghcircle2(Imbinary,r)
%同样需要自己知道待求取的圆半径
% Fast implementation of Circular HOUGH-Transform
%
% parameters:
% Imbinary ... a binary image (after applying an edge-detection algorithm)
% r ... the radius of circle to detect within the image
% Accumulator ... result of the HOUGH-Transform - an image where all circles are accumulated
% the image is 2*r larger than the input image
% xdim, ydim ... dimensions of the Accumulator image
xdim = size(Imbinary, 2) + ceil(2*r);
ydim = size(Imbinary, 1) + ceil(2*r);
[circle_x, circle_y] = circle(r, r, r);
[edge_y, edge_x] = find(Imbinary);
clear Imbinary;
circlepoints = length(circle_x);
edgepoints = length(edge_x);
points = zeros((circlepoints*edgepoints),1);
pos = 1;
points = (ones(size(edge_x))*round(circle_x) + round(edge_x)*ones(size(circle_x))) * ydim + ...
(ones(size(edge_y))*round(circle_y) + round(edge_y)*ones(size(circle_y)));
clear circle_x;
clear circle_y;
clear edge_x;
clear edge_y;
points = reshape(points, 1, (size(points,1) * size(points,2)));
Accumulator = histc(points, (0:1:(max(points(:)))));
clear points;
Accumulator(1) = 0; % delete counts from zeros
if (length(Accumulator) < (xdim*ydim))
Accumulator = [Accumulator zeros(1, (xdim*ydim)-length(Accumulator))];
end;
Accumulator = reshape(Accumulator(1:(xdim*ydim)), ydim, xdim);
function [x,y] = circle(center_x, center_y, radius)
% returns a vector with all circle-corner points containing the correct number of points
numpoints = ceil(2*radius*pi);
theta = linspace(0,2*pi, numpoints);
rho = ones(1,numpoints) * radius;
[x,y] = pol2cart(theta, rho);
x = x+center_x;
y = y+center_y;
-
Hough 变换检测圆----Matlab实现(以虹膜检测为例)
2022-04-23 22:31:25Hough 变换检测圆----Matlab实现(以虹膜检测为例)一、hough变换的原理:
- 圆方程
(1)xy空间一个圆对应三维参数空间一个点(a,b,r)
(2)xy空间圆上一个点(x,y)对应参数空间一条曲线
(3)xy空间圆上n个点对应参数空间n条相交于一点的曲线
注:对于原图中每一点,在参数空间确定一条曲线,经过曲线最多的点为原图中圆的参数- 算法步骤:
(1)假设原图像已经处理为二值边缘图像,扫描图中的每一个像素点:
①背景点,不作任何处理
② 目标点,确定曲线:参数空间上的对应曲线上所有点的值累加1
(2)循环扫描所有点
(3)参数空间上累计值为最大的点(a*,b*,r*)为所求圆参数
(4)按照该参数与原图像同等大小的空白图像上绘制圆- 简化运算
三维参数空间,计算量大,可以采样其他形式,如极坐标式,进行进一步简化。
二、主函数
I=rgb2gray(imread('renyan.png')); BW = edge(I,'sobel'); %目的检测圆的轮廓,如果直接就是圆图像,不用这个 % 用sobel进行边缘检测 %设置参数: %检测的圆半径步长为0.5 Step_r = 0.5; %步长过短,运行时间会很长 %角度步长0.1,单位为弧度 Step_angle = 0.1; %步长过短,运行时间会很长 %最小圆半径30(圆半径根据实际检测调整) minr =30; %最大圆半径50 maxr=50; %以thresh*hough_space的最大值为阈值,thresh取0-1之间的数 thresh = 0.8; circleParaXYR=[]; %--------------------------------------------------------------------------------- %开始检测 [Hough_space,Hough_circle_result,Para] = Hough_circle(BW,Step_r,Step_angle,minr,maxr,thresh); circleParaXYR=Para; axis equal figure(1); imshow(BW,[]),title('边缘'); axis equal figure(2); imshow(Hough_circle_result,[]),title('检测结果'); axis equal figure(3),imshow(I,[]),title('检测出图中的圆') hold on %--------------------------------------------------------------------------------- %以红色线标记出的检测圆心与圆 plot(circleParaXYR(:,2), circleParaXYR(:,1), 'r+'); for k = 1 : size(circleParaXYR, 1) t=0:0.01*pi:2*pi; x=cos(t).*circleParaXYR(k,3)+circleParaXYR(k,2); y=sin(t).*circleParaXYR(k,3)+circleParaXYR(k,1); plot(x,y,'r-'); end
三、构造Hough变换检测圆函数(主函数调用即可)
function [Hough_space,Hough_circle_result,Para] = Hough_circle(BW,Step_r,Step_angle,r_min,r_max,p) circleParaXYR=[]; Para=[]; %得到二值图像大小 [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;%h(a,b,r)的坐标,圆心和半径 end end end end % 搜索超过阈值的聚集点,对于多个圆的检测,阈值要设的小一点!通过调此值,可以求出所有圆的圆心和半径返回值就是这个矩阵的最大值 max_para = max(max(max(Hough_space))); %一个矩阵中,想找到其中大于max_para*p数的位置 index = find(Hough_space>=max_para*p); length = size(index);%符合阈值的个数 Hough_circle_result=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<(r_min+(par3-1)*Step_r)^2+5&&... (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*Step_r)^2-5) Hough_circle_result(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; circleParaXYR = [circleParaXYR;par1,par2,par3]; Hough_circle_result(par1,par2)= 1; %这时得到好多圆心和半径,不同的圆的圆心处聚集好多点,这是因为所给的圆不是标准的圆 end %集中在各个圆的圆心处的点取平均,得到针对每个圆的精确圆心和半径; while size(circleParaXYR,1) >= 1 num=1; XYR=[]; temp1=circleParaXYR(1,1); temp2=circleParaXYR(1,2); temp3=circleParaXYR(1,3); c1=temp1; c2=temp2; c3=temp3; temp3= r_min+(temp3-1)*Step_r; if size(circleParaXYR,1)>1 for k=2:size(circleParaXYR,1) if (circleParaXYR(k,1)-temp1)^2+(circleParaXYR(k,2)-temp2)^2 > temp3^2 XYR=[XYR;circleParaXYR(k,1),circleParaXYR(k,2),circleParaXYR(k,3)]; %保存剩下圆的圆心和半径位置 else c1=c1+circleParaXYR(k,1); c2=c2+circleParaXYR(k,2); c3=c3+circleParaXYR(k,3); num=num+1; end end end c1=round(c1/num); c2=round(c2/num); c3=round(c3/num); c3=r_min+(c3-1)*Step_r; Para=[Para;c1,c2,c3]; %保存各个圆的圆心和半径的值 circleParaXYR=XYR; end
四、结果
(1)眼睛的虹膜检测属于较难的检测,主函数加强预处理部分可提高效果;
(2)如果直接用Hough变换检测圆,调用该函数会得到较好效果;
(3)如果是彩色复杂图像,则采用预处理将圆大致提取出来,设置好Hough变换的参数,就可以完成识别。
支持可以关注我哦,持续分享编写的代码。 -
利用Hough变换检测圆.docx
2021-12-09 13:23:55利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸。 -
hough变换圆检测matlab程序(包括几幅图片及实验结果,打开circle_dec.m就可以直接运行)
2020-12-30 02:00:15简单的hough变换圆检测程序,提供了一个基本的框架,读者可以根据自己的需要进行一定的调整,阈值也可以根据自己的需要进行修改,里面还赋了一份说明文档,包括算法流程图,应该能很好的帮助读者理解。 -
基于hough变换的圆形检测
2017-10-01 10:44:14基于hough变换的圆形检测matlab实现代码,可供实现简单的圆形检测和识别。 -
Hough变换检测圆(附:MATLAB程序)
2021-01-12 10:03:48Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。圆的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。... -
基于hough变换的直线检测matlab代码
2017-10-01 10:41:04基于hough变换的直线检测matlab代码,可直接运行,无需配置 -
基于MATLAB和改进Hough变换的车道线检测
2020-11-21 22:02:37基于matlab的车道线检测程序,对比不同边缘检测算法,通过改进hough变换来检测视频中的车道线,每一步算法都具有详细的解释说明 -
hough变换检测椭圆的matlab源码[matlab]
2020-12-19 10:38:15程序代码:(代码标记[code]...[/code])[rowcol]=size(fedge);minofa=a;maxofa=round(row/2);minofy0=round(col/2)-30;maxofy0=round(col/2)+30;minofb=round(col/2)-60;maxofb=round(col/2);maxofx=round(row/2);... -
hough变换matlab代码-Hough-Transform:在该项目中,在Matlab环境中开发了图形界面(GUI),以通过霍夫变换...
2021-05-27 00:46:47hough变换Matlab代码通过霍夫变换检测圆周 用户友好的GUI 在该项目中,在Matlab环境中开发了图形界面(GUI),以通过霍夫变换检测图像圆周。 在此代码中,使用了David Young开发的脚本。 大卫·杨(David Young)... -
hough变换检测圆matlab指令_MATLAB - ROS 移动机器人控制(一)
2020-11-20 13:41:10MATLAB允许用户获得该变换树。本例程将让用户熟悉如何获取坐标系信息、获取坐标系之间的变换关系和在两个坐标系之间点、向量和其它实体的变换。 使用“rostf”函数创建一个新的变换树对象,用户可使用该对象获得所有... -
hough变换检测多个圆 matlab
2013-08-27 10:38:56hough变换检测多个圆的matlab程序。就是对内存要求大点 -
hough变换检测圆
2018-07-25 10:55:08hough变换检测圆的matlab实现方法,里面包含了所用的代码和相应的检测图片 -
hough变换检测圆的matlab程序 1
2021-04-20 05:15:46function [y0detect,x0detect,Accumulator] = houghcircle(Imbinary,r,thresh)%HOUGHCIRCLE - detects circles with specific radius in a binary image.%%Comments:% Function uses Standard Hough Transform to de... -
Hough变换检测椭圆 附带matlab与opencv代码
2016-03-25 13:52:09如果用传统的Hough变换方法,参数空间需要五维。这种方法在计算过程中所耗费的时间和空间资源是惊人的,根本无法应用于实际。为此,人们提出了很多新的改进算法。 改进算法主要分为两种: 1)随机Hough变换... -
一种改进的随机Hough变换圆形检测算法
2010-04-05 14:43:05由于随机Hough变换在进行圆形检测时无目标的随机采样,引入了大量的无效采样与无用累积,为提高算法效率, 提出一种改进的随机Hough变换圆形检测算法。该算法利用圆的几何特性确定圆心的位置,减少了Hough变换在参数... -
hough变换检测直线matlab代码-LineExtr:从图像中直线提取
2021-05-26 23:14:40hough变换检测直线matlab代码直线提取 该算法基于线支持区域概念(Burns'86),该方法首先检测包含具有相似梯度方向的连接像素的区域,然后推断基于线方向和中心位置的检测区域。 主要区别在于我们使用结构张量来... -
椭圆霍夫变换matlab代码检测二值图像中的单个椭圆
2015-08-24 10:25:43使用Matlab编写的椭圆霍夫变换代码,方便初学者学习霍夫变换基本原理。使用时输入一副二值图像,可以预估待检测椭圆的长短轴、倾角等参数,减少运算时间。 -
Hough变换实现椭圆及圆检测(MATLAB)
2009-08-26 10:30:14在MATLAB 下实现hough变换椭圆检测,根据此可推导圆检测、直线检测 -
如何在matlab软件用hough变换检测多个圆参数
2017-04-20 03:06:18求各位大神指教,求程序代码