2013-12-11 149 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

一切看起来只是一个骨骼边界好的有点凌乱。