关闭

图像变换-使用Hough变换检测圆

标签: Hough变换霍夫变换检测圆opencv
4810人阅读 评论(1) 收藏 举报
分类:

使用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。而霍夫圆变换则只要输入灰度图像即可,因为在霍夫圆变换的过程中已经用到了canny边缘检测。

Hough变换的原理可以参考下面两篇文章:

http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990

http://www.cfanz.cn/index.php?c=article&a=read&id=133338

关于用Hough变换检测圆的原理,在下面这篇论文中有提到:

http://wenku.baidu.com/link?url=Y0kc37_nSMzSObToFmwR3dutksaPXWM0BCfA861sLX0E9N1ZM5RNBz2vLp-mc9pDNhZ0Svg0DAcYjrfQavaQB3mAU4Rkp8s6t09aMUzieZW


本文着重讲解怎样是opencv中使用hough变换检测圆

----------------------------------------------------------------------------

/* Finds circles in the image */
CVAPI(CvSeq*) cvHoughCircles( CvArr* image, void* circle_storage,
                              int method, double dp, double min_dist,
                              double param1 CV_DEFAULT(100),
                              double param2 CV_DEFAULT(100),
                              int min_radius CV_DEFAULT(0),
                              int max_radius CV_DEFAULT(0));



image :输入 8-比特、单通道 (二值) 图像

circle_storage :输出圆心坐标(x、y),和半径r

method : Hough 变换方式,目前只支持CV_HOUGH_GRADIENT

dp :累加器图像的分辨率。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。

minDist :让算法能明显区分的两个不同圆之间的最小距离。

param1 :用于Canny的边缘阀值上限,下限被置为上限的一半。

param2 :累加器的阀值。

minRadius :最小圆半径

maxRadius :最大圆半径,默认为最大值 max(image_width, image_height)

--------------------------------------------------------------------------

#include<cv.h>
#include<highgui.h>

int main()
{
	IplImage* src = NULL;
	IplImage* dst = NULL;
	IplImage* color = NULL;

	src = cvLoadImage ("1.bmp", 1);
	dst = cvCreateImage (cvGetSize(src), IPL_DEPTH_8U, 1);
	if (src->nChannels == 1)
	{
		dst = cvCloneImage (src);
	}
	else
	{
		cvCvtColor (src, dst, CV_RGB2GRAY);
	}
	color = cvCreateImage (cvGetSize(src), IPL_DEPTH_8U, 3);
	cvCvtColor (dst, color, CV_GRAY2RGB);

	
	CvMemStorage* storage = cvCreateMemStorage (0);
	//cvSmooth (dst, dst, CV_GAUSSIAN, 5, 5);
	cvSmooth(dst,dst,CV_MEDIAN,11);
	
	CvSeq* circles = cvHoughCircles (dst, storage, CV_HOUGH_GRADIENT, 2, dst->width / 30, 50, 80, 10, 70);
	
	
	for (int i = 0; i < circles->total; i++)
	{
		float* p = (float*)cvGetSeqElem (circles, i);
		CvPoint pt = cvPoint (cvRound(p[0]), cvRound(p[1]));
		cvCircle (color, pt, cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0);
	}

	cvNamedWindow ("src", 1);
	cvShowImage ("src", src);
	cvNamedWindow ("circle", 1);
	cvShowImage ("circle", color);

	cvWaitKey (0);

	cvReleaseMemStorage (&storage);
	cvReleaseImage (&src);
	cvReleaseImage (&dst);
	cvReleaseImage (&color);

	return 0;
}

在使用时参数的调整是关键,一定要知道各参数的调整才能调出合适的参数。

测试原图:



运行结果:



本文系原创,转载请注明!

0
0
查看评论

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

Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。圆的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。附录中的MATLAB程序为网上比较常见的,实际运行中存在一些问题,这里进行...
  • mhjerry
  • mhjerry
  • 2011-12-11 21:37
  • 69262

Hough变换检测圆

原理:         我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像...
  • s12244315
  • s12244315
  • 2016-09-29 11:50
  • 1886

Hough变换检测直线和圆

1 直线是如何表示的?        对于平面中的一条直线,在直角坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用极坐标(r,theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线...
  • caoluwill
  • caoluwill
  • 2016-07-18 10:23
  • 555

Hough变换检测圆

Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。圆的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。附录中的MATLAB程序为网上比较常见的,实际运行中存在一些问题,这里进行...
  • hongyingaaa
  • hongyingaaa
  • 2016-04-02 10:52
  • 1139

OpenCV2马拉松第23圈——圆检测与通用Hough变换

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 看本文前,建议先去看OpenCV2马拉松第22圈——Hough变换直线检测原理与实现 收入囊中 Hough圆检测通用...
  • abcd1992719g
  • abcd1992719g
  • 2014-05-27 23:44
  • 3480

虹膜识别(三):Hough变换检测内圆边缘

前面我们已经得到了hough变换的基础条件,那就是有一个很好的用于检测的二值边缘图像如下所示:   至此我们才能运用hough变换。 Hough变换是一类广泛用于检测各种规则图形用的,像直线、圆、椭圆等等,不同的就是检测的规律不同。Hough变换的原理网上多得是,我当初也是百度上查的...
  • on2way
  • on2way
  • 2014-11-04 19:39
  • 4062

Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具。Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几...
  • on2way
  • on2way
  • 2015-07-23 21:27
  • 14301

hough变换圆检测matlab程序(包括几幅图片及实验结果,打开circle_dec.m就可以直接运行)

  • 2010-06-15 11:49
  • 405KB
  • 下载

Hough变换原理

Hough变换原理NEU icerain 2007.6.25一、简单介绍Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间...
  • icerain_3321
  • icerain_3321
  • 2007-06-25 09:42
  • 31919

Hough Transform(霍夫变换)检测Circle(圆)的几种方法

使用霍夫变换检测图像中的直线,圆等图形是利用图形函数的从直角坐标系到极坐标系的转换。 比如检测直线中,直线方程y = k * x + b  ,   直线上的所有点都对应着参数( k , b), 给定一个点(x0 , y0)我们能够得到通过这个点的所有直线的参数(k , b...
  • zkl99999
  • zkl99999
  • 2015-05-24 13:30
  • 5610
    个人资料
    • 访问:197438次
    • 积分:2911
    • 等级:
    • 排名:第14404名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:75条
    文章分类
    最新评论