网络上关于中位切分算法的简述有很多,在这我也用自己的理解讲述一次,做一次学习的记录。这次可能会比较啰嗦。
一、明确目的:
这算法的最终目的是为了获取图像N个主题色。(如本例子是求出4个主题色)
二、核心流程:
第一步:rgb数组重新排序(目的为了第二步的切分做准备)
第二步:从排序后的的rgb数组一切为二(灵魂所在,为了让数组一分二,二分四,如此下去)
第三步:递归第一步和第二步
第四步:递归结束,计算切分后的N个数组的平均值或中位数
三、图示:
1)第一步,排序。(目的让相似但分散在各像素的颜色靠拢在一起)
排序的原理是根据rgb其中一个通道(后面会说怎样选出来)来重新排序。
我们首先要明白基础,rgb是一个数值,三个颜色通道,如红色0xff0000,可以表达(ff,00,00),图片是由多个像素组成,一个像素显示出一个rgb值。
每行像素首尾相连,形成一行长长的数组。
选出根据哪个颜色通道的排序,原理是比较rgb各自的长度,最长的通道为比较标准,如选出了红色通道red。
得出颜色比较标准后,重新排序
2)第二步,中位切分(目的是平均分成两半)
即将数组平均分成两半,假如该图片数组有400个数值,排序后,分成前半的200个为一组数组,后200个为另一个新数组。
3)第三步,递归第一步和第二步(目的是最终分成主题色数量一致的子数组)
如上例,新分出的两个数组(前200个,后200个),各自重复第一步的排序,排序后,又到第二步,中位切分,即200再分为前100个,后100个,这时就有4个数组,各自的大小为100。
一分二,二分四....递归到最后的子数组数量为主题色的数量就停止递归,如上图,我要求4个主题色,递归到4个子数组就结束 。
4)第四步,求出主题色
现在每个子数组就是一个主题色,求出各子数组的r、g、b平均值,然后合成新的颜色(也有人直接拿数组的中值)