gSLicr:nfydream gSLICr: SLIC superpixels at over 250Hz (using cuda)
一般的SLIC算法在CPU上运行处理一张图片大概需要300ms
本算法只需要10ms;
主页
github代码
中心思想:K-mean, 先将每个cluster均匀分布, 然后对每个像素找最近的cluster, 然后更新每个cluster.最终的cluster就是超像素
代码解析
主类:
SLic_enegine
class core_engine
{
private:
seg_engine* slic_seg_engine;
public:
core_engine(const objects::settings& in_settings);
~core_engine();
// 图片分割函数
void Process_Frame(UChar4Image* in_img);
// 获取图片分割结果的函数
const IntImage * Get_Seg_Res();
// 在输出图片上画轮廓的函数
void Draw_Segmentation_Result(UChar4Image* out_img);
//把分割结果保存到一个图片中
void Write_Seg_Res_To_PGM(const char* fileName);
};
seg_engnie
class seg_engine
{
protected:
// normalizing distances
// 归一化距离
float max_color_dist; //颜色距离
float max_xy_dist; //像素点距离
// images
UChar4Image *source_img;
Float4Image *cvt_img;
IntImage *idx_img;
// superpixel map
// 超像素的地图
SpixelMap* spixel_map;
int spixel_size; //超像素大小
objects::settings gSLICr_settings; //slic设置
virtual void Cvt_Img_Space(UChar4Image* inimg, Float4Image* outimg, COLOR_SPACE color_space) = 0;
virtual void Init_Cluster_Centers() = 0;//初始化聚类中心
virtual void Find_Center_Association() = 0;
virtual void Update_Cluster_Center() = 0;//更新聚类中心
virtual void Enforce_Connectivity() = 0;//强制联通
public:
seg_engine(const objects::settings& in_settings );//通过setting结构体初始化
virtual ~seg_engine();
const IntImage* Get_Seg_Mask() const {
idx_img->UpdateHostFromDevice();
return idx_img;
};
void Perform_Segmentation(UChar4Image* in_img);
virtual void Draw_Segmentation_Result(UChar4Image* out_img){};
};