"不在乎"内核中的元素用于二进制形态树修剪,MATLAB

时间:2015-12-23 11:07:43

标签: 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]

*表示"不关心"元素。直接编码"不要关心"元素将不那么繁琐,并且会大大减少计算时间。

有没有人对如何处理此事有任何建议?

维克多

2 个答案:

答案 0 :(得分: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) )'

[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

再次感谢!

答案 1 :(得分:0)

我想告诉你我的方法:

您真的需要创建一个矩阵,其行包含所有已知列(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