2013-12-11 219 views
2

我想二值化骨骼區域(使骨骼區域爲255,其他區域爲0) 但灰度級分佈並不簡單足夠的(下半部分更亮)才能找到一個值並將其設置爲閾值。所以我認爲如果我能檢測到它的完整輪廓並填充這些輪廓內的空間可能是一種更簡單的方法。使用Canny邊緣檢測完成圓形輪廓邊緣並且輪廓未被遮擋

原圖:

enter image description here

應用Canny邊緣檢測後:

enter image description here

我試圖找到一個合理的方式來獲得骨頭閉塞的這些輪廓,但未能。如果有的話,請給我建議。非常感謝你。

我還需要處理如果兩塊骨頭重疊在一起的問題。 (我很抱歉,我沒有在很首位提到這一點..)

我在考慮我怎麼能分開一對骨頭重疊在一起: http://i.imgur.com/dI5s11L.png

+0

你最好在分離重疊的第二個問題上發起一個新帖子。它看起來與你原來的問題不同。 – lennon310

回答

1

考慮使用Active Contours (snakes)

它通過考慮局部梯度和總體「平滑度」來計算「模糊」邊緣(這種描述不是很準確,它只是爲了理解概念)

我在幾個類似的情況下嘗試過d取得了不錯的成績。

+1

這種方法對我來說不是很熟悉,但我會檢查一下。 非常感謝 –

0

原始圖像的低位Contrast to Noise Ratio使得對象提取的挑戰性增大,因爲閾值設置可能不會對每個圖像都有效。然而我試圖從你目前的身材中提取骨骼。在我的處理中應用了兩個技巧:(1)對圖像進行非線性變換以增強與背景相比低強度的骨骼; (2)在應用Canny邊緣檢測器之後,在可能的骨骼區域處在圖像邊界上填充零。見下面我的代碼:

I=rgb2gray(I); 

I=double(I); 
I=I.^0.6; % non linear transform before canny edge detector 
BW=edge(I,'canny'); 

%%% padding at the possible bone regions 
BW(1,BW(2,:)==1)=1; 
BW(end,BW(end-1,:)==1)=1; 
BW(BW(:,2)==1,1)=1; 
BW(BW(:,end-1)==1,end)=1; 

%%% padding in order to fill in the bone boundaries 
bw2=imfill(padarray(BW,size(BW),'symmetric'),'holes'); 
bw2=bw2(size(bw,1)+(1:size(bw,1)),size(bw,2)+(1:size(bw,2))); 

bw2=bwareaopen(bw2,200); % remove the too small regions 
MASK=I>10; % remove the background with very low intensity 
figure,imshow(bw2.*MASK) 

結果:

enter image description here

一切看起來只是一個骨骼邊界好的有點凌亂。