图像缩略图

霍夫变换圈

版本1.2.0.0(187 KB) 大卫年轻人
霍夫变换功能,用于检测圆,优化,以允许搜索超过半径。

78次下载

更新2016年3月4日

查看许可证

霍夫由边缘检测器变换可用于检测图像中的圆形形状,二进制化之后,例如。通常情况下,功能都做这个操作需要指定圆的半径。
函数圆允许指定半径的范围,这样就不需要事先准确地知道半径。它可能比为不同半径重复调用标准函数更快。
可以通过在3D累加器阵列中找到峰值来检测多个圆。为此提供了一个函数circle_houghpaks。这两个功能的演示作为脚本circleúhoughtemo提供。
zip文件包括一个有效和准确地执行近似圆的,无间隙,在一个整数网格。

引用为

大卫·杨(2020)。霍夫变换圈(//www.tatmou.com/matlabcentral/fileexchange/26978-hough-transform-for-circles),MATLAB中央文件交换。检索

评论和评分(66

玉轩YEH

杨振宁

巴拉沙麦地

我有一个虹膜的图像。当我精确地执行代码时(除了将最大峰值数调整为2),只检测到内瞳孔。虹膜的外边界检测不正确(即)。请帮忙

兴隆坊

做得好!感谢分享

另一个变化
nhood2 =([params.nhoodxy params.nhoodxy] -1)/ 2;
nhood2 = [nhood2 params.nhoodr - 1];

有一个与nhoodr抑制的问题,它假定半径是连续的起点从1而不是考虑到实际使用的半径。
固定:
r0=最大值([1 1半径(1)],[r c半径(k)]-nhood2);
R1 =分钟([尺寸(H,1),大小(H,2),半径(结束)],[R C的半径(K)] + nhood2);
R2 =找到(半径> = R0(3)&半径<= R1(3));
h(r0(1):r1(1),r0(2):r1(2),r2(1):r2(end))=0;

阿里尔y

您好大卫年轻人,
每当我运行ciculu houghpeck.m代码时,它都显示错误:???输入参数“h”是
不确定的。

错误==> circle_houghpeaks在
73
PARAMS = checkargs(H,半径,
varargin {:});
我真的不明白为什么呢?可以请你帮我出。

TOAN NGUYEN

它工作在我的应用程序最好

你可以建议一些事情,以避免错误检测。

MUTHU库马尔

嗨,YIBO,如果你改变数据中的半径范围,从16开始,而不是从15开始(所以你有“radii=16:1:40;”),那么它会再次找到所有的硬币。

示范帐户必须与原来的半径范围内都工作时,我提交它。我不知道发生了什么变化,产生新的行为。在某些时候,我会更新的演示。这确实说明这个过程是verysensitive的参数值,但这是算法的属性,而不是我的具体实现方式。

我试着用在图像http://imgur.com/ls65Kwi我的圆检测代码工作得很好,在演示中检测所有14个圆而不改变参数,当然除了要查找的圆数。问题是你只需要增加10到14个圆就可以找到吗?

艺舶

嗨大卫!我曾尝试与coin.png但硬币(一来就下右)无法被检测到的一个程序。我也尝试过其他的图像,如一个由Farhat的在2013年7月21日(建议http://imgur.com/ls65Kwi)。还有些硬币无法被检测到。是,也发生在你或我做错了什么?

谢谢你,詹坤和-你说得对。现在修好了。

詹坤和

嗨,大卫,好像你的98行有个错误胡峰。什么两个是由“&&”组合的空的(相同的),还是空的(参数nhoodr)&&愚蠢的(参数nhoodxy)相反呢?我不能请理解告诉我为什么。

谢谢你,我的伟大工程!

Nitay Megides

嗨奥马尔,我认为这将是很难改变这工作一般椭圆。一般的椭圆形具有5个参数,这导致与所述累加器阵列困难 - 所以变换比霍夫其它方法是可能更好。上有椭圆拟合一些好论文 - 作者到谷歌是安德鲁·菲茨吉本。

非常感谢你的伟大的代码...
如果我能把它改成椭圆而不是圆,有什么提示吗?

我最好的问候...

帕普墨西

有一个问题我都类似代码中尝试过的最好的。唯一一个发现所有的圈子在我的* .tif文件它由复合材料制成的,有很多在它的圆形纤维的显微照片的。该代码拿起每单纤维的中心和半径正确。大多数其他类似方案错失了不少的纤维。谢谢了这样一个很好的努力。我也想看看有没有找到每一个在“边缘”的呼叫,但最终方案显示了纤维周围的同心圆的方式只挑选纤维,而不是同心环。

嗨大卫

伟大的工具感谢。我是正确找到峰值位置没有像素?你会如何找到亚像素精度的高峰?

谢谢

乔治嗨,你是确保circle_hough功能是您MATLAB的路径?什么是“这circle_hough”命令的输出?

嗨大卫..
我在我的图像上尝试了算法,但是Matlab给了我一个错误:
未定义的函数或方法“circle_hough”的输入参数
键入“双”。

误差==>在27 circle_houghdemo
h=圆_hough(e,半径,“相同”,“标准化”);
我怎样才能解决这个问题
多谢

嗨Farhat的。我试了一下你的形象和它工作得很好 - 有什么问题吗?

法哈特

为什么这个图片的代码cannott工作http://imgur.com/ls65Kwi

你好Abdelmoumen,代码将已经检测部分隐藏圈。基本上,如果圆的部分P是可见的,对于圆峰将获得P次票的整圈会的数量。是否检测到圆的一小部分取决于噪声的图像中的量 - 即,许多其它边缘如何都存在。

Abdelmoumen

您好大卫
感谢您的answer.I还有一个问题,难道这代码加以改进,以识别图像中隐藏patially圈。
谢谢

你好火花报,我很抱歉,但它是很难回答这种查询。我需要为这个项目工作,我要弄清楚什么样的代码来写 - 一切都取决于细节。我希望你能想通了。

塞塔雷

你好,大卫,
我有一个问题,我用imfindcircles命令识别图像中的一个圈,现在如果我想用这个圈子T的信息找到另一个像一个圆圈,我该怎么办?
例如,如果我知道半径的与中心之间的差异。
我真的很感谢你的时间。

请看我2010年9月30日的答复。

Abdelmoumen

嗨大卫,当我EXCUTE这个代码,我得到这个错误:
??? 错误:文件:circle_houghpeaks.m行:113列:11
表达式或语句不正确 - 可能不平衡({或[。
感谢这个代码。

嗨,narjes,对circle_hough的调用有太多输入参数。仔细看一看,并将其与演示中的示例进行比较。如果你需要更多的帮助,请张贴打电话给circle_hough的代码。

narjes

喜大卫,当我使用此代码
一些错误如下:

??使用错误==> nargchk
太多的输入参数。

错误==> C:\ MATLAB6p5 \工作\ circle_hough.m
上线路40 ==>误差(nargchk(2,2 +长度(OPTS),nargin, '结构'));
你能帮帮我吗??

嗨欢欢。您需要下载在提交的所有文件,并把它们放到一个目录中MATLAB的路径。它看起来像你没下载circlepoints.m。

沉欢欢

你好,大卫
当我使用此代码,一些问题来了:

未定义功能“circlepoints”类型“双”的输入参数。

圆度误差(第61行)
[TR,TC] = circlepoints(rrange(I));

误差在Circle_Detection2(第10行)
h=圆_hough(e,半径,“相同”,“标准化”);

你知道吗?

我已经创建了一个代码来检测一些和你一样的圆。。它跑得很完美,你的也是。。但是我还是找不到一个hough变换码来检测椭圆。我在文件交换中搜索,只找到一个代码。我试着运行它,它工作,但我对结果不够满意:(

嗨,维杰。当你看图像时,你怎么知道哪些圆是粒子,哪些不是?你能把这种理解变成代码来过滤掉你不想要的圆吗?

您好大卫
我想检测i。从PIV测量技术获得的图像中的圆形玻璃颗粒。目前我使用Hough变换,但它示出圆圈哪些不是颗粒。可以ü帮助我

你好安德里。这不容易,解决方法取决于你的图像是什么样的-例如,椭圆都是非常扁平的,还是其中一些接近圆形?如果你有一组通用的形状,你可能需要使用某种椭圆检测器(不一定是Hough变换)来找到它们。这也会检测圆,但是你可以简单地根据纵横比来区分圆和椭圆。很抱歉,我的圆形探测器在一般情况下可能不是很有用。

嘿,我安德里形式印尼,我需要一些Hough变换代码,可以看到椭圆和圆之间的区别..你能帮助我吗?谢谢 :)

nourdine

nourdine

...

詹姆士

格拉西亚斯大卫年轻人POR埃斯特algoritmo,我ayudo MUCHO对detectar comprimidos EN联合国水疱,

费尔

嗨伊万,感谢您的评论。如果设置npeaks为1,您将得到最强的证据圈。如果不是正圆形,则需要额外的代码来选择您想要的圈子,使用一些其他的选择标准,如RADIUS或位置。

伊凡

哇,非常感谢大卫的代码,帮助了我的项目很多!

只有一个问题,

例如,如果我是集npeaks至图5,这将导致被检测5个圈。但是,我只想圆的一个。

因此,是否可以设置一个参数来消除其他圆?或者我需要添加到你的代码中吗?

非常感谢!

我尝试了几种不同的Hough圆检测算法。他们之中没有人容易使用或作为强大的,因为这一个。这也是非常快相比,编辑挑选的一周。即使是脚本circlepoints原来是比标准招更快绘制在Matlab一个圆圈。我唯一的建议是,你成为一个更好一点的newbs大卫... :)

特里斯坦

真棒代码大卫,非常感谢。
你刚才提到了旧版本的MATLAB的补丁R2007b工作非常适合我

涛哥你好,我想你可能使用的是旧版本的matlab不允许匿名变量使用〜的。请尝试用一个变量名称替换〜在文件的113行,像这样:

[未使用,ind]=排序(h(peakind),“下降”);

涛哥?

你好,我可以做好。
但对我来说,一个错误发现:???错误:文件:circle_houghpeaks.m行:113列:11
表达式或语句不正确 - 可能不平衡({或[。

怎么处理?
THX〜

醪:很抱歉,但我也没有办法。可能有很多不同的原因,这种技术不适合你的项目工作,你可能需要调查其他方法,以及试验,以寻找边缘检测和HT本身是好的参数值。您可能会被张贴在新闻组的请求(例如带图像)获得更详细的建议。

你好

我要上“人眼检测”用你的代码为我的项目

我测试,但它有许多错过的地方圆检测。

如何优化您的代码?

谢谢

阿里萨贝里:由于这个页面显示,该代码是用Matlab 2010A内置。只是因为你有一个旧版本的Matlab的,你不应该给低评级。您可以删除对validateattributes通话(但你将失去错误检查),然后会在系统上运行。

关于你的第二点:这是不讨论特定的应用程序的地方,我建议张贴在新闻组的问题。

你好,大卫,
这应该是很好的快速工作。这里我有以下问题:
1 - 我的LAB系统上运行的演示文件,我可以看到下面的错误
???未定义命令/功能“validateattributes”。

误差==>41度的圆
validateattributes(rrange,{ '双重'},{ '真实' '正' '载体'});

误差==>在26 circle_houghdemo
h=圆_hough(e,半径,“相同”,“标准化”);

2-我有疲劳检测驾驶员/飞行员的算法
最后的步骤,我已经二值图像周围的学生即使眼睛是开放的,我想,我需要一个良好的Hough变换检测瞳孔圆的谐音,它可以这样做或圆形应该是完美的检测?

特吕克藩

做得好!感谢分享

更新

1.2.0.0

MathWorks的更新:新增直播脚本。

1.2.0.0

修正了圆圈里选项代码的错误。增强的圆圈点,用于图形时更通用。

1.1.0.0

新增circle_houghpeaks和circle_houghdemo,小的改动circle_hough以允许请求的半径正常化。

MATLAB版本兼容性
用R2016a创建
与任何版本兼容
平台兼容性
窗户 苹果系统 Linux的