可靠地找到对象中的孔数

时间:2014-06-16 21:49:13

标签: image-processing image-segmentation morphological-analysis

我目前正在使用MATLAB的bweuler功能查找"孔的数量"在一个对象中。由于这些图像的分辨率相对较低,我有困难,目前只能达到50%的成功率。下面是一个失败的图像示例(为方便测试而裁剪):

failure image 1

标准化并按比例放大,以便您可以查看正在进行的操作:

这里的洞数应该是1,但是我还没有找到一种可靠的方法来限制这个小区域,同时保持周围环境的完好无损。

我当前的方法使用自适应阈值,但这是有问题的,因为正确的窗口大小在所有样本中不是恒定的。例如,此示例将使用窗口大小为6,但其他示例将失败。

作为参考,这里有几个失败案例:

N = 1 - > failure image 2

N = 2 - > enter image description here

我的当前方法处理的一些情况:

N = 6 - > success image 1

N = 1 - > success image 2

N = 1 - > success image 3

我也会发布我当前代码的简短版本,但正如我之前所说,我不相信自适应阈值处理方法会起作用。在此期间,我将使用其他一些形态分割方法。只需阅读其中一个测试图像并调用findholes(image)

function N = findholes(I)    
    bw = imclearborder(adaptivethreshold(I, 9));      
    N = abs(1 - bweuler(bw2, 4));
end

function bw=adaptivethreshold(IM,ws,C,tm)
    %ADAPTIVETHRESHOLD An adaptive thresholding algorithm that seperates the
    %foreground from the background with nonuniform illumination.
    %  bw=adaptivethreshold(IM,ws,C) outputs a binary image bw with the local 
    %   threshold mean-C or median-C to the image IM.
    %  ws is the local window size.
    %  C is a constant offset subtracted from the final input image to im2bw (range 0...1).
    %  tm is 0 or 1, a switch between mean and median. tm=0 mean(default); tm=1 median.
    %
    %  Contributed by Guanglei Xiong (xgl99@mails.tsinghua.edu.cn)
    %  at Tsinghua University, Beijing, China.
    %
    %  For more information, please see
    %  http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

    if (nargin < 2)
        error('You must provide IM and ws');
    end

    if (nargin<3)
        C = 0;
        tm = 0;
    end

    if (nargin==3)
        tm=0;
    elseif (tm~=0 && tm~=1)
        error('tm must be 0 or 1.');
    end

    IM=mat2gray(IM);

    if tm==0
        mIM=imfilter(IM,fspecial('average',ws),'replicate');
    else
        mIM=medfilt2(IM,[ws ws]);
    end
    sIM=mIM-IM-C;
    bw=im2bw(sIM,0);
    bw=imcomplement(bw);
end

0 个答案:

没有答案