霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法。它通过将图像坐标空间变换到参数空间,来实现直线与曲线的拟合。

参数空间可以表示为(a,b,r),图像坐标空间中的一个圆对应参数空间中的一个点。

A(a,b,r)。

计算过程是让a,b在取值范围内增加,解出满足上式的r值,每计算出一个(a,b,r)值,就对相应的数组元素A(a,b,r)加1。计算结束后,找到的超过阈值的A(a,b,r)所对应的a,b,r就是所求的圆的参数。

函数程序:

function [Hough_space,Hough_circle_result,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之间的数.
% a = x-r*cos(angle); b = y-r*sin(angle);
%---------------------------------------------------------------------------------------------------------------------------
% output:
% Hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数;
% Hough_circle:二值图像,检测到的圆;
% Para:检测到的圆的圆心、半径.
%---------------------------------------------------------------------------------------------------------------------------
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  

主程序:

clc
clear all
%------------------------------------------------------------------------------
%模拟图像
I=ones(256,256);
I(20:20:220,20:20:220)=0;
for i=20:20:220  for j=20:20:220  circle_size=floor(rand*4);  for ci=i-circle_size:i+circle_size  for cj=j-circle_size:j+circle_size  if (ci-i)^2+(cj-j)^2<circle_size^2  I(ci,cj)=0;  end  end  end  end
end
I= imgaussfilt(I, 4);
I(I>0.9)=1;
I(I<0.9)=0;
%---------------------------------------------------------------------------------
%加入直线干扰
I(64,:)=0;I(:,64)=0;I(128,:)=0;I(:,128)=0;I(192,:)=0;I(:,192)=0;
figure(1);
imshow(I,[]),title('原图');
%---------------------------------------------------------------------------------
% 用sobel进行边缘检测
BW = edge(I,'sobel');
%---------------------------------------------------------------------------------
%设置参数:
%检测的圆半径步长为1
Step_r = 0.5;
%角度步长0.1,单位为弧度
Step_angle = 0.1;
%最小圆半径2
minr =5;
%最大圆半径30
maxr = 20;
%以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(2);
imshow(BW,[]),title('边缘');
axis equal
figure(3);
imshow(Hough_circle_result,[]),title('检测结果');
axis equal
figure(4),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(3,k)+circleParaXYR(2,k);  y=sin(t).*circleParaXYR(3,k)+circleParaXYR(1,k);  plot(x,y,'r-');
end
  1. 效果图:

如有问题请留言。

Hough 圆变换----Matlab实现相关推荐

  1. hough森林 matlab,霍夫变换(Hough

    原创文章,转载请留言,注明出处 首先简要介绍一下什么是霍夫变换,以及它可以实现什么.霍夫变换最早用于提取图像中的直线,后来经过不断的改进,已经可以用来提取圆,正方形等简单的线条或形状.下面的介绍主要根 ...

  2. hough函数 matlab,matlab中hough函数

    hough 变换提取直线(Matlab 实现) Hough 变换提取直线一.实验目标实现用 Hough 变换检测直线的算法二.实验内容 1.读入图像选取有较多直线及部分曲线以作对比的...... 基于 ...

  3. MATLAB中hough反变换,matlab中hough变换

    hough 变换提取直线(Matlab 实现) Hough 变换提取直线一.实验目标实现用 Hough 变换检测直线的算法二.实验内容 1.读入图像选取有较多直线及部分曲线以作对比的...... j= ...

  4. 广义hough变换matlab,matlab – 广义Hough R表

    我试图在MATLAB中实现 this paper中提出的广义Hough变换.我也尝试使用 this document来理解算法.我不知道如何计算梯度角来找到Φ在R表中使用. 我试图运行这个matlab ...

  5. hough变换连接边缘matlab,hough边缘检测matlab

    利用matlab进行图像检测--直线提取_数学_自然科学_专业资料.Harbin Institute of Technology 图像工程导论 课程名称: ...(BW),'canny',thresh ...

  6. hough函数 matlab,在不使用hough函数的情况下在MATLAB中进行Hough变换

    我在 Rosetta Code的MATLAB中找到了Hough变换的实现,但是我无法理解它.另外我想修改它以显示原始图像和重建线(de-Houghing). 理解它和de-Houghing的任何帮助表 ...

  7. python opencv之 Hough圆变换

    原博客地址:https://blog.csdn.net/tengfei461807914/article/details/77507820 https://blog.csdn.net/Tina_Wei ...

  8. python opencv入门 Hough圆变换(28)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 使用霍夫变换在图像中寻找圆 使用函数cv2.HoughCircles() 原理: 圆形的表达式为(x−xcenter)2+ ...

  9. 【matlab图像处理笔记4】【图像变换】(三)图像的霍夫变换

    文章目录 推荐阅读 前言 霍夫变换概述 霍夫变换直线检测原理 从笛卡尔坐标系到霍夫空间 两点一线的霍夫空间形式 寻找共线的点 直角坐标系存在的问题 极坐标参数空间下的霍夫变换 matlab霍夫变换直线 ...

最新文章

  1. 姚期智:中国金融科技发展的真正挑战是什么?如何解决? 本文作者:温晓桦 2017-09-17 18:31 导语:“在金融科技里面,计算机科学的用途已经从台后走到了台中,对核心金融体系的运作上产生一定的
  2. svn版本信息自动更新到源代码
  3. virtualenv创建python项目虚拟环境
  4. vscode较详细注释的汇编语言hello world 输出程序,第一个汇编程序
  5. 简单链接Simplelink 传感器标签SensorTag
  6. 我一哥们,在东莞和五名女孩被抓了.....
  7. 医生的小助手,医疗AI赋能诊断新冠肺炎新方案!
  8. java实现阴历、阳历互相转换
  9. MT8516芯片原理图资料(6MIC_RESERVE_4MIC_ARRA)
  10. CVTE 后端开发面经
  11. 操作系统【用户接口】命令解释程序的主要功能、系统调用与一般过程调用的不同之处、系统调用的参数传递方式、系统调用的处理步骤
  12. 2020计算机专业保研夏令营面经:北航计算机
  13. 【linux系统如何查看内核版本、操作系统版本等信息】
  14. ionic3开发系列——ionic3懒加载配置
  15. 梯度反向传播(CS231n课程笔记翻译)
  16. matlab画弯曲圆柱体,matlab – 将平面弯曲成闭合的表面/圆柱体
  17. 功能简单的erp软件
  18. dfgdfgdfgdfg
  19. 乔布斯出生 | 历史上的今天
  20. 上白泽慧音,洛谷之提高历练地,较复杂图论II

热门文章

  1. 计算机网络之网络概述:3、性能指标(速率、带宽、吞吐量、时延、RTT、利用率)
  2. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第六、七节:视图
  3. (软件工程复习核心重点)第三章需求分析-第一节:需求分析相关概念
  4. (计算机组成原理)第六章总线-第二节:总线仲裁(链式查询,计数器查询、独立请求)
  5. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit
  6. 利用递归的方法求最大公约数和最小公倍数(Java)
  7. Python 计算文件夹大小、文件大小
  8. linux 各系统防火墙操作
  9. FZOJβ #31.字符串
  10. Scala-Unit6-final/type关键字、样例类样例对象