找到区域和石头的中心

时间:2014-04-04 18:43:13

标签: matlab image-processing

我想找到这些石头的面积和中心。 但有些人找不到。 enter image description here

这是代码

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)

结果在这里: enter image description here

这是黑白图片; enter image description here 这些宝石中的一些不能分开。 有什么想法吗?

1 个答案:

答案 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();

enter image description here