我想找到这些石头的面积和中心。 但有些人找不到。
这是代码
I=imread('E:/2.png');
level = graythresh(I);
BW = im2bw(I,level);
se = strel('disk',2);
bw1 = imclose(BW,se);
bw1 = imfill(BW,'holes');
bwa=bwareaopen(bw1,25);
cc = bwconncomp(bwa)
stat = regionprops(cc,'centroid','Area');
ss=[stat.Area];
imshow(I); hold on;
for x = 1: numel(stat)
plot(stat(x).Centroid(1),stat(x).Centroid(2), 'wp','MarkerSize',6,'MarkerFaceColor','b');
end
figure, imshow(bwa)
结果在这里:
这是黑白图片; 这些宝石中的一些不能分开。 有什么想法吗?
答案 0 :(得分:2)
侵蚀宝石,直到您将它们分开,通过连接的组件(例如findContours)找到分段,设置中心,然后在原始BW图像的中心(侵蚀之前)应用洪水填充种子洪水,以优雅地定义分段。 “优雅地”意味着洪水不应“泄漏”到另一个(可能连接的)区段,因为它已经填充了不同的标签。您可能希望使用floodFIll的参数来调整细分。我没有时间这样做。
// separate stones
Mat Ibw = imread("bw.png", 0);
imshow("bw", Ibw);
int w=Ibw.cols, h=Ibw.rows;
int ERODE_SZ = 20;
Mat kernel = getStructuringElement( cv::MORPH_RECT, Size(ERODE_SZ, ERODE_SZ));
Mat Ierode;
erode(Ibw, Ierode, kernel);
imshow("erode", Ierode); imwrite("erode.png", Ierode);
vector<vector<Point> > contours;
Mat hierarchy;
Mat Icc = Ierode.clone();
findContours(Icc, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
// find centers
Mat Icenters = Ibw.clone();
int sz = contours.size();
vector<Point> centers(sz);
for (int i=0; i<sz; ++i) {
if (i==0)
centers[i] = Point2f(0.f, 0.f);
int area = contours[i].size();
for (int j=0; j<area; j++) {
centers[i]+=contours[i][j];
}
centers[i]*=1.0/area;
circle(Icenters, centers[i], 3, 100, 3);
}
imshow("centers", Icenters);imwrite("erode.png", Ierode);
// find segments
Mat Iseg = Ibw.clone();
RNG rng( 0xFFFFFFFF );
for (int i=0; i<sz; ++i) {
floodFill(Iseg, centers[i], rng.uniform(100, 200));
circle(Iseg, centers[i], 3, 0, 1);
}
imshow("seg", Iseg); imwrite("result.png", Iseg);
waitKey();