我有一个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
或类似的东西
答案 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交换中查找等效的例程。