1

我有一个大的 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

或类似的东西

4

2 回答 2

1

对于二值图像,在 MATLAB 中实现形态学运算非常适合处理连接区域的形状和大小。具体来说,图像闭合的过程旨在填充连接区域中的孔。在 MATLAB 中,函数是,它采用图像和结构元素,类似于过滤器内核,用于了解相邻像素如何影响孔和间隙的填充。一个简单的调用是,imcloseimclose

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)

于 2013-10-14T07:59:20.117 回答
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 交换中查找等效例程。

于 2013-10-12T23:55:17.530 回答