2014-04-04 26 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