在研究过程中得到了一个二进制图像,如下:
白色栅格为1,也就是题目描述的线,黑色栅格为0。
现在想将这个“线”完全连接起来,形成一个闭合空间(目的是为了下一步对内部进行填充,如果又可以直接进行填充的办法也可以)。
上图只是整体的一部分,请问有没有什么方法可以自动将未闭合的边界线进行插值或其他操作,使值为1的边界形成一个闭合的空间?
当然,python如果能够实现的话,也请留言。
你好,同学,根据你的二值图像,可以通过使用matlab的boundary函数,适当调整收缩因子达到连接的目的:
bwPic = im2bw(imread('exam.png'));%这个图片是从你的图片上截下来的,你如果是二值图片,这个步骤省略
figure(1);clf
imshow(bwPic)
[j,i] = find(bwPic);
%end
k = boundary(i,j,0.98);%我这里收缩因子调整为0.98,效果不错
figure(2);clf
x= i(k);
y = j(k);
plot(x,y);
set(gca,'Ydir','reverse')
axis equal
示例图片
获得结果
最后的x和y就是你需要的封闭曲线坐标【图片坐标】
python形态学,先膨胀,后腐蚀,然后轮廓提取,绘制轮廓的时候最后一个参数设置-1填充,即可实现。
如果你每一个小方格代表一个像素的话可以试试以下代码,虽然没有你提供的数据,但是我自己尝试构造了一组:
效果:
function bwPic=fillBorder(bwPic)
%bwPic是你要处理二值数组
figure(1)
imshow(bwPic)
SE=[0 1 0;1 1 1;0 1 0];
bwPic_Close=imdilate(bwPic,SE);
figure(2)
imshow(bwPic_Close)
bwPic_In=imclearborder(1-bwPic_Close);
SE=ones(3,3);
bwPic_In=imdilate(bwPic_In,SE);
figure(3)
imshow(bwPic_In)
bwPic_WPnt=bwPic+bwPic_In;
bwPic=1-bwareaopen(bwPic_WPnt==0,2,4);
figure(4)
imshow(bwPic)
end