2014-04-04 77 views
2

我想查找这些石头的区域和中心。 但其中一些找不到。 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

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

+2

我不能告诉你有多少石头有_by看picture_!我建议稍微侵蚀最后一张图像,但是你的问题是不明确的,IMO。 – chappjc

+0

一些石头已粘在一起,其中一些不够明亮,不能分开。我想知道如何分开它们, – siavash

+1

图像处理的圣杯:数数岩石。 – aardvarkk

回答

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

+0

我会试试这个,看看我能找到什么, 非常感谢 – siavash

+0

请记住这是在C++和OpenCV中完成的。然而,事后看过代码,你可以很容易地在MATLAB中重现这一点。 – rayryeng

+0

的确如此。我想这里的一个核心思想是开始考虑图像处理是从细分中心并行发生的,而不是依赖于扫描图像的某个过程。 – Vlad