围绕一个物体的边界

时间:2014-05-09 18:02:14

标签: matlab image-processing

我想在对象周围创建一个边界,并且该对象位于灰度图像中。

我想要执行的方法是从背景中减去边界内的区域。

这是我使用的代码:

s=imread('C:\Users\Deepinder\Desktop\dd.jpg');
t=im2bw(s);
se=strel('disk',2);
f1=imerode(t,se);
CC=f1-t;
imshow(CC)

然而,结果我得到一张完全黑的图像。我做错了什么?

2 个答案:

答案 0 :(得分:2)

我已经提出了一个解决方案,但我不相信它会像你想要的那样准确,但它是从一开始就要做的事情。

您正在处理的图像实际上非常复杂。这是你给我看的图片:

enter image description here

您想要做的是在将背景像素设置为黑色时仅提取与脸部有关的像素。

我们原本想要做的是将图像转换为黑白,然后进行侵蚀并用原始图形减去此结果。如果对象的整体亮度高于背景,则此功能

如果您尝试直线im2bw(),则会先将图像转换为灰度,然后再将彩色图像转换为灰度,然后假定阈值为128.任何大于128的内容都是白色,而任何小于0的内容都是白色。这是随附代码后面会出现的图像:

im = imread('dd.jpg');
imshow(im2bw(im));

enter image description here

正如您所看到的,背景也被归类为白色,因此我们的第一种方法不会起作用。我所做的是将图像分解为单独的通道(红色,绿色和蓝色)。这就是我得到的,这里是显示它的代码:

titles = {'Red', 'Green', 'Blue'};
for i = 1 : 3
   subplot(1,3,i);
   imshow(im(:,:,i));
   title(titles{i});
end

enter image description here

如果您看一下红色和绿色通道,红色通道非常嘈杂,因此我们将单独留下。绿色通道的背景与脸部非常相似,因此我们也会留下那个。我们可以使用的最好的是蓝色通道,因为在脸部强度轮廓和背景之间存在相对较好的分离。

通过使用impixelinfo并在蓝色通道图像周围移动,我看到脸部的强度轮廓大致在120到200之间变化。因此,让我们创建一个二元模板,这样做: / p>

im = imread('dd.jpg');
faceGray = im(:,:,3);
faceBW = faceGray > 120 & faceGray < 200;

这是我得到的输出:

enter image description here

我们几乎就在那里。我想摆脱头发的轮廓。我所做的是一个带有半径为3的磁盘结构元素的开放式过滤器。这样可以减少任何小对象,同时保留较大的主要对象。

se = strel('disk', 2);
faceOpened = imopen(faceBW, se);

这就是我得到的:

enter image description here

现在让我们继续填补空缺。 imfill无法工作,因为它只会填充已关闭的区域。因此,我会稍微作弊并使用更大尺寸的磁盘执行关闭过滤器。这次我选择了半径为30。

se2 = strel('disk', 30);
faceClosed = imclose(faceOpened, se2);

这就是我得到的:

enter image description here

现在最后一步是使用此蒙版并屏蔽所有背景像素:

mask = repmat(faceClosed, [1 1 3]);
out = uint8(zeros(size(im)));
out(mask) = im(mask);

......这就是我得到的:

enter image description here

这绝不是完美的,但它可以让你有所作为。此外,颈部周围的强度轮廓与面部非常相似,因此按照我的方式进行,可以避免拔出颈部。我建议你做的是裁剪图像,以便你大部分看到脸,然后尝试做一些形态甚至边缘检测,以一种类似于我所做的方式帮助你。希望这有帮助!

答案 1 :(得分:1)

我建议使用rgb2hsv函数将图像转换为HSV空间。然后,您可以使用第一个色调层来制作蒙版。

im = imread(filename);
im2 = rgb2hsv(im);
mask = im2(:,:,1)>0.4 & im2(:,:,1)<0.6;
im3 = im;
im3(repmat(mask,[1 1 3])) = 255;
imshow(im3)

你可以用这个面具玩更多来填补一些空白。我没有工具箱来彻底测试它。