实验要求
- 边缘检测
- 霍夫线变换
- 霍夫圆变换
算法实现
边缘检测
本代码采用LoG边缘检测算子
- 算子与图像卷积
- 寻找零交叉点,即边缘点
霍夫线变换
将彩色图像转化为灰度图,并对灰度图做边缘检测得到二值边缘图
参数空间离散化:对直线方程的参数$(r,\theta)$离散化,并给出$(r_{min},r_{max})$和$(\theta_{min},\theta_{max})$,划分为有限个等间距的离散值,使参数空间量化为一个个等大小网格。
设置累加器A:为每个网格单元设置累加器。A表示$(r_{min}:r_{max},\theta_{min}:\theta_{max})$,初始为0。
对图像空间中每个像素点坐标值(x,y),计算参数空间对应的曲线方程,将该曲线穿过的格子的计数值加一。
最后,遍历A(i,j)中的寻找累加计数大于某阈值M格子,其坐标$(r_m, \theta_m)$即为检测到的直线参数。利用cvtColor()将二值边缘图转换为RGB图,并将检测到的所有直线在图中画出来。
霍夫圆变换
将彩色图像转化为灰度图,并对灰度图做边缘检测得到二值边缘图
设定检测半径和角度范围$(r_{min}:r_{max},\theta_{min}:\theta_{max})$,ax),设置累加器A(x,y,r)
对图像空间中每个像素点坐标值(x,y),在指定半径和圆心角范围内,计算参数空间对应的圆心,累加器A(x_center, y_center,r)加一。
最后,遍历累加器中的寻找累加计数大于某阈值M格子,其坐标$(x_center, y_center,r)$即为检测到的圆参数。利用cvtColor()将二值边缘图转换为RGB图,并将检测到的所有直线在图中画出来。
显然这样的方法效率很低,时间和空间复杂度都很高,所以我们用梯度法优化。
- 用sobel算子计算出整张图的梯度
对于图像中每个点,在其梯度方向上的点的累加器A(x,y)加一
遍历A(i,j)中的寻找累加计数大于某阈值M格子,其坐标$(x,y)$即为可能是圆心的点。
- 对于每个圆心计算每个像素点与他的距离,并塞入数组R,然后寻找最多的半径R的数量,如果大于阈值那么就以该圆心半径画圆。若俩个圆心距离很近,那么就选其一。
代码实现
1 |
|