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