我正在尝试修剪数字(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
再次感谢!
我想向您展示我的方法:
实际上,您需要创建一个矩阵,其中的行由所有已知列(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