這是首發... 使用circular Hough transform找到圓形部分。爲此,我最初threshold the image locally。
im=rgb2gray(imread('Ly7C8.png'));
imbw = thresholdLocally(im,[2 2]); % thresold localy with a 2x2 window
% preparing to find the circle
props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
[~,indexOfMax] = max([props.Area]);
approximateRadius = props(indexOfMax).MajorAxisLength/2;
radius=round(approximateRadius);%-1:approximateRadius+1);
%find the circle using Hough trans.
h = circle_hough(edge(imbw), radius,'same');
[~,maxIndex] = max(h(:));
[i,j,k] = ind2sub(size(h), maxIndex);
center.x = j; center.y = i;
figure;imagesc(im);imellipse(gca,[center.x-radius center.y-radius 2*radius 2*radius]);
title('Finding the circle using Hough Trans.');
只選擇有什麼圈內:
[y,x] = meshgrid(1:size(im,2),1:size(im,1));
z = (x-j).^2+(y-i).^2;
f = (z<=radius^2);
im=im.*uint8(f);
編輯:
找找通過查看啓動閾值圖像分割它的地方直方圖,找到它的第一個局部最大值,並從那裏迭代,直到找到2個單獨的段,使用bwlabel:
p=hist(im(im>0),1:255);
p=smooth(p,5);
[pks,locs] = findpeaks(p);
bw=bwlabel(im>locs(1));
i=0;
while numel(unique(bw))<3
bw=bwlabel(im>locs(1)+i);
i=i+1;
end
imagesc(bw);
中間部分現在可以通過從圓取出兩個標記的部分來獲得,並且剩下將成爲中央部(+一些的暈)
bw2=(bw<1.*f);
但一些中值濾波後,我們得到了更多的東西講理
bw2= medfilt2(medfilt2(bw2));
和我們一起獲得:
imagesc(bw+3*bw2);
最後一部分是真正的「快速和骯髒的」,我敢肯定,隨着這些工具,你已經使用過,你會得到更好的結果...
來源
2012-11-15 22:59:29
bla
它看起來像你有三峯直方圖。查看我在dsp.stackexchange.com上的答案 - > http://dsp.stackexchange.com/questions/3643/image-segmentation-issue-of-different-materials/3650#3650。無論如何,你的問題應該被移到該網站。 –
我試過基於直方圖的分割。這種方法的問題在於,最右側羣集周圍的像素值與最左側羣集的像素最相似,導致最右側羣集周圍出現「暈圈」。 – Richard
你有沒有試過bwboundaries,或者bwlabel?他們可能會爲你工作。但是如果光環效應太大,你可能得不到你想要的結果。儘管如此,通過一些操作和清理之前和之後,你可能會得到你想要的。它也可能有助於使用像[hough circles](http://www.mathworks.com/matlabcentral/fileexchange/26978-hough-transform-for-circles/content/html/circle_houghdemo.html)或其他方法[這一個](http://blogs.mathworks。com/pick/2008/05/23/detected-circles-in-an-image /),以便你知道你的圈子的界限。 – Bill