matlab:找到图片中对象的外边缘

时间:2013-12-06 21:27:40

标签: matlab edge-detection

我有一张含有血涂片的照片。我想要做的是检测那些细胞的边缘。 blood smear

我首先将此彩色图像转换为灰度图像,然后填充这些单元格中的孔。我在matlab中使用edge()函数来检测边缘。由于您可以观察到某些细胞的内部部分更轻,因此在一个细胞内检测到边缘。结果如下所示:edge detection result

那么是否有任何方法只能检测到这些细胞的外边缘?

我的代码如下所示:

I = imread('film02_pattern.jpg'); 
t1=graythresh(I);
k1=im2bw(I,t1);
k1=~k1;
se = strel('disk',1);
k1=imfill(k1,'holes');
imshow(k1);
k1=~k1;
bw = edge(k1,'canny',[],sqrt(2));
figure,imshow(bw);

1 个答案:

答案 0 :(得分:5)

要处理与图像边缘相交的轮廓,可以使用bwconncomp将背景与不可填充的轮廓分开。然后,代替edge,您只能通过bwperim获取外围,但这只是一种变体。

I = imread('asEW3.jpg');
t1=graythresh(I);
k1=im2bw(I,t1);
k1=~k1;
se = strel('disk',1);
k0=imfill(~k1,'holes');            % new
cc = bwconncomp(k0);               % new
k0(cc.PixelIdxList{1})=0;          % new
k1 = imfill(k1,'holes');
cellMask = k1 | k0;                % new
cellContours = bwperim(cellMask);  % new
cellContours2 = edge(cellMask,'canny',[],sqrt(2)); % new
k1=~k1;
bw = edge(k1,'canny',[],sqrt(2));
figure,imshow(bw); title('original')
figure,imshow(cellContours); title('new, bwperim()')
figure,imshow(cellContours2); title('new, edge()')

使用连接组件看起来有点像矫枉过正,但似乎没有更简单的方法来区分背景和碰到图像边缘的细胞中心,至少在imfill无法实现时填补这些轮廓。