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

时间:2015-09-06 03:51:27

标签: image matlab image-processing image-segmentation

我有一张图片。我需要从图像中的每个对象中提取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);

1 个答案:

答案 0 :(得分:4)

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

使用bwfill图片,您可以非常有效地使用bsxfun。您可以使用times函数将掩码与原始图像中的每个通道相乘,以便仅保留掩码中非零的像素。使用bsxfun时,您需要确保您所乘的两个输入之间的数据类型是相同的类型,并且因为bwfilllogical,您需要将其转换为{在进行乘法之前{1}}。

BTW,我将直接从StackOverflow读取您的图像,以便结果可重现:

uint8

我们得到这张图片:

enter image description here

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

类似的东西:

%// 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);

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是您要显示的对象,从1到最多检测到的对象为imshow(objects{ii});

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

ii

enter image description here