1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3
4 using namespace cv;
5 using namespace std;
6
7 int main(int argc, char** argv)
13 namedWindow("input image", CV_WINDOW_AUTOSIZE);
14 imshow("input image", src);
15
16 Mat gray, binary, shifted;
17 //边缘保留(空间、颜色差值<21、51) 减少差异化
18 pyrMeanShiftFiltering(src, shifted, 21, 51);
19 imshow("shifted", shifted);
20
21 cvtColor(shifted, gray, COLOR_BGR2GRAY);//转换为灰度图像
22 //灰度图像进行二值化
23 threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
24 imshow("binary", binary);
25
26 // distance transform 距离变化
27 Mat dist;
28 distanceTransform(binary, dist, DistanceTypes::DIST_L2, 3, CV_32F);//使用3*3进行
29 normalize(dist, dist, 0, 1, NORM_MINMAX);
30 imshow("distance result", dist);
31
32 // binary
33 threshold(dist, dist, 0.4, 1, THRESH_BINARY);
34 imshow("distance binary", dist);
35
36 // markers 找到山峰的旗子
37 Mat dist_m;
38 distonvertTo(dist_m, CV_8U);
39 vector<vector<Point>> contours;
40 //寻找轮廓contours
41 findContours(dist_m, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
42
43 // create markers 填充轮廓
44 Mat markers = Mat::zeros(src.size(), CV_32SC1);
45 for (size_t t = 0; t < contours.size(); t++)
48 //左上角显示一个圆(可有可无)
49 circle(markers, Point(5, 5), 3, Scalar(255), 1);
50 //markers放大10000倍进行显示
51 imshow("markers", markers*10000);
52
53 // 形态学操作 彩色图像也可以,目的是去掉干扰,让结果更好
54 Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(1, 1));
55 morphologyEx(src, src, MORPH_ERODE, k);
56
57 // 完成分水岭变换
58 watershed(src, markers);
59 Mat mark = Mat::zeros(markers.size(), CV_8UC1);
60 markersonvertTo(mark, CV_8UC1);
61 bitwise_not(mark, mark, Mat());
62 //imshow("watershed result", mark);//中间是白色线进行分割
64 // generate rand color 生成随机颜色
65 vector<Vec3b> colors;
66 for (size_t i = 0; i < contours.size(); i++)
72
73 // 颜色填充与最终显示
74 Mat dst = Mat::zeros(markers.size(), CV_8UC3);
75 int index = 0;
76 for (int row = 0; row < markers.rows; row++) else
84 }
85 }
86
87 imshow("Final Result", dst);
88 printf("number of objects : %d\n", contours.size());
89
90 waitKey(0);
91 return 0;
92 }
上一篇:ITK 实例5 领域连接算法对脑部PNG图像进行二维分割
下一篇:ITK 实例14 快速步进算法对脑部PNG图像进行二维分割
OpenCV









