钱币定位系统
算法整体流程
为了实现钱币定位的功能,实验设计了Canny边缘检测和Hough圆变换两个主要的功能,最终实现了检测出输入图像中各个钱币的边缘并给出各个钱币的圆心坐标与半径的效果。
Canny边缘检测:
该算法以原始图像的灰度图为输入,先对图像进行高斯滤波,使图像更加平滑,然后计算梯度,得到图像的梯度图。接下来,进行非极大化抑制,去除所有非边缘的点。最后,用滞后阈值法将比高阈值大、比低阈值小的像素保留为强边缘,形成完整的边缘线。将处理好的图像保存在指定路径。
Hough圆变换:
将经过Canny边缘检测处理的图像作为霍夫变换的初始图象,对图中的像素点进行霍夫变换的投票,形成投票矩阵。之后,对投票矩阵中超过设定阈值的解码为圆,并将圆心和半径储存并打印。
经过上述变换后,可以在指定路径下得到最终结果图,并会得到输出的圆心坐标与半径。
函数功能说明
在类CannyEdgeDetector
中实现了下列函数:
caculate_gradients()
根据灰度图计算图像的梯度图和梯度方向矩阵,对每个像素点,用Sobel算子计算水平和垂直方向上的梯度。根据计算出的水平和垂直梯度,使用cv2.cartToPolar()
函数计算每个像素点的梯度幅值和梯度方向。non_maximum_suppression()
对图像梯度图进行非极大化抑制处理,对每个像素点,根据预设的阈值考虑是否将某些点的梯度置零,去除这些非边缘的点。hysteresis_thresholding()
实现了边缘检测中的双阈值滞后阈值化,把梯度大于高阈值的像素标记为边缘点,把与其相邻的梯度高于低阈值的点的梯度设为高阈值。
在类HoughCircleTransform()
中实现了下列函数:
Hough_transform_algorithm()
该函数基于Canny边缘检测得到的梯度图,对梯度大于零的点进行投票,形成投票矩阵。Select_Circle()
对得到的投票矩阵进行遍历,找到投票数超过阈值的候选圆,选出合适的圆储存在列表中。
函数输入参数说明
- Guassian_kernal_size:高斯滤波器核大小
- high_threshold:双阈值法的高阈值
- low_threshold:双阈值法的低阈值
- Hough_transform_step: 图像控件转参数空间的变化比例
- Hough_transform_threshold: hough变换的门限值
最终结果拟合图
原始图像:
经过Canny边缘检测得到的图像:
经过Hough圆变换得到的图像:
输出结果:
参数对结果的影响
在实验中调参时发现,预设参数对目标检测的效果有影响:
- 减小
high_threshold
和low_threshold
,可以使Canny处理后的图像边缘更加明显 - 减小hough变换的门限值
Hough_transform_threshold
可增加检测出的圆数量