我有一张图片。我需要从图像中的每个对象中提取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);
答案 0 :(得分:4)
如果我正确解释您的问题陈述,您的bwfill
图像中存储了二进制掩码,并且您希望使用二进制掩码提取原始颜色。具体来说,您要创建一个输出图像,其中黑色不是您想要的对象的一部分,而非黑色属于对象。
使用bwfill
图片,您可以非常有效地使用bsxfun
。您可以使用times
函数将掩码与原始图像中的每个通道相乘,以便仅保留掩码中非零的像素。使用bsxfun
时,您需要确保您所乘的两个输入之间的数据类型是相同的类型,并且因为bwfill
是logical
,您需要将其转换为{在进行乘法之前{1}}。
BTW,我将直接从StackOverflow读取您的图像,以便结果可重现:
uint8
我们得到这张图片:
现在我知道你真正想要的是什么(你真的没有说清楚......),我建议你在二进制图像上使用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