IPCC Preliminary SLIC Analysis part2 : Run process

VScode Debug Run

Debug Process

  1. 创建lables来存储分类结果, m_spcount 200, m_compactness 10
  2. 计时运行 slic.PerformSLICO_ForGivenK(img, width, height, labels, numlabels, m_spcount, m_compactness);
    1. 参数的最后两项是required number of superpixels和weight given to spatial distance(空间距离的权重)也就是K=200
    2. 串行初始化赋值klabels[s] = -1
    3. DoRGBtoLABConversion(ubuff, m_lvec, m_avec, m_bvec);对于整个图像:重载的浮点版本
      1. 提取第一个像素rgb(229,226,218)
      2. 串行RGB2LAB( r, g, b, lvec[j], avec[j], bvec[j] );
      3. int变成double数组
    4. 声明perturbseeds true,edgemag
    5. DetectLabEdges(m_lvec, m_avec, m_bvec, m_width, m_height, edgemag);
      1. 串行对每个像素进行$$dx=(l[i-1]-l[i+1])^2+(a[i-1]-a[i+1])^2+(b[i-1]-b[i+1])^2$$$$dy=(l[i-width]-l[i+width])^2+(a[i-width]-a[i+width])^2+(b[i-width]-b[i+width])^2$$$$edgemag[i]=dx+dy$$为了之后计算6.5-PerturbSeeds
      2. 值得注意的是i的取值说2600 = width+1是第二行第二列,一直到倒数第二行倒数第二列
    6. GetLABXYSeeds_ForGivenK(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, K, perturbseeds, edgemag);
      1. int step = sqrt(double(sz)/double(K)); \(S=\sqrt{N/k}=225\)
      2. xoff 与 yoff 为一半 112
      3. int X = x*step + (xoff<<(r&0x1));六角网格???
      4. 串行对每个绿圈存了颜色坐标五元组在kseedsl/a/b/x/y 有196个中心
      5. PerturbSeeds(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, edgemag);
        1. 串行对这196个中心和周围8个位置进行,最小edgemag值的寻找。
        2. 并更新196个中心的位置
    7. int STEP = sqrt(double(sz)/double(K)) + 2.0;
    8. PerformSuperpixelSegmentation_VariableSandM(kseedsl,kseedsa,kseedsb,kseedsx,kseedsy,klabels,STEP,10);
      1. if(STEP < 10) offset = STEP*1.5;
      2. DBL_MAX ? doubel_max 1.7976931348623157e+308
      3. 变量sigma , distxy, maxxy
      4. double invxywt = 1.0/(STEP*STEP);
      5. 迭代10次
        1. 对中心聚类
          1. 串行对这196个中心首先划出[2S*2S]的区域(上下左右offset或者STEP)
          2. 再串行对这\(4S^2\)的区域的每个像素,计算与其区域中心的距离
            $$dist = \frac{(l-kl[n])^2+(a-ka[n])^2+(b-kb[n])^2}{maxlab[n]}+\frac{(x-kx[n])^2+(y-ky[n])^2}{S^2}$$
          3. 注意maxlab[n]初始值是10*10,根据dist更新该像素的距离中心的最小距离数组distvec,和指向的最近中心klable由于是2S*2S,相邻中心的周围区域是有一部分重叠的(如图中黄色荧光笔区域),相当于聚类到各个中心,注意由于中心对自己dist=0,是不可能某一中心距离其他中心更近。
        2. 串行将maxlab与maxlab更新为该聚类集合里的最大值
          1. 注意maxlab与maxlab都是每个中心维护一个
        3. 质心移动:串行将每个聚类区域的每个点的五元组加到质心上,然后除以聚类区域元素总数来得到新的质心五元组
        4. 迭代10次结束(其实可以判断质心是否不再移动来提前结束)
    9. EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels, K);
      1. 串行新数组赋值for( int i = 0; i < sz; i++ ) nlabels[i] = -1;全部标记为未处理
      2. 串行对所有元素进行如下处理
        1. 如果旧index未被处理
          1. 在其左下上右找到已经处理的元素的nlable,将其值保存在adjlable里
          2. 从该元素开始上下左右寻找未处理,而且其klabels值与旧klabels值相同的元素。
            1. 将其nlable值改为lable,应该也达到标记为已处理的效果
            2. 最终效果就是把该元素相邻连接区域klabels值与旧klabels值相同的全部标记
          3. 如果这块相邻区域过小count <= SUPSZ >> 2
            1. 则将其全部元素赋值为adjlable,即并入上块区域
        2. 旧index++。
        3. 最终效果就是所有的元素重新整合聚类,达到消除过小区域与不连续区域的效果
  3. 结果与check.ppm对比
    1. 我以为只要读取lable的分类,大概sz个int
    2. fread(rgb, (w)*(h)*3, 1, fp);
    3. 作者是傻逼,只用了1/3的空间

skills: size of arrays

1
a.size()

相关知识

RGB与Lab颜色空间互相转换

Lab颜色空间简介

同RGB颜色空间相比,Lab是一种不常用的色彩空间。1976年,经修改后被正式命名为CIELab。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。

RGB转Lab颜色空间

RGB颜色空间不能直接转换为Lab颜色空间,需要借助XYZ颜色空间,把RGB颜色空间转换到XYZ颜色空间,之后再把XYZ颜色空间转换到Lab颜色空间。

RGB与XYZ颜色空间有如下关系:

LAB与XYZ颜色空间有如下关系:


X,Y,Z会分别除以0.950456、1.0、1.088754。

需要进一步的研究学习

暂无

遇到的问题

暂无

参考文献

IPCC Preliminary SLIC Analysis part2 : Run process

http://icarus.shaojiemike.top/2021/07/12/Work/HPC/IPCC/ipcc4/

Author

Shaojie Tan

Posted on

2021-07-12

Updated on

2025-01-30

Licensed under