王 娟
(贵阳学院,贵州贵阳550005)
近几十年来,人们对高压电线损耗的担忧明显增加,在最大的电力输送公司,工程师面临的主要问题就是对抗电晕放电,而电晕放电是一个自发的过程,当电压等于或大于其最小值时,它发生在曲率半径很小的电极周围。这个值取决于电极的几何特性和放电发生的环境。电晕放电产生的条件是在电极表面存在足够强的电场,它是由线路电压、导线直径、导线间距以及当时的天气状况等各种因素所引起的。电晕放电不仅会造成电力传输过程中的能量损耗,还会对无线电产生干扰,使有源电力线路产生巨大的损耗,使空气发生化学反应,生成臭氧、氮氧化物等强氧化剂和腐蚀剂,对气体中的固体介质及金属电极造成损伤或腐蚀。为了有效地跟踪和监视高压电线,使用固定翼无人驾驶飞行器(下称“无人机”)无疑是一个非常好的选择,无人机上配备光学摄像设备、发射机、接收机、传感器、输入输出设备等。
本文的大部分研究都是在Matlab中进行的,通过分析飞机发送的每一幅图像来检测这幅图像中的高压电线,主要目的是为无人机创建一个Matlab命令从获取的图像中检测到高压线路,然后通过Radon变换来实现线路还原。
Radon变换(拉东变换),就是将数字图像矩阵在某一指定角度射线方向上做投影变换。这就是说,可以沿着任意角度θ来作Radon变换。Radon变换可以理解为图像在空间的投影,空间上的每一点对应(x,y)空间中的一条直线。Radon变换可以用于直线检测,针对非二值图像,灰度值高的线段会在P空间中形成亮点,而低灰度值的直线会在P空间中形成暗点[1]。
在图像变换中,Radon变换的实质就是计算图像矩阵在某个方向上的投影。投影函数为:
式中,δ是Delta函数[2]。
结合直线方程,则Delta函数可以表示为:
例如图像矩阵如果是二维的,在某个方向上的投影,就是在其垂直方向上的线积分。
事实上,Radon变换最常用的是其逆变换,因为一个物体的投影可以通过光线照射得到。如果我们能得到该物体不同方向上的投影,就可以对这些投影图像进行Radon逆变换,来重建其二维结构或三维结构。
Radon变换是如何从图像中检测到一条直线的?基于Radon变换的直线检测就是检测角度变化时出现的“局部峰值”,即可确定直线的方向,同时,峰值大小能够确定直线上点的个数,如图1所示。
图1 雷达检测平行线
图1 中两个图像显示,每个点都有相应的正弦曲线。在Radon平面上,如果检测到有更多的点共线,它们的正弦曲线相交于一点,那么它就是直线[3]。
Radon变换可以利用Matlab直接实现。首先将飞机上的光学传感器接收到的原始图像输入到Matlab中,之后需要将原始的图像转为灰度图像。利用Radon函数在消除摄像饱和度并保持亮度的情况下,将RGB图像转换为灰度图像。
Matlab中自带的Radon函数使用方法如下:
[R,x]=radon(F,theta)式中,F为待检测的图像,需为灰度图像;theta为检测的角度范围,通常取0:179;R为Radon变换的结果,是一个M×N的二维矩阵,M与x相等,是平行直线距离原点的距离(需结合原理理解),N是变换的角度范围,theta取0:179时,N为180。
变换后可对结果进行显示。进行Radon变换后,会得到一个二维矩阵,矩阵中峰值所在表征了原图中直线的信息,如图2所示,其中圈出的点表示峰值,只要检测出峰值所在的位置,就可以得到直线的位置信息。
峰值检测使用函数findpeaks(),由于该函数只能对一维向量进行检测,因此需事先对Radon变换结果进行处理:
J=reshape(R,M*N,1);
图2 Radon变换图像
[PKS,LOCS]=findpeaks(J,'THRESHOLD',6);
使用findpeaks()函数时,可以通过阈值控制检测结果的个数。其中LOCS会返回一维向量中峰值所在的位置,根据原矩阵大小,我们可以计算出相应的直线信息:
d=mod(LOCS(i),M)-(M-1)/2;
theta=fix(LOCS(i)/M);
从图像中检测出一条直线,下一步的任务就是根据直线信息将直线在原图中绘出。图2中显示了应用Radon变换的最终图像,我们可以看到在Radon变换矩阵中有很强的峰值,这些峰值的位置对应于原始图像中的直线位置。
在后续的研究当中,我们将尝试在采集图像的过程中添加适当的过滤器,以减少复杂的背景环境所造成的影响,只突出电力线路。我们还可以做的是使用Matlab编译器将Matlab代码转换为C++代码,翻译后的代码还可以编译成独立于Matlab运行的应用程序,或作为共享库与C++现有的任何一个应用程序相集成,也可通过Matlab引擎从C++程序中调用Matlab。