“填充”二进制矩阵以创建平滑连接区域的有效方法

时间:2013-10-12 22:30:29

标签: arrays matlab matrix binary

我有一个1和0的大矩阵,我正在寻找一种方法来“填充”局部密集的区域1。 我首先为一个数组完成了这个任务,并计算了问题中元素的某个半径内的1的数量。例如,如果半径为5,并且我的阈值为4,那么在左侧或右侧的5个元素中有4个标记为“1”的元素的点将更改为1。

基本上我想把它推广到一个二维数组,并得到一个结果矩阵,它具有1的“平滑”和“连通”区域,没有“斑点”斑点。

例如,矩阵

1 0 0 1 0 0 0

0 0 1 0 1 0 0

0 1 0 1 0 0 0

0 0 1 1 1 0 0

理想情况下会改为

1 0 0 1 1 0 0

0 0 1 1 1 0 0

0 1 1 1 1 0 0

0 0 1 1 1 0 0

或类似的东西

2 个答案:

答案 0 :(得分:1)

对于二进制图像,morphologial operations implemented in MATLAB非常适合处理连接区域的形状和大小。具体而言,image closing的过程旨在填补连接区域中的空洞。在MATLAB中,函数是imclose,它采用图像和结构元素(类似于滤波器内核),了解相邻像素如何影响孔和间隙的填充。 imclose的简单调用是,

IM2 = imclose(IM,strel(ones(3)));

通过增大相邻像素的影响区域,可以通过更大的结构元素来填充更大的间隙。例如,我们使用半径为10像素的磁盘:

IM2 = imclose(IM,strel('disk',10));

虽然imclose支持灰度和二进制(0和1)图像,但函数bwmorph仅用于对二进制图像进行操作,但为所有形态操作和各种整齐提供了通用接口操作组合(例如'bothat''tophat'等)。使用bwmorph简化了关闭语法:

BW2 = bwmorph(BW,'close');

此处结构元素是标准ones(3)

答案 1 :(得分:0)

如下所示的简单过滤器可能会起到作用:

h = [     0     1     0
          1     0     1
          0     1     0];

img2=(imfilter(img,h)>2) | img;

例如:

img =

     1     0     0     1     0     0     0
     0     0     1     0     1     0     0
     0     1     0     1     0     0     0
     0     0     1     1     1     0     0

img2 =

     1     0     0     1     0     0     0
     0     0     1     1     1     0     0
     0     1     1     1     1     0     0
     0     0     1     1     1     0     0

您可以尝试使用不同的过滤器来修改输出img2

这使用图像处理工具箱。如果你没有,你可能想要从matlab交换中查找等效的例程。