霍夫变换(Hough)
百度百科
霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
非常官方的定义,就是看完还是啥都不懂。在我理解看来就是坐标系的映射,类似于直角坐标映射到极坐标,把图像形状所处的二维直角坐标映射到参数空间。在这里拿直线霍夫变换为例。
直线霍夫变换
一个平面直角坐标系里的一条直线,长这样,公式咋写啊
y
=
a
x
+
b
y=ax+b
y=ax+b
霍夫说了我就不这么写,我想这么写
y
=
−
c
o
t
(
t
h
e
t
a
)
x
+
ρ
∗
c
o
s
(
t
h
e
t
a
)
∗
c
o
t
(
t
h
e
t
a
)
+
ρ
∗
s
i
n
(
t
h
e
t
a
)
y=-cot(theta)x+ρ*cos(theta)*cot(theta)+ρ*sin(theta)
y=−cot(theta)x+ρ∗cos(theta)∗cot(theta)+ρ∗sin(theta)
公式记得住记不住无所谓了,反正规定的就是上面这张图这样,简单易懂,他就打算把这个直角坐标系里的直线给整到ρ和theta的坐标系里,挺好的一个ρ一个theta就能确定一根直线。
对于一张离散的图片边缘提取矩阵来说,我们把边缘的每一个点都做霍夫变换得到ρ-theta坐标系的一条曲线,这条曲线上的的所有点,都是过这个点的直线,所有的直线累加在一起对应的最大重合点就是对应直线的ρ-theta方程。
下图为两条直线的霍夫变换
附一个简单的霍夫变换子程序
def hough(img):
a,b=img.shape
hough_change=np.zeros((4*int(a+b),181))
for i in range(a):
for j in range(b):
if img[i,j]==1:
for theata in range(181):
d=int(i*np.cos(np.pi*theata/180)+j*np.sin(np.pi*theata/180))
hough_change[d+a+b,theata]+=1
return hough_change
一个简单的逆变换子程序
def rehough(hough,passval):#passval为自己设定的阈值
recoding=[]
a,b=hough.shape
for i in range(a):
for j in range(b):
if hough[i,j]>=passval:
recoding.append((i,j))
return recoding
一个自己写着玩的小例子,因为嫌麻烦只找了最大值对应的直线