Matlab 如何从图像中删除/替换边框像素?

Matlab 如何从图像中删除/替换边框像素?,matlab,image-processing,Matlab,Image Processing,我是Matlab新手,需要一些帮助。我有一个分割的图像,其中我希望从图像边框中删除背景(或黑色)像素(值==1)。我已经能够获得我不想要的边界像素的图像掩码。内部_黑色像素很有用,但我想去掉外部_黑色像素,但是,我不确定如何使用我拥有的遮罩(外部_黑色像素)检索没有黑色像素边界的最终图像。目前的代码如下所示: img = [1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 2 2 2 2 1 1 1 1 2 2

我是Matlab新手,需要一些帮助。我有一个分割的图像,其中我希望从图像边框中删除背景(或黑色)像素(值==1)。我已经能够获得我不想要的边界像素的图像掩码。内部_黑色像素很有用,但我想去掉外部_黑色像素,但是,我不确定如何使用我拥有的遮罩(外部_黑色像素)检索没有黑色像素边界的最终图像。目前的代码如下所示:

img =   [1 1 1 1 1 1 1 1
         1 1 1 1 2 2 2 1
         1 1 1 2 2 2 2 1
         1 1 1 2 2 2 2 1
         1 1 2 2 2 2 2 1
         1 1 2 2 2 2 2 1
         1 3 3 1 1 1 3 1
         1 3 3 1 1 1 3 1
         1 3 3 3 3 3 3 1
         1 1 1 1 1 1 1 1];

% Get the black pixels image array
blackPixels = (img == 1);

% Obtain the other pixels by negating the black pixels
otherPixels = ~blackPixels

% Get the border black pixels (or mask)
outer_blackPixels    = blackPixels & ~imclearborder(blackPixels)
interior_blackPixels = blackPixels & ~outer_blackPixels
请注意,我不介意将外部像素的像素值替换为“0”,因为这不会影响我的分析。因此,我希望我的最终形象是这样的:

img =   [0 0 0 0 0 0 0 0
         0 0 0 0 2 2 2 0
         0 0 0 2 2 2 2 0
         0 0 0 2 2 2 2 0
         0 0 2 2 2 2 2 0
         0 0 2 2 2 2 2 0
         0 3 3 1 1 1 3 0
         0 3 3 1 1 1 3 0
         0 3 3 3 3 3 3 0
         0 0 0 0 0 0 0 0];

如有任何帮助/建议,将不胜感激。谢谢

您可以使用
bwlabel
来区分1的区域。由于此函数仅处理二进制图像,因此可以使用
logical
img
转换为二进制:

L=bwlabel(~logical(img-1),4)
然后将边框转换为0:

img(L==L(1))=0
img
=

 0     0     0     0     0     0     0     0
 0     0     0     0     2     2     2     0
 0     0     0     2     2     2     2     0
 0     0     0     2     2     2     2     0
 0     0     2     2     2     2     2     0
 0     0     2     2     2     2     2     0
 0     3     3     1     1     1     3     0
 0     3     3     1     1     1     3     0
 0     3     3     3     3     3     3     0
 0     0     0     0     0     0     0     0

由于您使用的是图像处理工具箱,我建议您使用以下功能:

img(~imfill(img ~= 1, 'holes')) = 0;
这首先为
img
中不等于1的像素创建一个遮罩,使用
imfill
填充包含遮罩的任何内部孔,对其求反以获得边框遮罩,并使用该遮罩索引
img
,将值设置为零


如果您想在不使用图像处理工具箱的情况下执行类似操作,我会选择使用的解决方案。

非常感谢@Adiel和gnovice这两种解决方案都非常有效。此外,从代码停止的地方开始,我意识到我所需要做的就是包含以下行:img(outer_blackPixels)=0,这就足够了。尽管如此,我还是非常感谢你的帮助。格诺维奇:我一直看到你的评论,因此我钦佩你的直觉和技巧。。。很荣幸你能对我的帖子发表评论。特别感谢你!