图分割-源码解析¶
工程结构¶
包含3个文件夹:
include:头文件samples:测试程序src:源文件
├── include
│ ├── graphsegment
│ │ ├── edge.h
│ │ ├── graphsegmentation.h
│ │ ├── graphsegmentationimpl.h
│ │ ├── point_set_element.h
│ │ └── point_set.h
│ └── segmentation.h
├── samples
│ ├── graphsegmentation_custom.cpp
│ ├── opencv
│ │ ├── graphsegmentation_demo.cpp
└── src
├── graphsegmentation.cpp
├── graphsegmentationimpl.cpp
└── point_set.cpp
类图¶

- 类
GraphSegmentation声明了图分割算法的公共函数 - 类
GraphSegmentationImpl定义了图分割算法的具体实现 - 类
Edge表示无向边 - 类
PointSetElement表示并查集元素 - 类
PointSet实现并查集操作
超参数¶
- \alpha:作用于高斯滤波,表示离散程度,值越大,滤波效果越明显
- k:用于计算阈值函数τ,控制两个分量之间的差异必须大于其内部差异的程度。值越大,表示分量间差异必须更大,最后得到的结果中会产生更大的分量(区域)。小图像的
k值小,大图像的k值大;k值越小越精细 min_size:设置最小分量大小
函数流程¶
main函数分3步实现
- 创建图分割对象,设置超参数。主要函数是
createGraphSegmentation - 进行图分割操作,获取结果图像。主要函数是
processImage - 对结果图像上色,得到分割结果。主要函数是
color_mapping
createGraphSegmentation¶
位于graphsegmentation.cpp,是一个辅助函数,用于创建GraphSegmentation对象,并设置初始参数
processImage¶
函数processImage实现了图分割操作,分6步实现

注意:在高斯滤波前需要转换图像精度,从uint8 -> 32F
最后得到的结果图像中,同一分量的像素点的值相同
color_mapping¶
由于结果图像的取值过小(比如共32个分量,那么取值为0-31),所以进行颜色转换,从HSV -> RGB,添加更丰富的颜色信息