1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3
4 using namespace cv;
5 using namespace cv::ml;
6 using namespace std;
7
8 int main(int argc, char** argv)
14 namedWindow("input image", CV_WINDOW_AUTOSIZE);
15 imshow("input image", src);
16
17 // 初始化
18 int numCluster = 3;
19 const Scalar colors[] = ;
25
26 int width = srcols;
27 int height = src.rows;
28 int dims = srchannels();
29 int nsamples = width*height;
30 Mat points(nsamples, dims, CV_64FC1);
31 Mat labels;
32 Mat result = Mat::zeros(src.size(), CV_8UC3);
33
34 // 图像RGB像素数据转换为样本数据
35 int index = 0;
36 for (int row = 0; row < height; row++)
44 }
45
46 // EM Cluster Train
47 Ptr<EM> em_model = EM::create();
48 em_model>setClustersNumber(numCluster);
49 em_model>setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);//设置协方差矩阵
50 //设置停止条件,训练100次结束
51 em_model>setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));
52 em_model>trainEM(points, noArray(), labels, noArray());
53
54 // 对每个像素标记颜色与显示
55 Mat sample(dims, 1, CV_64FC1);
56 double time = getTickCount();
57 int r = 0, g = 0, b = 0;
58 for (int row = 0; row < height; row++)
80 }
81 printf("execution time(ms) : %.2f\n", (getTickCount() time)/getTickFrequency()*1000);
82 imshow("EMSegmentation", result);
83
84 waitKey(0);
85 return 0;
86 }
上一篇:ITK 实例4 OTSU算法对PNG图像进行多阈值二维分割
下一篇:ITK 实例13 ITK分水岭算法对PNG图像进行二维分割
OpenCV









