Matlab 如何将二进制(binary image)图像中的“线(1)”进行连接

在研究过程中得到了一个二进制图像,如下:

img

白色栅格为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

示例图片

img

获得结果

img

最后的x和y就是你需要的封闭曲线坐标【图片坐标】

python形态学,先膨胀,后腐蚀,然后轮廓提取,绘制轮廓的时候最后一个参数设置-1填充,即可实现。

可参考:
使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制_程序媛一枚~的博客-CSDN博客 这篇博客将介绍如何使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制。 https://blog.csdn.net/qq_40985985/article/details/120015622

如果你每一个小方格代表一个像素的话可以试试以下代码,虽然没有你提供的数据,但是我自己尝试构造了一组:
效果:

img

img

img

img


原理就是图形膨胀把边缘连起来,然后边缘清理获得内部区域,内部区域膨胀,然后内部区域和未膨胀的原图合在一起:

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