SLIC:simple linear iterative clustering,即简单线性迭代聚类。
一、预处理,RGB转化为LAB
把RGB颜色空间的图片转换到XYZ,再从XYZ颜色空间转化为LAB颜色空间的图片。将L、a、b分量存储在SLIC类成员m_lvec, m_avec, m_bvec中。
二、SLIC超像素分割
1.初始化种子点。通过给定步长STEP得到所有种子点的L、a、b、三个分量(kseedsl、keedsa、keedsb)以及x、y两个坐标值(keedsx、kseedsy)。
2.扰动种子点。遍历种子点的八邻域,找到包括种子点在内的3×3的范围的最小梯度(颜色分量的梯度),如果不是种子点,则将最小值对应的像素点作为新的种子点,即扰动种子点,并更新其五维分量。 3.聚类。标签表klables初始化为-1,距离表distvec初始化为参数DBL_MAX。在以每个种子点为中心的2STEP×2STEP的范围内,遍历所有像素点,计算像素点与当前种子点的五维空间的欧氏距离,同时加入一个衡量两种距离重要性的度量系数m。如果计算出的结果小于距离表中的值,那么将当前种子点对应的标签值分配给对应像素点。将距离表中的值更新。
4.计算新的种子点,即聚类中心。计算聚类完成的每个超像素快中所有像素的l、a、b、x、y分量的和,储存在sigmal、sigmaa、sigmab、sigmax、sigmay中,然后除以像素个数,得到平均值,作为新的种子点及其分量。 5.迭代步骤3、4指定次数iteration。得到相对可靠的超像素分割
三、分割后处理
消除标签表中孤立的像素点,即在一片相同的标签群中存在的不同标签的像素点。根据面积判断,将空间上临近已被重新标记的像素点的新标签分配给孤立点。生成新标签表nlables。
四、绘制分割结果 遍历图片,如果在当前像素点的八邻域内存在与中心像素点的标签不一致的像素点,那么将当前中心像素点标记为白色轮廓,邻域内其它非轮廓的像素点作为黑色轮廓边线。
五、其它
SLIC类中图片存储为unsigned int,OpenCV中存储为unsigned char,在实际应用中需要进行两种格式的转化。SLIC.cpp、SLIC.h、Main.cpp在这。
参考
1.https://blog.csdn.net/electech6/article/details/45535203 2.https://blog.csdn.net/zhj_matlab/article/details/52986700 3.https://blog.csdn.net/zhj_matlab/article/details/52973723
|