本章主要讲解最基本的图像分割算法
Hough transform霍夫变换
算法流程:读入图片,边缘检测,创建累加器,找到累加器中的最大值,将曲线画回原图片
首先从检测直线来理解,平面直线的表达式
row是直线到原点的距离,theta是x轴到过原点垂线逆时针方向夹角,直线上的所有点都满足上述表达式。而每一个点(x,y)都可以有无限多条直线(row,theta)与之对应,就看做这些直线(row,theta)得到点(x,y)的一次投票。
同理,通过另一个点也有无数条直线(row,theta)与之对应,这些线同样得到该点的一次投票。此时有且仅有一条直线会同时得到来自上述两点的投票。继续检测其他点(这些点应该具有一些相同属性,比如相同灰度值),对通过每个点的直线投票,那么目标直线就是累计得票最多的(row,theta),上限是取点数。
现在把这个过程转换到row和theta的坐标上理解
平面上固定的点(x,y),取遍theta可以得到不同的row,这些(row,theta)在坐标上描出形如sin函数的图,同理每个点都可以得到一个这样的类似sin函数的图,每个(row,theta)可以用一个累加器来记录函数通过它的次数(得票数),次数越多的就越可能是目标直线。
下列程序调用MATLAB的库函数来实现hough变换寻找直线段。
如何检测圆?
平面圆上的每个点都满足如下方程,(x0,y0)是圆心坐标,r是圆半径
和直线检测类似,每个点(x,y)对通过它的圆(x0,y0,r)投票,票数最多的就是目标圆了,对应的应该是3维坐标
hough变换一边用于检测简单的曲线,比如直线,圆,椭圆,因为他们的表达式中参数有限且范围固定,所以计算效率较高,占用空间也不会很大。下一章将会和大家分享otsu算法的学习心得。