【SLIC图像超像素分割算法解析】转载自http://blog.chinaunix.net/uid-29431466-id-4831314.html
1 概述
SLIC 即simple linear iterative clustering。分簇的依据是像素之间的颜色相似性与邻近性。其中颜色相
似性的度量因子是lab 颜色空间的L1 范数,颜色邻近性的度量因子是图像二维坐标空间xy。因而综合的度量因子
是[labxy]五维空间。下面所述的距离度量因子由下式计算得到:
文章图片
对输入的长宽分别为Width 和Height 的二维图像,分别以X 方向xstep 个像素和Y
方向ystep 个像素初始化簇块,得到BlockWidth*BlockHeight 个尺寸为xstep*ystep 的簇,其中BlockWidth =
Width/xstep,BlockHeight=Height/ystep。定义每个xstep*ystep 块内的中心坐标点为簇心,即种子坐标。各个
物理量的描述如下图所示:
文章图片
320*160 分辨率的图像分割初始化为20*10 个大小为16*16 的簇
算法思路是对种子坐标为中心的2S*2S(或者3S*3S,S 表示簇尺寸)范围内所有像素,求这些像
素到种子坐标像素的距离度量因子dist,相邻簇之间的重叠区域像素按照距离最小的种子编号(BlockIndex)标记。
整幅图像扫描一遍之后,每个像素点都对应一个BlockIndex,相同BlockIndex 的像素属于同一个簇。接下来进入
迭代,对上一次划分的每一个簇,求出每一个簇的labxy 均值,作为新的簇心(种子),按照上述规则重新标记,
当迭代一定次数之后,分簇结果基本不发生改变即划分完成,迭代结束。
迭代部分算法描述如下:
for Iter = 0:iter
初始化Width*Height 大小的距离度量因子矩阵。
for BlockIndex=0:num //num = BlockWidth * BlockHeight
对每个簇心周围2S*2S 范围内的像素分别与当前簇心五维向量求距离度量因子,并将此度量因子与初
始值比较,若比初始值小,则更新当前的度量因子,并将当前处理像素标记更新为当前簇号 Label[i*Width+j] = BlockIndex;
end //根据上述更新的簇心标记Label矩阵计算新的簇心(种子坐标)
for Block = 0 :num
for i=0:Height-1
for j=0:Width-1
对图像从头到尾扫描一遍,重新计算簇心坐标。根据上一步已经更新的标记。将同样标记的像素的labxy五维向量分别累加起来,然后根据各个标记的数量求出均值,便可以计算出新的总共num个簇心的五维向量。
end
end
end
end
这便是原始算法的实现方法。上述实现方法精度高,问题在于每一轮迭代必须对整幅图像进行操作,遍历整幅图像对于实时视频处理来说,带宽太高,因此考虑将上述实现方法改为每次处理3*BlockWidth行的方式,可将带宽降低BlockHeight/3倍。
文章图片
文章图片
推荐阅读
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 前沿论文|论文精读(Neural Architecture Search without Training)
- 深度学习|深度学习笔记总结
- 网络|简单聊聊压缩网络
- 计算机视觉|深度摄像头:一:深度了解深度摄像头
- opencv|网络爬虫入门练习
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- 卷积|吃透空洞卷积(Dilated Convolutions)