我想将骨骼区域二值化(使骨骼区域为255,其他区域为0) 但是灰度级分布不够简单(下半部分更亮)只能找到一个值和阈值。所以我想如果我能够检测到它的完整轮廓并填充这些轮廓内的空间可能是一种更简单的方法。
原始图片:
应用canny边缘检测后:
我试图找到一种合理的方法来使这些骨骼轮廓闭塞但失败了。如果有的话,请给我建议。非常感谢你。
我还需要处理如果有两个骨头重叠在一起的问题。 (我道歉,我最初没有提到这个......)
我正在考虑如何将一对骨头重叠在一起: http://i.imgur.com/dI5s11L.png
答案 0 :(得分:1)
答案 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)
结果:
一切看起来都不错,除了一个骨头边界有点乱。