matlab - 如何使用 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
解决方案
看起来我的一个旧答案解决了这个问题:
这是代码:
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)
我不能保证该解决方案适用于数千张图像。
推荐阅读
- vue.js - 如何在 VueJS 中查看列表项的 $watch 属性
- python - 在python中将UTC日期时间转换为本地日期时间
- nativescript - 在 Nativescript 代码共享项目中使用 Angular 库
- javascript - 带复选框的字段验证
- ios - AVAudioSession - 如何在扬声器和耳机输出之间切换
- sql - CASE in WHERE 子句 SQL VBA Excel
- python - Python Numpy:循环中的随机数
- ruby-on-rails - Ruby on Rails 应用程序部署到 heroku 但应用程序错误?
- ios - GLKit,Opengl ES 3.0,使用 glReadPixels 获取深度
- php - sumbit:php 后我得到一个空帖子