如何提取图像中对象的RGB值?

How to extract the RGB values of objects in an image?

我有一张图片。我需要从图像中的每个对象中提取 RGB 值。

图片如下:

为了提取每个物体的RGB值,我需要将图像转换为二进制,然后分割出每个物体。这会生成一个遮罩,告诉我物体在图像中的位置。

然而,一旦我分割出对象,我需要将蒙版转换回每个对象的原始颜色。

我该怎么做?

这是我写的代码:

img = imread('tr1.jpg');
abu=rgb2gray(img);
cb=imclearborder(abu);
thresh=graythresh(cb);
b=im2bw(cb,thresh);
bw=bwareaopen(b,60);
bwfill=imfill(bw,'holes');
label=bwlabel(bwfill,8);
max(max(label))
im1=(label==1);

如果我正确地解释了您的问题陈述,您的 bwfill 图像中存储了一个二进制掩码,并且您想使用二进制掩码提取原始颜色。具体来说,您想创建一个输出图像,其中黑色不是您想要的对象的一部分,任何非黑色都属于对象。

您可以使用 bwfill 图像非常有效地使用 bsxfun。您将使用 times 函数将蒙版与原始图像中的每个通道相乘,以便仅保留蒙版中非零的像素。对于 bsxfun,您需要确保要相乘的两个输入之间的数据类型相同,并且因为 bwfilllogical,您需要将其转换为 uint8 在做乘法之前。

顺便说一句,我将直接从 Whosebug 读取您的图像,以便结果可重现:

%// Change
img = imread('http://i.stack.imgur.com/mxmma.jpg');

%// Your code
abu=rgb2gray(img);
cb=imclearborder(abu);
thresh=graythresh(cb);
b=im2bw(cb,thresh);
bw=bwareaopen(b,60);
bwfill=imfill(bw,'holes');

%// New code starts here
out = bsxfun(@times, img, uint8(bwfill));

%// Show the image
imshow(out);

我们得到这张图片:


既然我知道你真正想要的是什么(你并没有真正说清楚......),我建议你对二进制图像本身使用 regionprops - 特别是使用 BoundingBox 属性,然后遍历每个边界框属性并从我上面定义的分割图像中提取出像素。但是,每个对象的大小都会不同,因此您应该将其放在元胞数组中。

类似于:

%// Apply regionprops to the binary mask
s = regionprops(bwfill, 'BoundingBox');

%// Create a cell array for the objects
objects = cell(numel(s), 1);

%// For each object...
for idx = 1 : numel(s)

    %// Get the bounding box property
    bb = floor(s(idx).BoundingBox);

    %// Extract out the object from the segmented image and place in cell array
    objects{idx} = out(bb(2):bb(2)+bb(4), bb(1):bb(1)+bb(3),:);
end

objects 包含分段对象。如果你想显示一个对象,只需做:

imshow(objects{ii});

ii 是您要显示的对象,从 1 到检测到的数量,即 numel(objects)

例如,如果我显示第一个对象,我们得到:

imshow(objects{1});