我正在尝试使用K-Means聚类通过基于颜色的分割来分割图像。我已经创建了3个集群,集群号3就像这个图像:
此群集有3种不同的颜色。我只想显示这张图片的黑点。我怎样才能做到这一点? 图像为500x500x3 uint8。
答案 0 :(得分: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);
&#34;孔的数量&#34;虽然有点误导。如果你专门看一下图像的右下角,有一些嘈杂的像素不属于任何一个&#34;孔&#34;所以我们应该过滤掉它。因此,具有合适尺寸结构的简单形态开口过滤器将有助于去除虚假的嘈杂岛屿。因此,使用imopen
结合strel
来定义结构元素(I&#39;选择正方形)以及结构元素的合适大小。之后,使用结构元素并过滤生成的图像,您可以使用此图像计算对象的数量。
这样的事情:
%// 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);