Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 物体周围的边界_Matlab_Image Processing - Fatal编程技术网

Matlab 物体周围的边界

Matlab 物体周围的边界,matlab,image-processing,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) 然而,我得到了一个完全黑色的图像作为结果。我做错了什么?我想出了一个解决方案,但我不认为它像你想要的那样准确,但这是一个开始 你正在处理的图像实际

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

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

这就是我使用的代码:

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

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

我想出了一个解决方案,但我不认为它像你想要的那样准确,但这是一个开始

你正在处理的图像实际上相当复杂。这是您向我展示的图像:

您要做的是只提取与人脸相关的像素,同时将背景像素设置为黑色

我们最初想做的是将图像转换为黑白,然后进行腐蚀,并将结果与原始图像相减。只有当对象的整体亮度比背景亮度更亮时,这才起作用

如果您尝试直接执行
im2bw()
,这将首先将彩色图像转换为灰度,然后假设阈值为128。大于128的都是白色,而小于128的都是0。这是我们将得到的图像,后面是附带的代码:

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

如您所见,背景也被分类为白色,因此我们的第一种方法不起作用。我所做的是将图像分解为单独的通道(红色、绿色和蓝色)。这是我得到的,下面是代码:

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

如果你看一下红色和绿色通道,红色通道非常嘈杂,所以我们就不谈了。绿色通道的背景与人脸非常相似,因此我们也将保留该通道。我们可以使用的最好的方法是蓝色通道,因为在脸部强度轮廓和背景之间有一个相对较好的分离

通过使用
impixelinfo
并在蓝色通道图像周围移动,我看到面部的强度轮廓大致在120到200之间变化。因此,让我们创建一个二进制掩码,它可以执行以下操作:

im = imread('dd.jpg');
faceGray = im(:,:,3);
faceBW = faceGray > 120 & faceGray < 200;
这就是我得到的:

现在让我们来填补这些漏洞
imfill
不起作用,因为它只填充关闭的区域。因此,我将欺骗一点,用一个更大的磁盘做一个关闭过滤器。这次我选择了30的半径

se2 = strel('disk', 30);
faceClosed = imclose(faceOpened, se2);
这就是我得到的:

现在,最后一步是使用此遮罩并遮罩掉所有背景像素:

mask = repmat(faceClosed, [1 1 3]);
out = uint8(zeros(size(im)));
out(mask) = im(mask);
。。。这就是我得到的:


这一点也不完美,但它给了你一些可以使用的东西。此外,颈部周围的强度轮廓与脸部非常相似,因此以我的方式进行操作无法避免提取颈部。我建议你做的是裁剪出图像,这样你就能大致看到人脸,然后尝试做一些形态学甚至边缘检测,以类似于我所做的方式帮助你。希望这有帮助

我建议您使用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)
im=imread(文件名);
im2=rgb2hsv(im);

mask=im2(:,:,1)>0.4&im2(:,:,1)你试过什么吗?你的形象是什么样子的?我能想到的最简单的事情是将图像转换成黑白,用一个非常小的结构元素进行腐蚀,然后从原始黑白图像中减去结果。“从背景中减去边界内的该区域”基本上就是找到对象的边界。如果要将此应用于灰度图像,只需获取边界的位置,然后将灰度图像中的这些位置归零。我尝试了此操作,但在从原始黑白图像中减去结果后,将显示完整的黑色图像。向我显示一些代码和正在处理的图像。在没有真正看到你在做什么的情况下,无法评估你做错了什么。请修改您的帖子以包含此信息。由于声誉不佳,我无法上传我的图像。请将其放在公共存储网站的某个地方供我下载。非常欢迎您的光临。如果这个答案帮助了你,请考虑接受它。这就是我正在寻找的!谢谢你,伙计。。但是在上面的代码中,您能解释一下为什么要使用(>0.4)和(如果我有这样一张黑白图像,请向我解释一下,它主要是启发式的。你必须反复使用阈值,直到你得到一个好的结果…就像我做的那样。图像处理主要是反复试验或试验参数,直到你得到足够好的东西来显示。顺便说一句,使用HSV需要+1。我总是忘记一个关于颜色空间。@user3598602:不幸的是,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)