内核中用于二元形态树修剪的"Don't care"元素,MATLAB



我正在尝试修剪数字(0-9)的骨架化图像,由于原始数字厚度的不规则性,该图像有时会高度分支。

为此,我尝试使用图4中所示的内核:http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm,包含"不在乎"的单元格。

因为我不知道如何在内核中对"不在乎"元素进行编码,所以我正在创建其他内核,以在考虑"不关心"元素时掩盖所有可能性。然而,这大大增加了代码的复杂性,因为它在计算上是昂贵的。例如,考虑图4中的第一个内核:

kernel1 = [1 1 1; * 1 *; 0 0 0] -->
[1 1 1; 1 1 0; 0 0 0]
[1 1 1; 0 1 1; 0 0 0]
[1 1 1; 1 1 1; 0 0 0]
[1 1 1; 0 1 0; 0 0 0]

其中*表示"不在乎"元素。直接编码一个"不在乎"的元素将不那么麻烦,而且它将大大减少计算时间。

有人对如何处理这个问题有什么建议吗?

Victor

感谢您的回答!

在你的"结果"结果的帮助下,我能够为任何数量的"不在乎"元素n生成所有可能的矩阵。这帮了我很大的忙!

(如果有人感兴趣:)

n = numel(find(A == -1))
func = @(x,n) repmat( [ ones(1, 2.^(n-x)) zeros(1, 2.^(n-x)) ] , 1, 2.^(x-1))
ind = [1:n]'    %'
result = cell2mat ( arrayfun(func,ind,n*ones(1,n)','UniformOutput',false) )'
[row,col] = find(A == -1)
for i = 1:size(result,1)
     for b = 1:size(result,2)
         output{i}(row(b),col(b)) = result(i,b);
     end
     output{i} = abs(new{i} + A + isnan(A));
end

再次感谢!

我想向您展示我的方法:

实际上,您需要创建一个矩阵,其中的行由所有已知列(10)和未知列-*组成。对于所有未知元素,我们需要创建具有所有可能组合的行。所以,我们可以找到*的数量,创建一个具有所有可能组合的表,并将其与已知列组合。例如(根据您的数据):

[* 1 *] 
   to
[1 1 0;
 0 1 1;
 1 1 1;
 0 1 0]

或者在我的方法中:我们有2个*,所以我们需要创建两个元素的所有组合的矩阵:

A =[ 0 0;                      B = [ 1;
     0 1;    and combine with        1;
     1 0;                            1;
     1 1 ]                           1 ]

组合:

result = [ A(:,1) B A(:,2)]

这是简单的操作。只有一个问题:如何创建这个矩阵A。让我们走这条路:

我不知道你们矩阵的数据类型,但在数字中我们不能使用*符号。因此,我将使用-1。(如果你有符号或单元格数组,很容易将其转换为数字,所以我的例子仍然有效,只需要添加几个转换操作)。还有一个细节-让我们不仅解决3元素行的问题,还解决n的问题。所以我们有

A = [1 -1 -1 -1]
n = numel(find(A==-1))
func = @(x,n) repmat( [ ones(1, 2.^(n-x)) zeros(1, 2.^(n-x)) ] , 1, 2.^(x-1))
ind = [1:n]'    %'
result = cell2mat ( arrayfun(func,ind,n*ones(1,n)','UniformOutput',false) )'  

结果:

result =
 1     1     1
 1     1     0
 1     0     1
 1     0     0
 0     1     1
 0     1     0
 0     0     1
 0     0     0

查看您的示例:

A = [-1 1 -1]
result =
     1     1
     1     0
     0     1
     0     0

最新更新