模糊算法
智能算法
模糊算法属于智能算法,当我们对于系统的模型认识不是很深刻,或者说客观的原因导致我们无法对系统的控制模型进行深入研究的时候,智能算法常常能够起到的作用很小。这个时候就需要用到模糊算法,常见的模糊算法有均值模糊、高斯模糊等。
简介
实际上模糊算法属于智能算法,智能算法也可以叫非模型算法,也就是说,当我们对于系统的模型认识不是很深刻,或者说客观的原因导致我们无法对系统的控制模型进行深入研究的时候,智能算法常常能够起到不小的作用。这点是方便理解的,如果一个系统的模型可以轻易的获得,那么就可以根据系统的模型进行模型分析,设计出适合系统模型的控制器。但是现实世界中,可以说所有的系统都是非线性的,是不可预测的。但这并不是说我们就无从建立控制器,因为,大部分的系统在一定的条件和范围内是可以抽象成为线性系统的。问题的关键是,当我们系统设计的范围超出了线性的范围,我们又该如何处理。显然,智能算法是一条很不错的途径。智能算法包含了专家系统、模糊算法、遗传算法神经网络算法等。其实这其中的任何一种算法都可以跟PID去做结合,而选择的关键在于,处理的实时性能不能得到满足。当我们处理器的速度足够快速时,我们可以选择更为复杂的、精度更加高的算法。但是,控制器的处理速度限制了我们算法的选择。当然,成本是限制处理器速度最根本的原因。这个道理很简单,51单片机和DSP的成本肯定大不相同。专家PID和模糊PID是常用的两种PID选择方式。其实,模糊PID适应一般的控制系统是没有问题。
原理说明
模糊算法其实并不模糊。模糊算法其实也是逐次求精的过程。这里举个例子说明。我们设计一个倒立摆系统,假如摆针偏差<5°,我们说它的偏差比较“小”;摆针偏差在5°和10°之间,我们说它的偏差处于“中”的状态;当摆针偏差>10°的时候,我们说它的偏差有点儿“大”了。对于“小”、“中”、“大”这样的词汇来讲,他们是精确的表述,可问题是如果摆针偏差是3°呢,那么这是一种什么样的状态呢。我们可以用“很小”来表述它。如果是7°呢,可以说它是“中”偏“小”。那么如果到了80°呢,它的偏差可以说“非常大”。而我们调节的过程实际上就是让系统的偏差由非常“大”逐渐向非常“小”过度的过程。当然,我们系统这个调节过程是快速稳定的。通过上面的说明,可以认识到,其实对于每一种状态都可以划分到大、中、小三个状态当中去,只不过他们隶属的程度不太一样,比如6°隶属于小的程度可能是0.3,隶属于中的程度是0.7,隶属于大的程度是0。这里实际上是有一个问题的,就是这个隶属的程度怎么确定?这就要求我们去设计一个隶属函数。详细内容可以查阅相关的资料,这里没有办法那么详细的说明了。那么,知道了隶属度的问题,就可以根据目前隶属的程度来控制电机以多大的速度和方向转动了,当然,最终的控制量肯定要落实在控制电压上。这点可以很容易的想想,我们控制的目的就是让倒立摆从隶属“大”的程度为1的状态,调节到隶属“小”的程度为1的状态。当隶属大多一些的时候,我们就加快调节的速度,当隶属小多一些的时候,我们就减慢调节的速度,进行微调。可问题是,大、中、小的状态是汉字,怎么用数字表示,进而用程序代码表示呢?其实我们可以给大、中、小三个状态设定三个数字来表示,比如大表示用3表示,中用2表示,小用1表示。那么我们完全可以用1*0.3+2*0.7+3*0.0=1.7来表示它,当然这个公式也不一定是这样的,这个公式的设计是系统模糊化和精确化的一个过程,读者也可参见相关文献理解。但就1.7这个数字而言,可以说明,目前6°的角度偏差处于小和中之间,但是更偏向于中。我们就可以根据这个数字来调节电机的转动速度和时间了。当然,这个数字与电机转速的对应关系,也需要根据实际情况进行设计和调节。
示例
常见的模糊算法比如均值模糊、高斯模糊等其基本的过程都是计算一个像素周边的的某个领域内,相关像素的某个特征值的累加和及对应的权重,然后得到结果值。比如均值模糊的各像素的权重是一样的,而高斯模糊的权重和像素距离中心点的距离成高斯分布。这样的过程是无法区分出图像的边缘等信息的,导致被模糊后的图像细节严重丢失,一种简单的改进方式就是设置某个阈值,当领域像素和中心点像素的差距大于阈值时,设置其权重很小,甚至为0,这样对于本身比较平滑的区域,和原始的算法区别不大,而对于像素值变化较为明显的边缘地带,则能够有效地保留原始信息,这样就能起到降低噪音的同时保留边缘的信息。
在实际的处理,小半径的领域往往处理能力有限,处理的结果不慎理想,而随着半径的增加,算法的直接实现耗时成平方关系增长,传统的优化方式由于这个判断条件的增加,已经无法继续使用,为了解决速度问题,我们可以采用基于直方图算法的优化,如果能够统计出领域内的直方图信息,上述的判断条件及权重计算就可以简单的用下述代码实现:
void Calc(unsigned short *Hist, int Intensity, unsigned char *Pixel, int Threshold)
{
int K, Low, High, Sum = 0, Weight = 0;
Low = Intensity - Threshold; High = Intensity + Threshold;
if (Low < 0) Low = 0;
if (High > 255) High = 255;
for (K = Low; K <= High; K++)
{
Sum += Hist[K] * K;
Weight += Hist[K];
}
if (Weight != 0) *Pixel = Sum / Weight;
}
在任意半径局部直方图类算法在PC中快速实现的框架一文中我们已经实现了任意半径恒长时间的直方图信息的获取,因此算法的执行时间只于上for循环中的循环量有关,也就是取决于Threshold参数,当Threshold取得越大,则最终的效果就越接近标准的模糊算法(上述代码是接近均值模糊),而在实际有意义的算法应用中而只有Threshold往往要取得较小才有保边的意义,因此,计算量可以得到适度的控制。
如果要实现选择性的高斯模糊,则要在for循环中的权重项目中再乘以一个系数,当然这会增加一定的计算量。 我们选择了一些其他保边滤波器的测试图像进行了测试,在效果上通过调整参数能得到相当不错的效果,举例如下:
参考资料
最新修订时间:2024-10-16 15:12
目录
概述
简介
参考资料