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){};
};
posted @ 2020-06-02 10:41  少年笔谈  阅读(256)  评论(0编辑  收藏  举报