【问题标题】:Find number of spots in a noisy image [closed]查找嘈杂图像中的点数[关闭]
【发布时间】:2015-11-23 18:11:56
【问题描述】:

我想自动计算此类图像中点彼此非常接近的点的数量,以便将许多点视为一个点:

我曾想过使用 MATLAB 的局部最大值函数/算法,例如 imregionalmaxima,但这会返回具有最大值的像素数(二进制矩阵中的像素数)。我只想测量黑色循环中包含的白点数量。

我也在这里找到了这个主题:How to count the number of spots in this image? 并使用了 ImageJ 软件。它无法检测到斑点,在我看来,它还可以检测到具有最大值的像素。

【问题讨论】:

    标签: image matlab image-processing imagej


    【解决方案1】:

    另一种计算图像中有多少白点的简单方法是首先将图像转换为黑白,去除白色边框,然后计算剩余的数量。使用bwlabel 并确定在第二个输出变量中看到的值。要清除白色边框,请使用imclearborder。顺便说一句,这假设您有图像处理工具箱:

    %// Read image directly from StackOverflow
    im = im2bw(imread('http://i.stack.imgur.com/9hU5O.png'));
    
    %// Remove white border surrounding image
    im = imclearborder(im);
    
    %// Count how many white spots there are
    [~,num] = bwlabel(im);
    

    我明白了:

    >> num
    
    num =
    
        18
    

    现在,在您的真实示例中,您有一些嘈杂的像素。有几种方法可以摆脱那些孤立的条纹。对我有用的是使用具有 5 x 5 方形结构元素的形态学开口。执行此操作后,这将删除任何面积小于 5 x 5 的嘈杂像素,并单独留下任何面积大于 5 x 5 形状的形状。结合使用 imopenstrel 来帮助您做到这一点:

    %// Read in the new image and convert to black and white
    im = im2bw(imread('http://i.stack.imgur.com/HCvAa.png'));
    
    %// Clear the border
    im = imclearborder(im);
    
    %// Define the structuring element
    se = strel('square', 5);
    
    %// Open the image
    out = imopen(im, se);
    
    %// Now count the objects
    [~,num] = bwlabel(out);
    

    我明白了:

    >> num
    
    num =
    
        18
    

    另外,如果你很好奇,清理后的图像是这样的:

    >> imshow(out);
    

    这个处理是在你发布的新图片上完成的,你可以看到由于打开操作而去除了嘈杂的白色像素。

    【讨论】:

    • imclearborder() 加一个!
    • 该算法适用于带有白点的黑色循环,但不适用于我现在上传的带有白噪声的循环。我如何计算斑点并忽略白噪声?该算法给出了 407 个对象
    • @tselios 你需要去除一些噪音。我会编辑我的帖子。如果您发布了一个您正在使用的真实示例,这将真正有所帮助。继续编辑我的答案很烦人。
    • @tselios 已编辑。看看吧。
    • @rayryeng 我也有一个案例,点彼此非常接近,因此被认为是软件中的一个。怎么能避免呢?在主要问题中添加了一个示例
    【解决方案2】:

    试试这个(需要图像处理工具箱):

    i = imread('9hU5O.png');
    bw = im2bw(i);
    cc = bwconncomp(imclearborder(bw), 4);
    

    另见here

    输出:

    cc = 
    
        Connectivity: 4
           ImageSize: [381 423]
          NumObjects: 18
        PixelIdxList: {1x18 cell}
    

    编辑:现在包括 rayryeng 的 imclearborder()。

    【讨论】:

    • 加 1 因为imclearborder 太:D
    【解决方案3】:

    您需要connected-component labeling 来完成此任务。

    在 ImageJ 中,这是使用 Analyze Particles 命令完成的。

    结果可以写入表格或显示为粒子轮廓。

    在处理真实图像时,最好在分割之前对图像进行预处理,例如消除噪音。如果这是不可能的,并且您的二值图像包含不完美的分割,您可以使用形态学操作(即腐蚀、扩张、打开、关闭)来丢弃细线和单个像素。以下 Javascript 可以帮助您入门。只需从script editor 运行它。

    importClass(Packages.ij.IJ);
    
    imp = IJ.openImage("http://i.stack.imgur.com/X8Bou.png");
    
    IJ.run(imp, "8-bit", "");
    IJ.run(imp, "Open", "");
    IJ.run(imp, "Watershed", "");
    
    IJ.run(imp, "Analyze Particles...", "size=50-1000 show=Outlines display exclude clear");
    imp.show();
    

    这是结果:

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多