Win10+VS2015+opencv3.4.x
demo源码:
//图形分割
void segment(Mat img) {
namedWindow("srcImg", 0);
imshow("srcImg", img);
int wid = img.cols;
int hig = img.rows;
int dim = img.channels();
int sampleCount = wid*hig;
int clusterCount = 3;
//颜色索引表
Scalar colorTab[5] = {
Scalar(0,255,255),
Scalar(0,255,0),
Scalar(255,0,0),
Scalar(255,0,255),
Scalar(255,255,0),
};
Mat points(sampleCount, dim, CV_32FC1, Scalar(10)); //sampleCount行,dim列
int index = 0;
//图像转数据点
for (int i=0;i(i, j);
points.at(index, 0) = static_cast(bgr[0]);
points.at(index, 1) = static_cast(bgr[1]);
points.at(index, 2) = static_cast(bgr[2]);
}
}
//EM
Mat lables;
Ptr em_model = EM::create();
em_model->setClustersNumber(clusterCount);
em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL); // 协方差矩阵
em_model->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));//停止条件
em_model->trainEM(points, noArray(), lables, noArray());
//结果点集转图像
Mat segImg = Mat::zeros(img.size(), img.type());
Mat sample(dim, 1, CV_32FC1);
for (int i=0;i(index, 0);
Scalar color = colorTab[lable];
Vec3b vec(colorTab[lable][0], colorTab[lable][1], colorTab[lable][2]);
segImg.at(i, j) = vec;
}
}
namedWindow("segmentation", 0);
imshow("segmentation", segImg);
waitKey(0);
}
速度有点儿慢。。。耐心等
图片来源:https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558871961266&di=287e6143f8bfdca5933a7509d126a24a&imgtype=0&src=http%3A%2F%2Ftva1.sinaimg.cn%2Fcrop.0.2.1242.1242.1024%2F73fe846fjw8f9yk2xee35j20yi0ym410.jpg
对比另一篇博客,使用opencv中K-Means方法进行基于像素值的图像分割和背景替换
https://blog.csdn.net/ganwenbo2011/article/details/90577122