SLIC算法

合集下载

SLIC算法

SLIC算法

• 求点群中心的算法 • 1)Minkowski Distance公式——λ可以随意取值,可以是负数, 也可以是正数,或是无穷大。
• 2)Euclidean Distance公式——也就是第一个公式λ=2的情况 • 3)CityBlock Distance公式——也就是第一个公式λ=1的情况
• 这三个公式的求中心点有一些不一样的地方,我们看下图(对 于第一个λ在0-1之间)。
• • • • 4. 距离度量: 颜色距离和空间距离 dc代表颜色距离 ds代表空间距离
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
%迭代聚类处理 t1=clock; move=99999; for c=1:die %进行迭代die次 if move<10 break; end move=0; c1=zeros(ct); ct_x=zeros(ct); ct_y=zeros(ct); ct_l=zeros(ct); ct_a=zeros(ct); ct_b=zeros(ct); for i=1:ct for u=center(i,4)-s:center(i,4)+s if(u>=1)&&(u<=x(1)) for v=center(i,5)-s:center(i,5)+s if(v>=1)&&(v<=x(2)) dc=((lab_he(u,v,1)-center(i,1))^2+(lab_he(u,v,2)-center(i,2))^2+(lab_he(u,v,3)-center(i,3))^2)^0.5; ds=((u-center(i,4))^2+(v-center(i,5))^2)^0.5; d=((dc)^2+(ds*m/s)^2)^0.5;%计算距离 if d<dist(u,v) dist(u,v)=d; belong(u,v)=i; move=move+1; end end end end end end

苯环上羟基 去除方法

苯环上羟基 去除方法

苯环上羟基去除方法苯环上羟基去除方法是一种常见的有机合成技术,在有机化学领域具有广泛的应用。

本文将介绍几种常见的苯环上羟基去除方法,并详细阐述每种方法的步骤、优势和适用范围。

通过学习这些方法,读者将能够对苯环上羟基去除技术有进一步的了解和应用。

一、酸催化:酸催化是一种常见的苯环上羟基去除方法之一。

该方法利用酸催化剂将苯环上的羟基质子化,生成相应的酚质子并反应生成水。

酸催化剂可以是无机酸如硫酸、氢氯酸等,也可以是有机酸如三氯乙酸等。

下面以苯酚为例说明酸催化去羟基方法的步骤:步骤一:将苯酚溶解在有机溶剂中(如甲醇、乙醇),生成反应物溶液。

步骤二:加入适量的酸催化剂到反应物溶液中。

步骤三:在适当的温度下进行反应,常用的反应温度为室温至加热温度。

步骤四:反应结束后,将产物通过适当方法(如冷却结晶、溶剂萃取等)分离和提取。

酸催化去羟基方法的优势在于反应条件温和、反应时间短、操作简单,适用于大多数含羟基的有机化合物。

二、还原反应:还原反应是一种常见的苯环上羟基去除方法之一。

该方法利用还原剂将苯环上的羟基还原成相应的氢原子,并反应生成水。

常用的还原剂包括金属钠、锂铝氢化物等。

下面以苯酚为例说明还原反应的步骤:步骤一:将苯酚溶解在有机溶剂中(如乙醇、二甲基甲酰胺),生成反应物溶液。

步骤二:加入适量的还原剂到反应物溶液中。

步骤三:在适当的温度下进行反应,常用的反应温度为室温至加热温度。

步骤四:反应结束后,将产物通过适当方法(如冷却结晶、溶剂萃取等)分离和提取。

还原反应去羟基方法的优势在于选择性好、反应条件温和,适用于对选择性要求较高的去羟基反应。

三、氧化反应:氧化反应是一种常见的苯环上羟基去除方法之一。

该方法利用氧化剂将苯环上的羟基氧化成相应的羰基,生成酮或醛。

常用的氧化剂包括高锰酸钾、过氧化氢等。

下面以酚为例说明氧化反应的步骤:步骤一:将酚溶解在有机溶剂中(如苯、二甲基甲酰胺),生成反应物溶液。

步骤二:加入适量的氧化剂到反应物溶液中。

一种自适应产生超像素个数的道路图像分割算法

一种自适应产生超像素个数的道路图像分割算法

一种自适应产生超像素个数的道路图像分割算法李桂清;谢刚;谢新林【摘要】针对超像素分割算法需要人为设置初始超像素个数和目标边缘分割不精确等问题,提出一种自适应产生超像素个数的道路图像分割算法.该算法主要包含超像素的获得和超像素的合并两阶段.在超像素的获得阶段,首先通过计算图像区域数对应的图像颜色分量直方图峰值个数自动获得初始超像素个数,然后基于SLIC(simple linear iterative clustering)算法在图像过分割的基础上利用颜色分量最大差值对过分割超像素块进行欠分割检测与处理,实现超像素的精确分割.在超像素的合并阶段,通过融合超像素颜色和纹理特征建立超像素间相似度信息表,最后在结合空间位置相邻性的基础上实现超像素的合并.实验在自动驾驶场景评测数据集KITTI上对算法进行验证和测试.结果表明,提出的算法与其他道路图像分割算法相比,在总体精度、平均召回率以及F1值3个指标上均有较好的效果.【期刊名称】《科学技术与工程》【年(卷),期】2019(019)005【总页数】7页(P179-185)【关键词】图像处理;道路图像分割;超像素;区域合并【作者】李桂清;谢刚;谢新林【作者单位】太原理工大学电气与动力工程学院,太原030024;太原理工大学电气与动力工程学院,太原030024;太原科技大学电子信息工程学院 ,太原030024;太原理工大学电气与动力工程学院,太原030024【正文语种】中文【中图分类】TP391.41道路图像分割是指利用图像某些特性和图像处理技术将图像中的道路与非道路区域分割出来,其能够为车辆安全行驶以及车辆路径规划提供主要依据[1,2]。

在计算机视觉领域,道路图像分割作为一项关键技术,广泛应用于不同的领域,例如自动驾驶[3]、智能车技术以及机器人的自动导航系统。

近年来,学者们提出了很多道路图像分割方法。

传统的方法一般是基于像素的,图像预处理后对像素逐个分类,获得道路区域[4,5]。

图像超像素(superpixels)分割算法——简单线性迭代聚类(SLIC)

图像超像素(superpixels)分割算法——简单线性迭代聚类(SLIC)

图像超像素(superpixels)分割算法——简单线性迭代聚类(SLIC)原理 SILC(simple linear iterative clustering)是⼀种图像分割算法。

默认情况下,该算法的唯⼀参数是k,约等于超像素尺⼨的期望数量。

对于CIELAB彩⾊空间的图像,在相隔S像素上采样得到初始聚类中⼼。

为了产⽣⼤致相同尺⼨的超像素,格点的距离是S=√N/k。

中⼼需要被移到3x3领域内的最低梯度处,这样做是为了避免超像素中⼼在边缘和噪声点上。

接下来为每⼀个像素i设置最近的聚类中⼼,该聚类中⼼的搜索区域要覆盖该像素的位置。

这是本算法加速的关键,因为通过限制搜索区域的⼤⼩减⼩了距离计算的数量,并且相对于传统的k-means聚类算法有显著的速度优势,因为后者的每个像素都必须和所有的聚类中⼼进⾏⽐较。

⼀个超像素的预期空间范围是约为SxS的区域,这⾥对于相似像素的搜索是在超像素中⼼的2Sx2S区域完成。

⼀旦每个像素被关联到最近的聚类中⼼后,就通过求聚类中⼼所有像素的均值来执⾏聚类中⼼的更新。

使⽤L2范数计算前⼀个聚类中⼼和当前聚类中⼼的残差。

assignment和update步骤被重复迭代直到误差收敛,但是我们发现对于⼤多数图像10次迭代就够了。

算法步骤1)通过在常规⽹格步长S处采样像素来初始化聚类中⼼2)在3x3的领域内移动聚类中⼼到最低的梯度位置3)为每⼀个像素i设置标签l(i)4)为每⼀个像素设置距离d(i)=∞5)对于每⼀个聚类中⼼遍历2Sx2S区域内的每⼀个像素点,计算距离决定是否更新像素的标签和距离6)更新聚类中⼼7)重复步骤5)6)直到收敛Processing math: 100%。

SLIC算法范文

SLIC算法范文

SLIC算法范文SLIC(Simple Linear Iterative Clustering)算法是一种常用的超像素分割算法,用于将图像分割成具有相似属性的区域。

SLIC算法简单、高效,可以应用于各种计算机视觉和图像处理任务中。

本文将详细介绍SLIC算法的原理、步骤和应用。

一、SLIC算法原理SLIC算法的原理基于K-means聚类算法,其目标是将图像划分为尽可能均匀的超像素,即每个超像素内的像素具有相似的颜色和纹理特征。

SLIC算法的输入是一幅RGB彩色图像和所需的超像素数量,输出是一组超像素区域。

1.初始化:根据所需的超像素数量,确定每个超像素的大小。

通过均匀地放置一组初始种子点来初始化每个超像素的中心。

2.聚类:对于每个种子点,计算其周围一定范围内的像素与该种子点的相似度。

相似度可以根据像素之间的颜色差异、位置差异、纹理差异等来度量。

3.更新超像素中心:根据每个超像素内所有像素的位置和颜色信息,重新计算超像素的中心点。

4.重复步骤2和步骤3,直到达到迭代的停止条件。

停止条件可以是达到最大迭代次数或者超像素的中心点的变化量小于一个阈值。

5.合并边界:根据超像素的边界信息,将相邻的超像素进行合并,使得超像素区域更加连续。

二、SLIC算法优势1.超像素形状紧凑:通过限制超像素的均匀分布和大小,SLIC算法能够生成具有较紧凑形状的超像素区域。

2.保持边界信息:SLIC算法使用了像素之间的空间距离和颜色相似度来计算超像素中心,从而可以保持图像中的边界信息。

3. 快速计算:SLIC算法通过将图像转换为Lab颜色空间,从而减少了颜色相似度计算的复杂度,大大提高了算法的计算速度。

4.参数灵活:SLIC算法的参数设置灵活,可以根据实际需求来调整超像素的大小和数量。

三、SLIC算法应用1.图像分割:SLIC算法可以将图像划分为具有相似属性的区域,便于后续的目标检测、图像分析等任务。

2.物体识别:SLIC算法可以提取出具有显著性的超像素区域,用于物体的识别和跟踪。

SILC超像素分割算法详解(附Python代码)

SILC超像素分割算法详解(附Python代码)

SILC超像素分割算法详解(附Python代码)SILC算法详解⼀、原理介绍SLIC算法是simple linear iterative cluster的简称,该算法⽤来⽣成超像素(superpixel)算法步骤:已知⼀副图像⼤⼩M*N,可以从RGB空间转换为LAB空间,LAB颜⾊空间表现的颜⾊更全⾯假如预定义参数K,K为预⽣成的超像素数量,即预计将M*N⼤⼩的图像(像素数⽬即为M*N)分隔为K个超像素块,每个超像素块范围⼤⼩包含[(M*N)/K]个像素假设每个超像素区域长和宽都均匀分布的话,那么每个超像素块的长和宽均可定义为S,S=sqrt(M*N/K)遍历操作,将每个像素块的中⼼点的坐标(x,y)及其lab的值保存起来,加⼊到事先定义好的集合中每个像素块的中⼼点默认是(S/2,S/2)进⾏获取的,有可能落在噪⾳点或者像素边缘(所谓像素边缘,即指像素突变处,⽐如从⿊⾊过渡到⽩⾊的交界处),这⾥,利⽤差分⽅式进⾏梯度计算,调整中⼼点:算法中,使⽤中⼼点的8领域像素点,计算获得最⼩梯度值的像素点,并将其作为新的中⼼点,差分计算梯度的公式:Gradient(x,y)=dx(i,j) + dy(i,j);dx(i,j) = I(i+1,j) - I(i,j);dy(i,j) = I(i,j+1) - I(i,j);遍历现中⼼点的8领域像素点,将其中计算得到最⼩Gradient值的像素点作为新的中⼼点调整完中⼼点后即需要进⾏像素点的聚类操作通过聚类的⽅式迭代计算新的聚类中⼼;⾸先,需要借助K-means聚类算法,将像素点进⾏归类,通过变换的欧⽒聚距离公式进⾏,公式如下(同时参考像素值和坐标值提取相似度):通过两个参数m和S来协调两种距离的⽐例分配。

参数S即是上⾯第③步计算得出的每个像素块的长度值,⽽参数M为LAB空间的距离可能最⼤值,其可取的范围建议为[1,40]为了节省时间,只遍历每个超像素块中⼼点周边的2S*2S区域内的像素点,计算该区域内每个像素点距离哪⼀个超像素块的中⼼点最近,并将其划分到其中;完成⼀次迭代后,重新计算每个超像素块的中⼼点坐标,并重新进⾏迭⼆、代码实现1import math2from skimage import io, color3import numpy as np45class Cluster(object):67 cluster_index = 189def__init__(self, row, col, l=0, a=0, b=0):10 self.update(row, col, l, a, b)11 self.pixels = []12 self.no = self.cluster_index13 Cluster.cluster_index += 11415def update(self, row, col, l, a, b):16 self.row = row17 self.col = col18 self.l = l19 self.a = a20 self.b = b212223class SLICProcessor(object):24 @staticmethod25def open_image(path):26 rgb = io.imread(path)27 lab_arr = color.rgb2lab(rgb)28return lab_arr2930 @staticmethod31def save_lab_image(path, lab_arr):32 rgb_arr = b2rgb(lab_arr)33 io.imsave(path, rgb_arr)3435def make_cluster(self, row, col):36 row=int(row)37 col=int(col)38return Cluster(row, col,39 self.data[row][col][0],40 self.data[row][col][1],41 self.data[row][col][2])4243def__init__(self, filename, K, M):44 self.K = K45 self.M = M4647 self.data = self.open_image(filename)48 self.rows = self.data.shape[0]49 self.cols = self.data.shape[1]50 self.N = self.rows * self.cols51 self.S = int(math.sqrt(self.N / self.K))5253 self.clusters = []54 bel = {}55 self.dis = np.full((self.rows, self.cols), np.inf)5657def init_clusters(self):58 row = self.S / 259 col = self.S / 260while row < self.rows:61while col < self.cols:62 self.clusters.append(self.make_cluster(row, col))63 col+= self.S64 col = self.S / 265 row += self.S6667def get_gradient(self, row, col):68if col + 1 >= self.cols:69 col = self.cols - 270if row + 1 >= self.rows:71 row = self.rows - 27273 gradient = (self.data[row + 1][col][0] +self.data[row][col+1][0]-2*self.data[row][col][0])+ \74 (self.data[row + 1][col][1] +self.data[row][col+1][1]-2*self.data[row][col][1]) + \75 (self.data[row + 1][col][2] +self.data[row][col+1][2]-2*self.data[row][col][2])7677return gradient7879def move_clusters(self):80for cluster in self.clusters:81 cluster_gradient = self.get_gradient(cluster.row, cluster.col)82for dh in range(-1, 2):83for dw in range(-1, 2):84 _row = cluster.row + dh85 _col = cluster.col + dw86 new_gradient = self.get_gradient(_row, _col)87if new_gradient < cluster_gradient:88 cluster.update(_row, _col, self.data[_row][_col][0], self.data[_row][_col][1], self.data[_row][_col][2])89 cluster_gradient = new_gradient9091def assignment(self):92for cluster in self.clusters:93for h in range(cluster.row - 2 * self.S, cluster.row + 2 * self.S):94if h < 0 or h >= self.rows: continue95for w in range(cluster.col - 2 * self.S, cluster.col + 2 * self.S):96if w < 0 or w >= self.cols: continue97 L, A, B = self.data[h][w]98 Dc = math.sqrt(99 math.pow(L - cluster.l, 2) +100 math.pow(A - cluster.a, 2) +101 math.pow(B - cluster.b, 2))102 Ds = math.sqrt(103 math.pow(h - cluster.row, 2) +104 math.pow(w - cluster.col, 2))105 D = math.sqrt(math.pow(Dc / self.M, 2) + math.pow(Ds / self.S, 2))106if D < self.dis[h][w]:107if (h, w) not in bel:108 bel[(h, w)] = cluster109 cluster.pixels.append((h, w))110else:111 bel[(h, w)].pixels.remove((h, w))112 bel[(h, w)] = cluster113 cluster.pixels.append((h, w))114 self.dis[h][w] = D115116def update_cluster(self):117for cluster in self.clusters:118 sum_h = sum_w = number = 0119for p in cluster.pixels:120 sum_h += p[0]121 sum_w += p[1]122 number += 1123 _h =int( sum_h / number)124 _w =int( sum_w / number)125 cluster.update(_h, _w, self.data[_h][_w][0], self.data[_h][_w][1], self.data[_h][_w][2])126127def save_current_image(self, name):128 image_arr = np.copy(self.data)129for cluster in self.clusters:130for p in cluster.pixels:131 image_arr[p[0]][p[1]][0] = cluster.l132 image_arr[p[0]][p[1]][1] = cluster.a133 image_arr[p[0]][p[1]][2] = cluster.b134 image_arr[cluster.row][cluster.col][0] = 0135 image_arr[cluster.row][cluster.col][1] = 0136 image_arr[cluster.row][cluster.col][2] = 0137 self.save_lab_image(name, image_arr)138139def iterates(self):140 self.init_clusters()141 self.move_clusters()142#考虑到效率和效果,折中选择迭代10次143for i in range(10):144 self.assignment()145 self.update_cluster()146 self.save_current_image("output.jpg")147148149if__name__ == '__main__':150 p = SLICProcessor('beauty.jpg', 200, 40)151 p.iterates()三、运⾏效果截图(原图)(效果图)代码参考了https:///laixintao/slic-python-implementation,且做了改进作为⼀枚技术⼩⽩,写这篇笔记的时候参考了很多博客论⽂,在这⾥表⽰感谢,转载请注明出处......。

SLIC算法

SLIC算法

• %聚类后图像网格显示 • hehe=uint8(hehe); • figure(1) • imshow(he), title('原始图像');%显示图像 • figure(20) • imshow(hehe), title('SLIC分割k=400,m=40') • etime(t2,t1)
if belong(i,j+1)~=belong(i,j) hehe(i,j,1)=color(1); hehe(i,j,2)=color(2); hehe(i,j,3)=color(3); b=1;
end elseif ((i+1)<=x(1))&&((j-1)>=1)
if belong(i+1,j-1)~=belong(i,j) hehe(i,j,1)=color(1); hehe(i,j,2)=color(2); hehe(i,j,3)=color(3); b=1;
end if belong(i+1,j)~=belong(i,j)
hehe(i,j,1)=color(1); hehe(i,j,2)=color(2); hehe(i,j,3)=color(3); b=1; end elseif ((i+1)<=x(1))&&((j+1)<=x(2)) if belong(i+1,j+1)~=belong(i,j) hehe(i,j,1)=color(1); hehe(i,j,2)=color(2); hehe(i,j,3)=color(3); b=1; end

elseif cc(1)-1>=1

belong(rr(g),cc(g))=belong(rr(1),cc(1)-1);

儿科用药的计算方法

儿科用药的计算方法

儿科用药的计算方法儿科用药是指针对儿童临床需求,根据年龄、体重、病情等因素,合理计算给药剂量的过程。

由于儿童的生理特点与成人存在差异,精确计算儿科用药剂量十分重要,以确保药物达到预期疗效并保障患儿的安全性。

本文将详细介绍儿科用药的计算方法,帮助医务工作者更好地应对儿科用药挑战。

一、根据年龄划分药物剂量1. 婴幼儿期(0-1岁):婴儿期的用药剂量主要根据体重来计算。

常用的公式包括体重(kg)× 给药剂量(mg/kg)= 婴幼儿剂量(mg)或体重(kg)× 给药剂量(mg/kg)× 体表面积修正系数= 婴幼儿剂量(mg)。

另外,有些药物的剂量会根据婴儿的实际出生天数进行调整,如早产儿及新生儿等。

2. 幼儿期(1-3岁):幼儿时期的用药剂量一般是根据体重进行计算的。

可以使用与婴幼儿相同的公式来计算幼儿的给药剂量,即体重(kg)×给药剂量(mg/kg)=幼儿剂量(mg)。

此外,根据儿童年龄和发育情况,不同药物可能具有不同的用药评估方法。

3. 学龄前儿童(3-6岁):在学龄前儿童时期,用药剂量仍是根据体重计算。

常用的计算公式为体重(kg)× 给药剂量(mg/kg)= 学龄前儿童剂量(mg)。

4. 学龄儿童(6-12岁):学龄儿童的用药剂量可以根据体重或体表面积来计算。

计算公式包括体重(kg)× 给药剂量(mg/kg)= 学龄儿童剂量(mg)或体表面积(m²)× 给药剂量(mg/m²)= 学龄儿童剂量(mg)。

在特殊情况下,还需根据儿童的生理和药物代谢特征来调整剂量。

5. 青少年期(12-18岁):青少年期的用药剂量可以采用成人剂量,具体剂量还需考虑患者的生理特点、年龄和发育情况等。

二、根据体表面积调整药物剂量1. 什么是体表面积(BSA)?体表面积是指一个人体的外表面积,根据身高和体重可以计算得出。

计算BSA的公式有多种,其中常用的有Du Bois' 和Haycock'公式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel)。

SLIC的思想是将彩色图像转化为CIELAB颜色空间和XY坐标下的5维特征向量(Lab模式也是由三个通道组成,第一个通道是明度,即“L”。

a通道的颜色是从红色到深绿;b通道则是从蓝色到黄色。

),然后对5维特征向量构造度量标准,对图像像素进行局部聚类的过程。

该算法速度较快,能生成紧凑、近似均匀的超像素。

1 、SLIC超像素分割的步骤[java] view plain copyfunction [sp_img,disp_img] = DemoSLICSuperpixel (img,K,M)% img: original rgb image% K: number of superpixel 超像素的个数% M: compactness of superpixel 紧凑性tic;[X,Y,L,A,B,Lab_img,STEP] = GetLABXYSeeds(img,K); %初始化种子点并提取种子的XYLab 特征EdgeMap = DetectLabEdges(Lab_img); %为了避免边缘位置的干扰,还要考虑边缘剩余[X,Y,L,A,B] = PeturbSeeds (EdgeMap,Lab_img,X,Y,L,A,B); %产生新的XYLab种子labels = PerformSLICSuperpixel(X,Y,L,A,B,Lab_img,STEP,M); %<span style="font-family: Arial, Helvetica, sans-serif;">根据元素与种子点的相似度关系进行聚类,并添加标签</span>sp_img = EnforceLabelConnectivity(labels,K); %合并较小的聚类disp_img = DrawContour(img,sp_img); %超像素边界2 、初始化种子点并提取XYLab特征输入m*n的图像,将图像分成k'个超像素。

则:每个超像素的大小为:size = m*n/k size:面积超像素大小一样?两个种子点的距离为:step = sqrt(size)每个超像素在x方向上的像素个数为m/setp每个超像素在x方向上的像素个数为n/setp为了避免边缘位置的干扰,还要考虑边缘剩余3、产生新的XYLab种子为了避免种子点处理图像的边缘位置,对以后的聚类工程造成干扰,需要将种子点以它为中心的3*3的窗口内移动到梯度最小的位置,产生新的种子点计算这K个超像素里所有像素点的平均向量值,重新得到K个聚类中心,4 、根据像素之间的相似度进行聚类对每个像素点,分别计算与之距离最近的种子点之间的相似程度,将最相似种子点的标签赋给该像素。

通过不断迭代该过程,直到收敛(在程序中迭代了十次)相似度的衡量关系如下程序中,其其中,第一项为像素点间的颜色差异,第二项为像素点间的空间距离,第三项为两个像素的想速度。

S为种子点的距离,m为平衡参数,用来衡量颜色值和空间信息在相似度衡量中的比重1.0/(double(STEP)/M)^2;以下内容是上面的C详细版,大概看划线的就行基本思想算法大致思想是这样的,将图像从RGB颜色空间转换到CIE-Lab颜色空间,对应每个像素的(L,a,b)颜色值和(x,y)坐标组成一个5维向量V[L,a,b,x,y],两个像素的相似性即可由它们的向量距离来度量,距离越大,相似性越小。

算法首先生成K个种子点,然后在每个种子点的周围空间里搜索距离该种子点最近的若干像素,将他们归为与该种子点一类,直到所有像素点都归类完毕。

然后计算这K个超像素里所有像素点的平均向量值,重新得到K个聚类中心,然后再以这K个中心去搜索其周围与其最为相似的若干像素,所有像素都归类完后重新得到K个超像素,更新聚类中心,再次迭代,如此反复直到收敛。

怎么样,是不是感觉很像K-means聚类算法。

该算法接受一个参数K,用于指定生成的超像素数目。

设原图有N个像素,则分割后每块超像素大致有N/K个像素,每块超像素的边长大致为S=[N/K]^0.5,开始我们每隔S个像素取一个聚类中心,然后以这个聚类中心的周围2S*2S为其搜索空间,与其最为相似的若干点即在此空间中搜寻。

算法可能遇到的问题及解决办法:1、为了避免所选的聚类中心是边缘和噪声这样的不合理点,算法做了改进,在3*3的窗口中将聚类中心移动到梯度最小的区域,梯度定义为G(x,y)=[V(x+1,y)-V(x-1,y)]^2+[V(x,y+1)-V(x,y-1)]^2这样就可以避免上面所说的情况。

2、L,a,b的大小有限制,而图像尺寸则没有限制,如果图片的尺寸比较大,会造成衡量向量距离时空间距离(x,y)的影响过大,需要调制空间距离(x,y)的影响,所以需要对x,y进行normalize。

改进向量距离的度量如下:d_lab=[(Lk-Li)^2+(ak-ai)^2+(bk-bi)^2]^0.5d_xy=[(Xi-Xk)^2+(Yk-Yi)^2]^0.5Ds=d_lab+(m/S)*d_xym用来调整d_xy的权值,一般为1-20,在算法中设置为10。

3、最后可能出现一些小的区域d被标记为归属某一块超像素但却与这块超像素没有连接,需要把这块小区域d重新归类为与这块小区域d连接的最大的超像素中去,以保证每块超像素的完整。

算法流程1.主程序入口下面的程序就是超像素生成的函数入口:slic.DoSuperpixelSegmentation_ForGivenNumberOfSuperpixels(img, width, height, labels, numlabels, m_spcount, m_compactness);这里有几个特别的参数需要说明:slic:SLIC slic; 是一个SLIC类labels:int* labels = new int[sz];一张标签图,和图像大小一致,用于标记每个像素的标签值;sz=width*height,即一张图像的像素总数。

numlabels:int numlabels(0);是图像最终分成的类数,即最终生成的超像素个数,在这里被初始化为0。

m_spcount: 是客户从界面输入的值,即初始化的种子个数,但是SLIC算法中不一定每个种子最终都能得一个超像素,由于某些因素可能被其他超像素合并。

若种子数不符合规定,则通过(总像素值SZ)/(每个超像素默认大小200)获得种子数:if (m_spcount < 20 || m_spcount > sz/4) m_spcount = sz/200;m_compactness:if(m_compactness < 1.0 || m_compactness > 80.0) m_compactness = 20.0;这个值也是有用户设定的,是颜色特征和XY坐标特征之间的紧密度比例,20这个值效果往往不错。

该函数的定义:void SLIC::DoSuperpixelSegmentation_ForGivenNumberOfSuperpixels(unsigned int * ubuff,//imgconst int width,const int height,int*& klabels,//labelsint& numlabels, //const int & K,//初始化的种子数m_spcountconst double & compactnes)//m_compactness空间参数转换的权重值{const int superpixelsize = 0.5+double(width*height)/ double(K);DoSuperpixelSegmentation_ForGivenSuperpixelSize(ubuff,width,height,klabels,numlabels,superpixel size,compactness);}superpixelsize:超像素的大小,即每个超像素中包含的像素值DoSuperpixelSegmentation_ForGivenSuperpixelSize函数中完成了超像素生成的功能const int STEP = sqrt(double(superpixelsize))+0.5;这个变量很关键,是种子点的跨度。

2.子程序流程在DoSuperpixelSegmentation_ForGivenSuperpixelSize函数中主要包含以下函数:DoRGBtoLABConversion(ubuff, m_lvec, m_avec, m_bvec); 将RGB图像转换为LAB图像。

GetLABXYSeeds_ForGivenStepSize(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy,STEP,perturbseeds,edgemag);均匀分布种子点,将种子点的5维特征值LABXY作为分类的中心点特征值存入kseeds向量中。

PerformSuperpixelSLIC(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, klabels, STEP,edgemag,compactness);对整张图像进行局部的K-Means聚类,生成超像素。

这是超像素生成的关键步骤,也耗时最多。

EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels,double(sz)/double(STEP*STEP));对生成的初步超像素图像,进行合并孤立超像素,某些孤点像素与大小过小的超像素被合并到附近的超像素中。

3.关键程序解析:这里只讲PerformSuperpixelSLIC与EnforceLabelConnectivity PerformSuperpixelSLIC:(1)核心就是局部的K-Means聚类局部顾名思义,就是只对种子点附近的像素进行聚类,这里种子是按照STEP=S的跨度分布的,稍微扩大一点聚类范围,选为边长为2S矩形。

(2)特征值计算上面即像素到种子点的“距离”计算,距离中包括了LABXY5个特征值。

方法就是,在局部区域内对每个像素点求其到中心的距离,若小于以前存放的距离,则将距离更新,且更新该像素点的类别标签。

(3)种子点特征值更新上部分程序,将超像素中的特征值加在一起。

相关文档
最新文档