简单的基于圆霍夫变换
实验目的
实现基于霍夫变换的图像园检测(边缘检测可以使用opencv的canny函数),即在图片中检测到可能存在的园。
实验步骤
首先我们在本次实验中的目的是基于园霍夫变换,霍夫变换实验前我们要进行灰度,高斯模糊,canny边缘检测三项操作,灰度转换是因为我们要进行边缘检测输入应该是一个灰度图像,所以我们的首要操作是对图像的灰度操作,高斯模糊目的是减少整个图像中的噪点对实验结果的影响。Canny边缘检测会输出一个二值图,三种操作的实现可以使用opencv自带的函数:
灰度转换 cvtColor(imagesource,imageoutput,btype)其中要注意的是在opencv的3版本中btype与2版本会有不同,下面是在二和三版本的各种转化的btype:
然后高斯模糊使用GaussianBlur函数,具体使用方式可以参考相关资料。
canny边缘检测也可以使用canny函数,具体使用和参数可以参考相关资料。canny边缘检测输出的是一个二值化后的图像,即整个图像中只有两种熟知的像素点信息。
霍夫园变换原理
基于上面实现的canny边缘检测,我们来理解霍夫圆变换,霍夫圆变换其实是使用霍夫空间来实现的一种对于所有可能情况的统计。霍夫空间按照我的理解来说是一个方便于我们统计数据的空间,如在基于直线的霍夫变换中我们可以将一条直线转换为霍夫空间上的一个点,而基于圆的霍夫空间则是对二值化上的每一个非0点的可能存在的园上的点的统计。
即我们的二值化图像对应于二维的信息,而我们霍夫空间是对应三维信息,即将我们的图像二维空间作为底面,检测的圆的半径作为高的增长变化,半径增加1,我们的高增加1,然后通过设定我们的半径最大最小范围,二值化上的每一个非0点可以对应到霍夫空间上的以该非0点为顶点或顶点圆心的圆锥或圆台,通过统计霍夫空间上的每一个点的数值可以看到通过该点的园的数量,然后使用一个阙值就可以得到一个园上的点数大于阙值的园。
霍夫变换实现
在实现过程中我使用的是一个vector来定义的三位数组,定义方式为:
vector<vector<vector<int>>>gassionspace(m, vector<vector<int>>(n, vector<int>(z, 0))); //设立一个m*n*z的数组 初始值为0
然后是对每一种可能存在的园的情况的标记操作:
for (int r = 0; r < z; r++)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (cannyimg.at<uchar>