基于CUDA的遥感影像SLIC分割

来源:互联网 发布:淘宝试用报告草稿在哪 编辑:程序博客网 时间:2024/06/10 05:28

基于CUDA的遥感影像SLIC分割

SLIC算法原理

SLIC算法原理网上有很多帖子,这里就不展开了,推荐一个比较好的,感兴趣的可以看一下:
http://www.cnblogs.com/supersponge/p/6546082.html
官网:https://infoscience.epfl.ch/record/149300

基于CUDA的遥感影像SLIC分割

现有的高分遥感影像,空间分辨率高,具有更为清晰的轮廓、纹理信息,能够提取更为精确的地物信息。然而基于像素的特征无法的到更具自然含义的统计信息(特征的表达粒度不够),基于此的分类结果往往会出现椒盐噪声的现象,无法有效获取高分遥感影像中的地物信息。针对高分遥感影像信息提取,目前流行的是面向对象的方法,即先对遥感影像进行分割,得到分割对象,再提取地物信息。分割对象作为高分遥感影像信息提取的基本基元,相对于像素而言,粒度更大,能够描述更具有统计意义的自然信息(如空间上下文等),还能有效避免分类结果中的椒盐噪声现象。但其分割的结果通常受到噪声的影响、分割的尺度难以确定(自适应),现有的分割方法中还存在很大的问题。
以上只是说明高分遥感影像分割的必要性,而遥感影像因为巨大的数据量,分割算法的效率一般都比较低,基于GPU的并行是一种比较好的解决方法,可以极大的提高分割的效率。基于CUDA的并行计算,其关键在于核函数,而核函数的精髓则在于根据线程的序号来分配计算任务,让每一个线程都对应一个计算任务(像素),因此需要设计合适的并行策略,将遥感影像的所有像素,分配到每个线程上去(根据计算能力确定)。

并行策略设计

并行策略设计参考源码SLIC_CUDA

遥感影像SLIC分割并行策略:

线程格网的的宽度为超像素的个数,设置让每个线程块处理一个超像素,但超像素内像素数目可能大于线程块内允许的最大线程数,因此,一个超像素内像素可能由多个线程块完成,线程块数目与超像素宽度、线程块最大线程数以及超像素高度决定。



int h = maxThreadsPerBlock / SpxWidth;int nBlockPerClust = SpxHeight/h;dim3 blockPerGrid(num_Spx, nBlockPerClust);dim3 threadPerBlock(SpxWidth, std::min(SpxHeight, h));

线程块内线程结构:

每个线程块都对应一个超像素内的像素,要为每一个像素都分配其对应的类别。而SLIC算法每个像素都需要计算的聚类中心数为9个,线程块内部,先寻找到该线程块所有像素对应的9个聚类中心,聚类中心分别对象线程块左上角的9个像素的索引,然后计算像素到每个聚类中心的距离(一般是五维空间的距离),选择距离最小的聚类中心作为该点的标记。



遥感影像SLIC分割结果


这里写图片描述

原创粉丝点击