给定相同的二进制输入图像(直到反转),是否可以保证所有以下功能返回的图像中的标签都是一致的?
cv::distanceTransform()
(version with labels) cv::connectedComponents()
cv::connectedComponentsWithStats()
这是否出现在任何地方的文档中?
答案 0 :(得分:1)
如果相对于distanceTransform
或connectedComponents
传递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::NoOp
与connectedcomponents::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
在内部计算。