之前写过一个C++版本的二值图像连通区域标记函数,当时的直观结果没有问题,我也使用了很久,后来才发现其结果是错的,I'm so sorry!
这里贴出的是一个经过改进的二值图像连通区域标记函数,目前只支持4连通区域标记,要想做到8连通标记的话,最简单的方法是先用[1 1 1]的核对输入图像(的每一行)进行dilate。
较前一个版本的改进:(1)函数经过严格的测试,通过与Matlab连通区域标记结果的比较,确信可以输出正确的结果;(2)中间内存不再使用std::vector来动态申请,而是使用预申请的数组空间,效率更高(但是所需要的内存大小往往更大);(3)输出的标签图像中的数值是连续的(前一版本的标签数据是不连续的),可以很方便地进行后续操作,比如统计每个连通区域的面积。
#include <memory>
//Labling connected components in an image, where non-zero pixels are
// deemed as foreground, and will be labeled with an positive integer
// while background pixels will be labled with zeros.
//Input and output are 2D matrices of size h-by-w.
//Return maxLabel. Out