在矩阵中展开多边形区域

时间:2016-06-10 07:25:39

标签: matlab convex-polygon

我有以下矩阵:

1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1
1 1 2 2 2 1 1 3
1 1 2 2 2 2 1 3
1 1 1 1 2 1 1 3
1 1 1 1 1 1 1 1

我希望将值2的区域扩展为大小1,这意味着在扩展后,输出为:

1 1 2 2 2 1 1 1 
1 2 2 2 2 2 1 1
2 2 2 2 2 2 2 3
2 2 2 2 2 2 2 2
1 2 2 2 2 2 2 3
1 1 2 2 2 1 1 1

我认为imerode可以扩展和缩小二进制图像,但在这种情况下不适用。 matlab中有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

One-Liner解决方案

使用:

mat =

 1     1     2     2     2     1     1     1
 1     2     2     2     2     2     1     1
 2     2     2     2     2     2     2     3
 2     2     2     2     2     2     2     2
 1     2     2     2     2     2     2     3
 1     1     2     2     2     2     1     1

<强>结果

%initializes the input matrix
mat = [1,1,1,1,1,1,1,1 ; 1,1,1,1,1,1,1,1; 1,1,2,2,2,1,1,3 ; 1,1,2,2,2,2,1,3; 1,1,1,1,2,1,1,3 ; 1,1,1,1,1,1,1,1];

%initilizes a mask which represents the reion which we want to exapand
roiMask = mat==2;

%perform expansion to this mask by imdilate function
dilatedRoi = imdilate(mat==2,strel('disk',2));

%assigns the new value into the original matrix
mat(dilatedRoi) = 2;

分步解释

此问题的解决方案基于对矩阵等于2的区域的dilation运算。 这可以按照以下方式完成:

strel('disk',2)

ans = 
 0     0     1     0     0
 0     1     1     1     0
 1     1     1     1     1
 0     1     1     1     0
 0     0     1     0     0

请注意,扩张操作的特征在于结构化元素对象,它基本上是一个二进制矩阵,用于定义执行扩展的方式。 在我的例子中,我使用了MATLAB的strel函数,它生成以下内容:

{{1}}

您可能想要更改strel以完全控制所需的扩展行为。