霍夫线变换
霍夫线变化适用于在检测某一张图像中线段的位置,在实际使用过程当中可用于对图像线段特征进行查找过滤。个人能够想到的实际用途可能是用于作业检测,检测在横线上填写的答案。霍夫变换是图像分析,机器视觉,数字图像处理中常用的处理方法。这种方法能从图像中分离出一些特定的形状的图形。经典的霍夫变换研究的是如何在图像中分离出直线,随着研究的深入,霍夫变换可以分离出图像中的圆,椭圆,甚至是任意形状。
基础知识
首先需要明白一个基础知识,就是在笛卡尔坐标系当中,一条线段的表示方法是:y = kx + q,其中q是常量。但是在霍夫空间中,一条线段是以一个点来表示的。反之,霍夫空间中的线代表笛卡尔坐标系当中的点。即:
- 霍夫空间点 == 笛卡尔坐标系线
 - 笛卡尔坐标系点 == 霍夫空间线
 
这很重要!!!当我们需要找到图像中的一条线段的时候,需要确定被处理后的图像的多个点是否交于同一线。如果多个点在笛卡尔坐标系当中是同一线,反之在霍夫空间当中多条线会交于同一点上。由此实现点与线的对应关系。
在霍夫空间当中,只需要统计相交于同一点的线最多的点,就能找到图像中越接近线的部分。接下来看看具体转化过程。
原理讲解
首先确认笛卡尔坐标系当中想要确定一条线需要确定两个值,即方程式y = kx + q当中的k与q,确认了这两个值之后就能确认一条线的位置。于是乎,在霍夫空间中就以(k,q)的点来表示一条线段,由此实现了笛卡尔坐标系到霍夫空间的转化。
反之如果知道笛卡尔坐标系当中的一个点,如(4,5),怎么推导霍夫空间的函数呢?此时只需要带入方程式:y = kx + q,即可得出q = 5-4x。
特殊情况
在特殊的情况下,如果出现由(1,2)、(1,2)、(1,3)、(1,4)这四个点组成的直线,直线垂直于坐标轴x轴。原来的方程y = kx + q已经不能够适用在这样的情况之下了,该怎么办呢?
这时候就需要祭出我们的极坐标系了!在极坐标系当中,一条线的方程式是ρ = xcosθ + ysinθ。其中ρ代表线上一点到原点的距离,θ代表线上一点于原点的连线和x轴的夹角,因此同理可以得出极坐标系于霍夫空间的对应关系,以极坐标系上的点为例。以(1,0)为例,带入方程:ρ = xcosθ + ysinθ可得ρ = cosθ
总结
笛卡尔坐标系通过与霍夫空间进行转化,能够将两者的点与线进行映射从而找到图像中的线,因此只要使用适当的线的函数通过映射关系理论上可以找出任意的线甚至多边形。而在opnecv当中,已经通过python代码写好工具提供给我们使用了,代码案例如下:
1  | import cv2 as cv  | 




