我个人觉得,canny是麻雀虽小,但是五脏俱全的人工智能的东东,正是他,让我对图像处理产生了极大兴趣,并走上了机器视觉的道路,当然,极大的兴趣,必然伴随极大的挫折和障碍。
虽然机器视觉中很少用它,但每有突破,总是不由自主想起他,回过头来,还是他最经典,他里边所蕴含的思想极具有启发性,canny不仅仅是算子,他是智能算子,他不是单一性的,他具有系统性,有恰到好处的中庸,这就是canny,了不起的canny,作为计算机视觉中一个里程碑毫不含糊,甚至可以说是人工智能领域里的里程碑!
好,为了更好的理解他,我们先拆解他,用积土成山的微积分方法,逐步撬动他。
第一个观念,穿越边缘的点梯度方向垂直于边缘。
如图示意,(i,j-1)位置,梯度方向角=arctan(0/0)=90度
(i,j)位置,梯度方向角=arctan(200/0)=90度
这样的示范随意一个点都可以蹚浑水成功,我们还是证明一下吧!
假定线方向在水平线上,那么与这条线相邻的点,即穿越边缘的点的Gx=0=f(i,j+1)-f(i,j),Gy=f(i+1,j)-f(i,j),那么arctan(Gy/Gx=无穷大)=90度,所以与这条线相邻的点的梯度方向角都是90度,这就保证了相互垂直。那么,我们把这幅图旋转45度,旋转也没用,因为你无法改变这种边缘图像的结构,无论如何,都可以把他旋转到水平形式,则结果仍然能保持其相互垂直。
如果不是穿越边缘的点,其实是不相关点,即使梯度角为90度,又有什么意义呢?也就是说他的计算和边缘搭不上边,计算无意义。
那么对于旋转后的任意角边缘,如何求边缘的斜率呢?那么高中知识告诉我们k1*k2=-1,认为相互垂直。
所以我们只要能找到穿越边缘的点,就能求出直线斜率来。
原来这就是找图像中在直线上点的原理啊!(下一次,我们用线边缘所有穿越点梯度角来求斜率,是否比最小二乘法快一些呢?有机会,试一下)