如何提取图像中对象的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
,您需要确保要相乘的两个输入之间的数据类型相同,并且因为 bwfill
是 logical
,您需要将其转换为 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});
我有一张图片。我需要从图像中的每个对象中提取 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
,您需要确保要相乘的两个输入之间的数据类型相同,并且因为 bwfill
是 logical
,您需要将其转换为 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});