首页 > 解决方案 > 如何使用 MATLAB 仅填充外壳的内部部分

问题描述

我正在编写一个脚本来处理 .png 图像,类似于 3D 打印切片机的工作方式。
我需要填充对象“外壳”的内部,而不是外壳本身的间隙。

首先,我尝试使用 MATLABimfill函数,它可以让我完成 90% 的工作,但如果有内墙或间隙会遇到麻烦,在这种情况下,它也会填充外壳和间隙。(图 2)。

然后,我尝试了一组 if 语句,这些语句根据遇到的沿图像移动的墙壁进行填充,在遇到的每个其他墙壁之后进行填充。除非遇到像长边墙一样没有空隙的墙(图 3),否则此方法有效。

我想要的结果在图 4 中。这是通过手动完成的,imfill但我要处理的图像集有数千个,因此自动化方法几乎是必不可少的。

%method 1
solid = imfill(im);

%method 2
% im aware this code is bad and full of redundant checks and conditions
% it was written as a fast check to see if what i believed the failure would 
% be was correct which it sadly was. I'm not as interested in the content
% (I can fix that myself) as I am the general outcome. 
slick = imread('image.png');
solid_im = zeros(size(slick));
for kx=1:x
        last=0;
        is_filling = 0;
        for ky =1:y
            if slick(kx,ky) == 1 && last == 0 && is_filling == 0
                solid_im(kx,ky) = 1;
                last = 1;
                is_filling = 1;
            elseif slick(kx,ky) == 1 && last == 1 && is_filling == 0
                solid_im(kx,ky) = 1;
            elseif slick(kx,ky) == 0 && last == 1 && is_filling == 0
                solid_im(kx,ky) = 0;
                last = 0;
            elseif slick(kx,ky) == 0 && last == 0 && is_filling ==0
                solid_im(kx,ky) = 0;
            elseif slick(kx,ky) == 1 && last == 0 && is_filling == 1
                solid_im(kx,ky)= 1;
                last = 1;
                is_filling = 0;
            elseif slick(kx,ky) == 1 && last == 1 && is_filling == 1
                solid_im(kx,ky) = 1;
            elseif slick(kx,ky) == 0 && last == 1 && is_filling == 1
                solid_im(kx,ky) = 1;
                last = 0;
            elseif slick(kx,ky) == 0 && last == 0 && is_filling == 1
                solid_im(kx,ky) = 1;
            end
        end
    end
  1. 只有壳壁的图像:
    只有壳壁的图像
  2. 完全充满imfill
    完全充满了imfill
  3. 用坏线算法填充的图像:
    用坏线算法填充的图像
  4. 正确填充的图像:
    正确填充的图像

标签: matlabimage-processing

解决方案


看起来我的一个旧答案解决了这个问题:

参考:如何在matlab中填充这些字符的边缘?

这是代码:

I = imread('https://i.stack.imgur.com/6Rdl1.png');
I = imbinarize(rgb2gray(I));

J1 = imfill(I, 'holes');
J2 = imfill(I, [1, 1]);
J3 = imfill(~J2, [1, 1]);
J4 = imfill(~J3, 'holes');
J5 = J1 & (~J4);

figure;imshow(J5)

结果:
在此处输入图像描述

我不能保证该解决方案适用于数千张图像。


推荐阅读