Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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,我正在编写一个脚本来处理.png图像,类似于3D打印切片器的工作方式。 我需要填充对象“壳”的内部,但不需要填充壳本身的间隙 首先,我尝试使用MATLABimfill函数,该函数使我获得了90%的成功,但如果有内壁或间隙,则会遇到问题,在这种情况下,它也会填充外壳和间隙。(图2) 然后,我尝试了一组if语句,这些语句基于遇到沿着图像移动的墙进行填充,在遇到其他墙之后进行填充。除了遇到一堵墙,它后面没有空隙,就像一堵长边墙(图3) 我想要的结果如图4所示。这是通过手动imfill完成的,但我要处理

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

首先,我尝试使用MATLAB
imfill
函数,该函数使我获得了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
  • 仅具有壳墙的图像:
  • 完全填充了
    imfill

  • 由算法填充的图像有错误行:
  • 正确填充的图像:

  • 看来我的一个老答案解决了这个问题:

    参考:

    代码如下:

    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)
    
    结果:


    我不能保证这个解决方案能适用于数千张图片

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

    参考:

    代码如下:

    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)
    
    结果:

    我不能保证这个解决方案能适用于数千张图片