精华内容
下载资源
问答
  • 基于matlab程序hough变换检测圆源码
    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

    更多相关内容
  • 应用Matlab程序编写的Hough变换圆检测方法
  • 传统的霍夫算法迭代时间较长,但是检测圆形的结果比较可靠,不容易出现偏移,并且可以同时检测多个,代码可以直接运行。
  • matlab实现HOUGH变换的椭圆检测
  • 为了在实时系统中自动检测图像中的并且精确得到圆心和半径, 提出了一种改进的Hough变换检测圆的方法. 先对图像边界进行过滤, 得到连续边界, 然后对每条连续边界进行排序并等分, 选择三点进行圆心和半径计算, 将...
  • MATLAB编程 利用Hough变换检测圆

    千次阅读 2021-12-09 13:33:46
    MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载 最近,我学习了Hough变换,先介绍一下Hough变换:Hough变换(Hough Transform)是检测图像中直线和曲线的一种方法,其核心思想是建立一种...

    MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸。更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/k1ttyLove/59458826

            最近,我学习了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变换值最大值的坐标。 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)),

    d603e69c0b2049e915af1d5783e1a6aa.gif = [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;

    HoughCircle.JPG

    展开全文
  • Hough 变换检测圆----Matlab实现(以虹膜检测为例)

    一、hough变换的原理:

    1. 圆方程

    在这里插入图片描述

    (1)xy空间一个圆对应三维参数空间一个点(a,b,r)
    (2)xy空间圆上一个点(x,y)对应参数空间一条曲线
    (3)xy空间圆上n个点对应参数空间n条相交于一点的曲线
    注:对于原图中每一点,在参数空间确定一条曲线,经过曲线最多的点为原图中圆的参数

    1. 算法步骤:

    (1)假设原图像已经处理为二值边缘图像,扫描图中的每一个像素点:
    ①背景点,不作任何处理
    ② 目标点,确定曲线:参数空间上的对应曲线上所有点的值累加1
    (2)循环扫描所有点
    (3)参数空间上累计值为最大的点(a*,b*,r*)为所求圆参数
    (4)按照该参数与原图像同等大小的空白图像上绘制圆

    1. 简化运算

    三维参数空间,计算量大,可以采样其他形式,如极坐标式,进行进一步简化。在这里插入图片描述

    二、主函数

    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变换检测圆,可以设置要检测的个数,最小尺寸。
  • 简单的hough变换圆检测程序,提供了一个基本的框架,读者可以根据自己的需要进行一定的调整,阈值也可以根据自己的需要进行修改,里面还赋了一份说明文档,包括算法流程图,应该能很好的帮助读者理解。
  • 基于hough变换的圆形检测matlab实现代码,可供实现简单的圆形检测和识别。
  • Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。...
  • 基于hough变换的直线检测matlab代码,可直接运行,无需配置
  • 基于matlab的车道线检测程序,对比不同边缘检测算法,通过改进hough变换检测视频中的车道线,每一步算法都具有详细的解释说明
  • 程序代码:(代码标记[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代码通过霍夫变换检测圆周 用户友好的GUI 在该项目中,在Matlab环境中开发了图形界面(GUI),以通过霍夫变换检测图像圆周。 在此代码中,使用了David Young开发的脚本。 大卫·杨(David Young)...
  • MATLAB允许用户获得该变换树。本例程将让用户熟悉如何获取坐标系信息、获取坐标系之间的变换关系和在两个坐标系之间点、向量和其它实体的变换。 使用“rostf”函数创建一个新的变换树对象,用户可使用该对象获得所有...
  • hough变换检测多个matlab程序。就是对内存要求大点
  • hough变换检测圆

    2018-07-25 10:55:08
    hough变换检测圆matlab实现方法,里面包含了所用的代码和相应的检测图片
  • function [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变换在进行圆形检测时无目标的随机采样,引入了大量的无效采样与无用累积,为提高算法效率, 提出一种改进的随机Hough变换圆形检测算法。该算法利用的几何特性确定圆心的位置,减少了Hough变换在参数...
  • hough变换检测直线matlab代码直线提取 该算法基于线支持区域概念(Burns'86),该方法首先检测包含具有相似梯度方向的连接像素的区域,然后推断基于线方向和中心位置的检测区域。 主要区别在于我们使用结构张量来...
  • 使用Matlab编写的椭圆霍夫变换代码,方便初学者学习霍夫变换基本原理。使用时输入一副二值图像,可以预估待检测椭圆的长短轴、倾角等参数,减少运算时间。
  • Hough变换实现椭圆及圆检测MATLAB

    热门讨论 2009-08-26 10:30:14
    MATLAB 下实现hough变换椭圆检测,根据此可推导圆检测、直线检测
  • 求各位大神指教,求程序代码![图片](https://img-ask.csdn.net/upload/201704/20/1492657474_628546.jpg)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,785
精华内容 714
关键字:

hough变换检测圆matlab

matlab 订阅
友情链接: Arduino Radar.rar