我首先将此彩色图像转换为灰度图像,然后填充这些单元格中的孔。我在matlab中使用edge()函数来检测边缘。由于您可以观察到某些细胞的内部部分更轻,因此在一个细胞内检测到边缘。结果如下所示:
那么是否有任何方法只能检测到这些细胞的外边缘?
我的代码如下所示:
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);
答案 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
无法实现时填补这些轮廓。