精华内容
下载资源
问答
  • 霍夫变换,用于圆检测,可进行图像处理。内附MATLAB的代码
  • 霍夫变换圆检测MATLAB程序

    热门讨论 2013-10-14 16:11:23
    利用霍夫变换进行圆检测MATLAB代码,带有详细解释,适合新手
  • 使用Matlab编写的椭圆霍夫变换代码,方便初学者学习霍夫变换基本原理。使用时输入一副二值图像,可以预估待检测椭圆的长短轴、倾角等参数,减少运算时间。
  • 概述: -------- 通过检查所有可能的长轴(所有点对)并使用霍夫变换获取短轴来拟合椭圆。 算法复杂度取决于有效非零点的数量,因此如果有任何先验,则在“params”输入参数中提供尽可能多的限制是有益的有关问题的...
  • matlab 霍夫变换检测圆

    千次阅读 2019-09-29 21:10:40
    function [hough_space,hough_circle,para] = hough_Circle(BW,step_r,step_angle,r_min,r_max,p) % %%%%%%%%%%%%%%%%%%%%%%%%%% ...% step_r:检测半径步长 % step_angle:角度步长,单位为弧度 % ...
    function [hough_space,hough_circle,para] = hough_Circle(BW,step_r,step_angle,r_min,r_max,p)
     
    % %%%%%%%%%%%%%%%%%%%%%%%%%%
    % input
    % BW:二值图像;
    % step_r:检测的圆半径步长
    % step_angle:角度步长,单位为弧度
    % r_min:最小圆半径
    % r_max:最大圆半径
    % p:以p*hough_space的最大值为阈值,p取0,1之间的数
    
    
    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % output
    % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数
    % hough_circl:二值图像,检测到的圆
    % para:检测到的圆的圆心、半径
    

      

    Hough变换检测圆(附:MATLAB程序)




    转载于:https://www.cnblogs.com/fcfc940503/p/11463199.html

    展开全文
  • 霍夫变换检测圆代码MATLAB 计算机视觉项目地球检测 在混乱的环境中进行政治地球仪检测 计算机视觉中的常见问题是在图片或视频流中搜索并找到特定的对象或形状。 在这个特殊的项目中,我们被要求设计和实施一个完整的...
  • 简单的Canny边缘检测程序,另外包含霍夫变换检测道路直线。
  • matlab实现HOUGH变换的椭圆检测
  • HOUGHCIRCLES 使用霍夫变换检测图像中的多个磁盘(硬币)。 图像包含分离、接触或重叠的圆盘,其中心可能在图像内或外。 句法houghcircles(im, minR, maxR); houghcircles(im, minR, maxR, thresh); houghcircles...
  • 使用霍夫变换检测直线的matlab程序,可以求出直线的方程
  • 1、因为需要找到图片中的四个,刚开始我是直接在整张图片上找,可是发现周围的干扰因素太多了,调了一组参数,发现重复的太多了,还有其他我们不需要的误圆检测了出来。然后就想着分别检测,为了摆脱周围相似...

    说明:
    1、因为需要找到图片中的四个圆,刚开始我是直接在整张图片上找,可是发现周围的干扰因素太多了,调了一组参数,发现重复的圆太多了,还有其他我们不需要的误圆检测了出来。然后就想着分别检测,为了摆脱周围相似环境的影响,我将整张图片带圆的地方,剪裁了下来,分别剪裁了只带圆的正方形进行检测,这样就比较容易检测,找到准确位置。(提示一点,可能分别检测的时候,也可能在同一个圆的边界附近检测出了很多相似圆重叠在一起,也就是检测同一个圆出来了好几组相近的坐标数据。你又无法调一组只出来一组坐标的参数,但是最后你只需要一组坐标数据,这时候你可以对矩阵进行求平均,用mean()函数即可。代码里有)
    2、分别找到四个圆的准确位置后,也只是相对位置,再加上剪裁的起始坐标就得到了绝对坐标。
    这是原始图,我们要进行处理的图。
    这是未进行校正的视频的某一帧  图1
    通过检测进行了坐标标记 如下图:
    霍夫变换检测圆操作后并进行了圆心标记
    main.m文件

    %%     main.m文件
    clc;
    clear;
    % BW :二值图像;
    % stepR:检测的圆半径步长 
    % stepAngle:角度步长,单位为弧度
    % minR:最小圆半径  
    % maxR:最大圆半径 p:阈值 0,1之间的数,通过调节此值可以得到图中圆的圆心和半径
    % 读取视频的第一帧进行如下操作:
    %1)剪裁图片的四个角 
    %2)利用霍夫变换检测圆,检测圆的之后得到圆的圆心并同时输出四个圆的坐标和半径。
    %3)输出的有圆心的相对坐标和圆心的绝对坐标。
    I = imread('image_supple\1.jpg');
    for i = 1:4 % 连续剪裁图片的四个角
       switch (i)
           case {1}
               tlc= imcrop(I,[117 50 100 100]);% 左上角
               processpic(tlc,1);
               figure,imshow(tlc); 
           case {2}
               dlc= imcrop(I,[115 520 100 100]);% 左下角
               processpic(dlc,2);
               figure,imshow(dlc);
           case {3}
               trc = imcrop(I,[810 45 100 100]); % 右上角
               processpic(trc,3);
               figure,imshow(trc);
           case {4}
               drc = imcrop(I,[745 510 100 100]); % 右下角
               processpic(drc,4);
               figure,imshow(drc);
       end
    end
    
    

    processpic.m函数

    对图片进行预处理
    function processpic(t,h)   
    grayI = rgb2gray(t);%图片灰度处理
    BW = edge(grayI,'sobel');%边缘检测
    imshow(t);
    hold on;
    switch (h)
        case {1}% 这是检测到的第一个圆
            parm = findcircle(BW,3,0.07,16,18,0.95);
            % 对于supple因为调参之后就出现了一组数据,所以不用再求均值。
            %disp(parm);
            %paraAvg = mean(parm);%对矩阵的每一列进行求均值
            % 输出的坐标是绝对坐标坐标形式是(y,x);
            %fprintf('CenterAvg %d %d  radiusAvg %d\n',round(paraAvg(1,1)+50),round(paraAvg(1,2)+117),paraAvg(1,3));
            fprintf('CenterAvg %d %d  radiusAvg %d\n',round(parm(1,1)+50),round(parm(1,2)+117),parm(1,3));
        case {2}%这是检测到的第二个圆
            parm = findcircle(BW,3,0.07,16,18,0.95);
           % paraAvg = mean(parm);%对矩阵的每一列进行求均值
            fprintf('CenterAvg %d %d  radiusAvg %d\n',round(parm(1,1)+520),round(parm(1,2)+115),parm(1,3));
        case {3}%这是检测的第三个圆
           parm = findcircle(BW,3,0.07,16,18,0.95);
           % paraAvg = mean(parm);%对矩阵的每一列进行求均值
           fprintf('CenterAvg %d %d  radiusAvg %d\n',round(parm(1,1)+45),round(parm(1,2)+810),parm(1,3));
        case {4}%这是检测的第四个圆
           parm = findcircle(BW,3,0.07,16,18,0.95);
           % paraAvg = mean(parm);%对矩阵的每一列进行求均值
           fprintf('CenterAvg %d %d  radiusAvg %d\n',round(parm(1,1)+510),round(parm(1,2)+745),parm(1,3));
    end
       
    % 绘制所有的圆 
    for i = 1:size(parm,1)
        x0 = parm(i,1); y0 = parm(i,2);  r0 = parm(i,3);
        xi=[-r0:0 0:r0];
        yi=round((r0^2-xi.^2).^0.5);
        plot(yi+y0,xi+x0,'Color','g','LineWidth',3); % 下半圆
        plot(-yi+y0,xi+x0,'Color','g','LineWidth',3); % 上半圆
        % plot(y0,x0,'x','LineWidth',2,'Color','red');
    end
    end
    

    findcircle.m函数

    % 霍夫检测圆的主要代码
    function [para] = findcircle(BW,stepR,stepAngle,minR,maxR,p)
    %circleParaXYR = [];
    [m,n] = size(BW);% BW:二值图像;
    cntR = round((maxR-minR)/stepR)+1;% stepR:检测的圆半径步长, minR:最小圆半径, maxR:最大圆半径
    cntAngle = round(2*pi/stepAngle);% stepAngle:角度步长,单位为弧度
    hough_space = zeros(m,n,cntR);
    % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数
    [rows,cols] = find(BW);
    cntPoints = size(rows,1); 
    % Hough变换将图像空间(x,y)对应到参数空间(a,b,r)
    % a = x-r*cos(angle), b = y-r*sin(angle)
    for i=1:cntPoints
        for r=1:cntR
            for k=1:cntAngle
                a = round(rows(i)-(minR+(r-1)*stepR)*cos(k*stepAngle));
                b = round(cols(i)-(minR+(r-1)*stepR)*sin(k*stepAngle));
                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); % p:以p*hough_space的最大值为阈值,p取0,1之间的数
    length = size(index,1);
    hough_circle=zeros(m,n);
    for i=1:cntPoints
        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<(minR+(par3-1)*stepR)^2+5 && (rows(i)-par1)^2+(cols(i)-par2)^2>(minR+(par3-1)*stepR)^2-5)
                hough_circle(rows(i),cols(i)) = 1;% hough_circl:二值图像,检测到的圆
            end
        end
    end
     
    for k=1:length
        par3 = floor(index(k)/(m*n))+1;     
        par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;    % 圆心y坐标
        par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;      % 圆心x坐标
        par3 = minR+(par3-1)*stepR;                    % 圆的半径
        fprintf(1,'Center %d %d radius %d\n',par1,par2,par3);
        para(k,:) = [par1,par2,par3];% para:检测到的圆的圆心、半径
        plot(par2,par1,'x','LineWidth',5,'Color','red');%用红的的X对圆心位置进行标记
            
    end
    
    
    

    注:本人处理的就是上面显示图片,第一张是原始图片,第二张是处理之后的图片。因为我要处理的是视频,所以里面做了循环和选择。具体实现还是根据自己的需求进行修改。

    展开全文
  • Hough变换检测Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。Hough对检测程序如下完整的程序及实例效果见附件% p:阈值...

    Hough变换对圆的检测

    Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。

    Hough对圆的检测程序如下  完整的程序及实例效果见附件

    % p:阈值,0,1之间的数

    % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    % output

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

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

    % 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;

    end

    end

    end

    end

    % 搜索超过阈值的聚集点

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

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

    length = size(index);

    hough_circle = false(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)) = true;

    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

    这是用霍夫变换检测圆的程序,用红色标示的地方一点也看不懂了,其中

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

    max_para代表的是什么?

    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;

    part1,part2,part3代表的是什么意思?

    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;

    上面这段起到什么作用?,

    请高手指点了!

    展开全文
  • matlab 霍夫变换——检测圆弧

    千次阅读 多人点赞 2018-12-28 10:38:39
    类似的代码网上一搜全都...首先需要新建两个脚本,功能分别是图像的前期处理和检测圆弧,话不多说,代码实现如下: function [bw] = image_deal(bw) %UNTITLED2 Summary of this function goes here % Detailed...

    类似的代码网上一搜全都是,不少代码运行起来各种错误,真正正确的还是要靠自己慢慢尝试和修改。以下是本人亲测,绝对正确可行的代码。

    首先需要新建两个脚本,功能分别是图像的前期处理和检测圆弧,话不多说,代码实现如下:

    function [bw] = image_deal(bw)
     
    %UNTITLED2 Summary of this function goes here
    %   Detailed explanation goes here
    %------------------------------输入参数-----------------------------  
    % BW:处理前图像;  
    %-------------------------------------------------------------------  
      
    %------------------------------输出参数-----------------------------  
    % BW:二值后图像;  
    %-------------------------------------------------------------------  
      
    % From Nanjing University of Science and Technology,ZLy 
    %%建立sobel算子
    sobel_xl=[-1,0,1;-2,0,2;-1,0,1];
    sobel_xr=[1,0,-1;2,0,-2;1,0,-1];
    sobel_yl=[1,2,1;0,0,0;-1,-2,-1];
    sobel_yr=[-1,-2,-1;0,0,0;1,2,1];
    %%图像灰度化
    bw=rgb2gray(bw);
    %%把图像数据类型转换为双精度浮点类型
    bw=im2double(bw);
    %%图像与sobel算子进行卷积
    A=conv2(bw,sobel_xl);
    B=conv2(bw,sobel_xr);
    C=conv2(bw,sobel_yl);
    D=conv2(bw,sobel_yr);
    %%图像二值化
    A=im2bw(A,graythresh(A));
    B=im2bw(B,graythresh(B));
    C=im2bw(C,graythresh(C));
    D=im2bw(D,graythresh(D));
    %%图像相加
    bw=A+B+C+D;
    imshow(bw);title('卷积后的图像');
    %消除噪点
    se=strel('disk',2);
    bw=imclose(bw,se);
    figure;imshow(bw);title('消除噪点后的图像');
    end

     

    function [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p,AW) 
    %[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之间的数  
    % AW:原始图像;
    %-------------------------------------------------------------------  
      
    %------------------------------输出参数-----------------------------  
    % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数  
    % hough_circl:二值图像,检测到的圆  
    % 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); %返回BW中非零元素的一个列或行向量v,同时返回行和列的索引值。
    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)));  %求出hough_space的最大值,三个方向上a,b,r
    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<(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(rows(i),cols(i)) = 1;  
            end  
        end  
    end  
    % 打印结果  
    fprintf('圆的个数 %d\n',length);
    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]';
        %%找出对应参数,圆中心加蓝
        AW(par1,par2,1)=0;
        AW(par1,par2,2)=232; 
        AW(par1,par2,3)=232; 
        %%圆周加红
        for angle=0:0.005:2*pi
            x = round(par1+par3*cos(angle));
            y = round(par2+par3*sin(angle));
            if(x>0&y>0)
               AW(x,y,1)=232;
               AW(x,y,2)=0;            
               AW(x,y,3)=0;
            end   
        end
    end 
    %输出识别后图像
    imshow(AW);title('圆心加蓝,圆周加红');

    在命令窗口输入:

    >> bw=imread('p.jpg');
    >> aw=bw;
    >> bw=image_deal(bw);
    >> f=hough_circle(bw,10,0.03,100,150,0.5,aw);

    原图:

    检测结果:

     

    展开全文
  • 本资源是一种基于霍夫变换的矩形检测方法,采用matlab语言实现,提供了很多矩形检测的实例。大学毕业设计可以使用。
  • 完整的算法步骤% 1. 读取图像% 2. 转换为灰度% 3. 检测边缘% 4. 定义累加器矩阵% 5. 使用半径值通过方程找到圆心% 6. 在累加器矩阵中赋值% 7. 寻找峰值(圆心) % 8. 在原始彩色图像上绘制圆圈
  • 检测线。
  • Matlab findcircle函数实现 霍夫变换——检测圆

    万次阅读 热门讨论 2018-05-30 02:43:28
    Matlab findcircle函数实现 霍夫变换——检测圆 实现了基于霍夫变换的findcircle函数,function[circlefind]=findcircle(img,minr,maxr,stepr,stepa,percent)传进来6个参数,img是二值化的边缘图像,minr是最小搜索...
  • 使用 3D 矩阵进行霍夫变换。 是一个图形用户界面。 使用一般的霍夫变换。 由 M.Sc. 撰写吉列尔莫·加西亚·希门尼斯 (Guillermo García Jiménez),在 posgrade 项目中描述:数字图像的度。 ~~~~~~~~~~~~~~~~~~~~...
  • 霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、电脑视觉 (computer vision)以及数位影像处理 (digital image processing)。 霍夫变换是用来辨别找出物件中的特征,例如:线条...
  • 该程序是霍夫变换,是MATLAB程序,学习图像处理和机器视觉的同学很有帮助。
  • 利用椭圆的几何特征,将5维空间参数转换为2维空间,然后利用霍夫变换检测直线的方法确定椭圆参数。是知网论文“一种新的基于霍夫变换的椭圆轮廓检测方法”的实现代码。
  • 霍夫变换
  • vs2010 opencv 霍夫变换 检测圆
  • OpenCv里面有个概率霍夫变换,但是不知道原理是什么,请各位大侠指教!。。霍夫变换就是利用参数空间中的(ρ,θ)来表示一条直线,其中ρ是原点到直线的垂直距离,θ是原点到直线的一条垂线段与θ的夹角。通过几何的...
  • 利用霍夫变换的方法找到图片中的,并返回的坐标和半径。 Ø  【作业思路】 本次作业找主要是使用了霍夫变换的方法。 先介绍一下霍夫变换的思想: 霍夫变换是图像处理中用于...
  • 对于用霍夫变换检测直线而言,在二维笛卡尔坐标系中,直线上的一点映射到霍夫空间的一条直线: 然而直线上的两个不相同的点映射到霍夫空间的两条相交直线: 对于唯一确定的一条直线而言,它映射到霍夫空间是一个...
  • 自编matlab程序实现霍夫变换直线检测,包含源程序和测试图片,效果还行
  • 霍夫变换检测圆和直线 数字图像处理的课程设计 直接使用 非常方便

空空如也

空空如也

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

matlab霍夫变换检测圆

matlab 订阅