在OpenCV中标记图像

时间:2015-10-21 10:00:09

标签: opencv

给定相同的二进制输入图像(直到反转),是否可以保证所有以下功能返回的图像中的标签都是一致的?

这是否出现在任何地方的文档中?

1 个答案:

答案 0 :(得分:1)

如果相对于distanceTransformconnectedComponents传递connectedComponentsWithStats二进制图像反转,则标签的计算方式相同,将保持一致

我无法在文档中找到任何引用,但在所有情况下都会使用相同的算法(connectedComponents_sub1)计算标签。

<强> connectedComponents [WithStats]

int cv::connectedComponents(InputArray _img, OutputArray _labels, int connectivity, int ltype){
    const cv::Mat img = _img.getMat();
    _labels.create(img.size(), CV_MAT_DEPTH(ltype));
    cv::Mat labels = _labels.getMat();
    connectedcomponents::NoOp sop;
    if(ltype == CV_16U){
        return connectedComponents_sub1(img, labels, connectivity, sop);
    }else if(ltype == CV_32S){
        return connectedComponents_sub1(img, labels, connectivity, sop);
    }else{
        CV_Error(CV_StsUnsupportedFormat, "the type of labels must be 16u or 32s");
        return 0;
    }
}


int cv::connectedComponentsWithStats(InputArray _img, OutputArray _labels, OutputArray statsv,
                                     OutputArray centroids, int connectivity, int ltype)
{
    const cv::Mat img = _img.getMat();
    _labels.create(img.size(), CV_MAT_DEPTH(ltype));
    cv::Mat labels = _labels.getMat();
    connectedcomponents::CCStatsOp sop(statsv, centroids);
    if(ltype == CV_16U){
        return connectedComponents_sub1(img, labels, connectivity, sop);
    }else if(ltype == CV_32S){
        return connectedComponents_sub1(img, labels, connectivity, sop);
    }else{
        CV_Error(CV_StsUnsupportedFormat, "the type of labels must be 16u or 32s");
        return 0;
    }
}

如您所见,标签部分在两种情况下都由connectedComponents_sub1函数执行。两者之间的唯一区别是统计计算:connectedcomponents::NoOpconnectedcomponents::CCStatsOp,与标签计算无关。

<强> distanceTransform

void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labels,
                        int distType, int maskSize, int labelType )
{
    ...
    if( labelType == CV_DIST_LABEL_CCOMP )
    {
        Mat zpix = src == 0;
        connectedComponents(zpix, labels, 8, CV_32S);
    }
    ...
}

标签由函数connectedComponents在内部计算。