与窗口大小无关的图像滤波算法

         问题:一幅24位彩色图像,其上有一些红色区域。这些区域都是相连的。为了将图像中红色且相连的部分分离出来,使用如下算法:对单个像素进行判断,若满足R-10>G且R-10>B,那么就认为该像素呈红色。

         因为图像原因,可能在某个位置孤立的单个像素也满足上述条件。所以,既要考虑颜色因素又要考虑相邻因素。于是使用以下滤波算法:对于每个像素,取一个m×m的窗口,该像素位于窗口中心。对于该窗口内的所有像素,进行上述的条件判断。若该像素呈红色,则计数+1,否则不加。若最终累加结果超过窗口大小的1/2,那么就认为该像素满足条件。

 

         实践证明,上述滤波算法可以很好地将红色连续区域提取出来。但是,由于对每个像素都要进行一次窗口滤波,以100×100的图像为例,其中有10000个像素,若取滤波窗口为3,则窗口内像素有9个,要进行90000次比较。窗口若为9,则要进行810000次比较。其时间复杂度随窗口指数增加。因此窗口越大,其速度越慢。

 

         为了改善上述情形,采取以下方法:

①  构造一个跟图像像素一一对象的二维int数组,默认值为0。然后对图像的每个像素进行颜色判断,若呈红色,则将相应的int数组值设为1。

②  申请一个新的二维数组,其大小与原二维数组相同。对于原二维数组,对每一个值,将其左侧,包括自身在内的所有数进行累加,然后加上上侧相邻的数值,最后得出的结果设置在新二维数组对应的值中。这样,新的二维数组每个点的值就是其左上角区域中呈红色像素的总数。

③  滤波时,对新二维数组取一个窗口rect,其滤波值为:rect.RB –rectRT-rectLB+rectLT。这样,就可以求出窗口内红色像素的个数。

 

         使用上述滤波算法,其时间复杂度始终恒定,与窗口大小无关。

你可能感兴趣的:(理论基础,图形图像)