累加值来判断圆的大小和圆心的位置。例如,在xy平面上的方程为xa2yb2r2其中点(a,b)为圆心坐标,r为圆半径,点(x,y)为圆周上的一点,将其转换为参数坐标系(a,b,r),方程为ax2by2r2可看出次方程为圆锥面,对于原图像中任意确定的一个点在参数空间都有一个三维锥面与其对应。
在Hough变换检测圆时,可以利用梯度信息在很大程度上加快圆检测的速度。对圆周而言,其梯度方向只有背离圆心或者指向圆心,当梯度指向圆心,圆心就在梯度的延长线上,而当梯度背离圆心,圆心则在梯度的反向延长线上。所以,边缘梯度信息的加入可以预估圆心的位置,这样可以使算法的运算量明显减少,并且可以有效抑制虚假局部最大值。圆心位置可以用极坐标方程形式表达axrcosθxyayrsi
θxy或者axrcosθxyayrsi
θxy,边缘像素(x,y)处的梯度方向为θxy。前一组公式是梯度方向背离圆心,后一组为梯度方向指向圆心。以前一种情况为例,边缘图像中每个边缘像素点(x,y)都可以算出其相应的梯度方向θxy。通过前一个公式可算出圆心坐标(a0,b0),对于参数空间可能的半径r0,其相应的参数空间累加器单元加一,最后找到累加器的局部最大值,就得到一个圆。
本实验中,我们检测的圆半径范围为10100,半径步长为1,角度步长为π18p07。得到的结果如下:
fhough变化后的图像
6Hough变换结果与原图像相加上一步得到的图像是一副逻辑图像,这一步我们首先判断上一步得到的图像
每一个像素是否为1,如果是则相加后该点的像素值为255,否则该点的像素值为原图像在该点的像素值,这样就得到了hough变换后图像与原图像相加的图像,结果如下所示:
最终的结果
f四、源程序
本实验采用matlab来实现,原程序如下所示:
clearall1读入图像并显示SimreadESwede
coi
sbmpfigureimshowStitle原图像
2引入均值为零,方差为a的高斯噪声对图像进行平滑,然后进行拉普拉斯变换
m
sizeS
a1
hzerosm
hdoubleh
fori1m
forj1
ti2j2
hijt2aexpt2aa2
e
d
e
d
Hfftshiftfft2h
Gfftshiftfft2S
WHG
wifft2ifftshiftW
figureimshowwtitle平滑后进行拉普拉斯变换后的图像3对水平,垂直,45度,45度方向进行边缘检测,采用Prewitt梯度算子
IMGdoublew
H1zerosm
H2zerosm
G1zerosm
G2zerosm
fori2m1
for
j2
1
H1ijIMGi1j1IMGi1jIMGi1j1IMGi1j1IMGi
1jIMGi1j1
H2ijIMGi1j1IMGij1IMGi1j1IMGi1j1IMGr