【问题标题】:Detecting black spots on image - Image Segmentation检测图像上的黑点 - 图像分割
【发布时间】:2023-03-08 03:24:01
【问题描述】:

我正在尝试使用 K-Means 聚类通过基于颜色的分割来分割图像。我已经创建了 3 个簇,簇号 3 是这样的图像:

这个集群有 3 种不同的颜色。我只想显示这张图片的黑点。我怎样才能做到这一点? 图片为 500x500x3 uint8。

【问题讨论】:

  • 你可以轻松地做这样的事情imshow(~all(img == 0, 3)))
  • 谢谢,这对您有帮助。以及如何计算图像的黑点数量?

标签: image matlab image-processing image-segmentation


【解决方案1】:

那些“空洞”看起来像是定义良好,RGB 值都设置为 0。为方便起见,将图像转换为灰度,然后对图像进行阈值处理,使任何小于 5 的强度都将输出设置为白色.我使用 5 的阈值来确保我们在考虑变化的情况下完整捕获对象像素。

完成后,您可以使用图像处理工具箱中的函数bwlabel(我假设您在处理图像时拥有它),其中第二个输出告诉您有多少不同的白色对象。

这样的事情可能会起作用:

im = imread('http://i.stack.imgur.com/buW8C.png');
im_gray = rgb2gray(im);
holes = im_gray < 5;
[~,count] = bwlabel(holes);

我直接从 StackOverflow 读取图像,将图像转换为灰度,然后确定任何强度小于 5 的二进制掩码,将输出设置为白色或true。一旦我们有了这个图像,我们就可以使用bwlabel 的第二个输出来确定有多少对象。

我明白了:

>> count

count =

    78

作为说明,如果我们显示出现孔的图像,我会得到:

>> imshow(holes);


不过,“漏洞”的数量有点误导。如果你专门看一下图像的右下角,会有一些不属于任何“洞”的嘈杂像素,所以我们应该将其过滤掉。因此,具有合适尺寸结构的简单形态开口滤波器将有助于去除虚假的噪声岛。因此,使用imopen 结合strel 来定义结构元素(我将选择一个正方形)以及结构元素的合适大小。之后,使用结构元素并过滤得到的图像,您可以使用此图像来计算对象的数量。

类似这样的:

%// Code the same as before
im = imread('http://i.stack.imgur.com/buW8C.png');
im_gray = rgb2gray(im);
holes = im_gray < 5;

%// Further processing
se = strel('square', 5);
holes_process = imopen(holes, se);

%// Back to where we started
[~,count] = bwlabel(holes_process);

我们得到以下对象数:

>> count

count =

    62

这似乎更现实一点。我现在得到了这张图片:

>> imshow(holes_process);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2022-01-08
    • 2021-05-16
    • 2013-10-31
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多