我试图修剪一个数字(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]
*表示"不关心"元素。直接编码"不要关心"元素将不那么繁琐,并且会大大减少计算时间。
有没有人对如何处理此事有任何建议?
维克多
答案 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)
我想告诉你我的方法:
您真的需要创建一个矩阵,其行包含所有已知列(1
和0
)和未知 - *
。对于所有未知元素,我们需要创建具有所有可能组合的行。
因此,我们可以找到*
的数量,创建一个包含所有可能组合的表,并将其与已知列组合。例如(来自您的数据):
[* 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