超像素算法有很多,SLIC是效果比较好的一种,今天介绍SLIC算法。
SLIC算法与K-means有些类似。
主要步骤
- 将图像转换为CIE Lab颜色空间
- 初始化
k
个种子点(聚类中心),在图像上平均撒落k
个点,k
个点均匀的占满整幅图像。 - 对种子点在内的
n*n
(一般为3*3
)区域计算每个像素点梯度值,选择值最小(最平滑)的点作为新的种子点,这一步主要是为了防止种子点落在了轮廓边界上。 - 对种子点周围
2S*2S
的方形区域内的所有像素点计算距离度量(计算方法在后文),对于K-means算法是计算整张图的所有像素点,而SLIC得计算范围是2S*2S
,所以SLIC算法收敛速度很快!
其中S = sqrt(N/k)
,N
是图像像素个数。
- 因为图像上的每个像素点都可能被几个种子点计算距离度量,选择其中最小的距离度量对应的种子点作为其聚类中心。
距离度量
前文说了图像是要转换为Lab颜色空间的,现在提取此三个颜色通道l
、a
、b
,计算:
可以看到,距离度量有两部分,
dc
表示颜色度量,ds
表示距离度量,另外Ns = S = sqrt(N/k)
,Nc
用常数m
代替,m
在算法中可以调整,所以有:我们来分析一下这个变量
m
:
- 当
m
值比较大时,空间度量在距离测量过程中所占比重就比较大,那么生成的超像素比较紧凑。 - 当
m
值比较小时,颜色度量所占的比重就比较大,那么生成的超像素在边缘部分较为紧凑,但形状和大小不规则。
此外,灰度图像和三维图像的计算公式是:
所以,在SLIC算法中,有两个变量种子个数k
和m
,上张图看一下不同的k
和m
的分割效果。