基于图的图像分割-工程源码
基于图的图像分割算法的作者提供了工程源码:Graph Based Image Segmentation
工程结构
工程结构如下:
1 | . |
关键元素解析
PPM
作者假定输入图像为PPM
格式,具体参考PPM文件解析
文件中得到的图像数据是一个一维行向量
image
图像数据类,保存图像长宽和字节数据
1 | template <class T> |
rgb
结构体rgb
保存单个彩色像素
1 | typedef struct { uchar r, g, b; } rgb; |
edge
结构体edge
保存边坐标和边权重
1 | typedef struct { |
构建边集时,创建一维edge
类型数组edges
,大小为width * height * 4
,保存当前顶点与右上、右中、右下和中下顶点
所连的边
uni_elt
结构体uni_elt
保存每个分量的秩(用于合并优化)、父指针以及分量大小
universe
类universe
实现并查集数据结构,初始化对象时输入分量个数,每个分量保存为eni_elt
,同时保存最终分量数目。利用路径压缩和按秩合并进行优化
并查集具体概念参考:[数据结构][图算法]并查集
关键函数解析
main
:入口程序,解析命令行参数(sigma/k/min_size/input_path/output_path
),完成图像分割loadPPM
:加载PPM
文件,返回image<rgb>
对象segment_image
:首先将彩色图像分离,分别进行高斯滤波,然后创建边集edges
,再调用segment_graph
函数进行分量合并,对返回的并查集对象u
再次进行分量合并,去除小分量影响,最后通过随机颜色对图像赋值smooth
:高斯过滤segment_graph
:Kruskal
算法实现,完成图像合并
示例
sigma=0.5, k=500, min_size=50