使用Canny边缘检测时,当轮廓没有被遮挡时,完成圆形轮廓边缘。

3
我希望将骨头区域进行二值化(使骨头区域为255,其他区域为0),但灰度级分布不够简单(下半部分较亮),无法找到一个阈值直接进行处理。因此,我认为如果能检测其完整轮廓并填充轮廓内的空隙可能是更容易的方法。
原始图像:

enter image description here

应用Canny边缘检测后:

enter image description here

我试图找到一种合理的方法来获取这些被遮挡的骨头轮廓,但是失败了。如果有什么建议,请告诉我。非常感谢。
我还需要处理两个骨头重叠在一起的问题。(我很抱歉一开始没有提到这个..)
我正在考虑如何分离一对重叠在一起的骨头: http://i.imgur.com/dI5s11L.png

最好在你的第二个问题上发起一个新帖子,关于如何分离重叠部分。这似乎与你原来的问题不同。 - lennon310
2个回答

1
考虑使用主动轮廓(蛇)
它通过同时考虑局部梯度和整体“平滑度”计算“模糊”边缘(此描述不太准确,仅是为了理解概念)。
在几个类似的情况下我尝试过并且取得了良好的结果。

1
这种方法对我来说并不是很熟悉,但我会去了解一下的。非常感谢。 - Chih-Cheng Peng

0

你的原始图像低对比度噪声比使得物体提取变得具有挑战性,因为阈值设置可能不适用于每个图像。但是我尝试在您当前的图像中提取骨骼。我的处理中应用了两个技巧:(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

除了一个骨骼边界有点混乱之外,其他都看起来不错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接