【问题标题】:matlab: find outer edges of objects in a picturematlab:查找图片中对象的外边缘
【发布时间】:2013-12-11 02:30:31
【问题描述】:

我有一张包含血涂片的图片。我想要做的是检测这些细胞的边缘。

我首先将此彩色图像转换为灰度图像,然后填充这些单元格中的孔。我使用 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);

【问题讨论】:

    标签: matlab edge-detection


    【解决方案1】:

    要处理与图像边缘相交的轮廓,可以使用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 无法填充时不会那些轮廓。

    【讨论】:

    • 你试过这个代码吗?我尝试了 bwperim(),但结果和以前一样。我认为图像填充完成后,填充部分的两侧可以视为周长。
    • @user1964417 我没有尝试您或我的代码,因为发布的图像似乎与原件不同。我明白为什么 imfill 不起作用 - 它不会将图像边界视为边缘。我稍后再看看。
    • 我认为 imfill() 不会填充附加图像边缘的圆圈。
    • @chappjc 是否有任何函数或代码的某些部分,以免你在精明的边缘计算封闭轮廓?
    猜你喜欢
    • 2017-08-08
    • 2012-06-22
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多