我正在尝试实现最近在MATLAB上缩放图片的最近的邻居算法。我正在尝试无需使用任何循环来实现它 - 从我收集的矩阵来看,使用矩阵会大大提高性能。我真的很麻烦地找到方法。我认为这应该是正确的过程:
- 找到缩放图片的宽度和高度比
- 计算一个尺寸矩阵(
width*scale
,height*scale
),该矩阵包含每个单元格的最近邻居指数 - 将此矩阵应用于启动图片('S矩阵)以获取缩放图片
我对Matlab的矩阵及其操作的工作方式感到非常困惑。
这就是我将如何使用循环进行操作:
x_ratio = width/(width*scale);
y_ratio = height/(height*scale);
for i=1:1:width
for j=1:1:height
x=i*x_ratio;
y=j*y_ratio;
out_image(i, j) = image(x, y);
end
end
到目前为止,我设法发现,使用矩阵也应该有效:
q =
2×2 char array
'ab'
'cd'
>> q([1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4])
ans =
4×4 char array
'aabb'
'aabb'
'ccdd'
'ccdd'
我的第一个问题是:为什么[1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]
在表示为:
>> [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]
ans =
1 1 3 3
1 1 3 3
2 2 4 4
2 2 4 4
我认为正确传递给q
的矩阵将是:
>> [1 1 2 2; 1 1 2 2; 3 3 4 4; 3 3 4 4]
ans =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
在哪里,所有索引代表q
矩阵的正确索引。但是,如果这样做,我会得到一个矩阵,其中 c
和 b
被倒了,是错误的:
>> q([1 1 2 2; 1 1 2 2; 3 3 4 4; 3 3 4 4])
ans =
4×4 char array
'aacc'
'aacc'
'bbdd'
'bbdd'
似乎是如此...违反直觉。 [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]
中的每个半龙都表示我了解的一行或水平向量。那么,为什么当传递给另一个矩阵时,它似乎表示垂直向量或列?(如果我不是完全盲目的,这似乎是在这种情况下它的行为,考虑到矢量我将其传递给较小的矩阵作为列的索引)。
其次,如何计算[1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]
矩阵?或更一般而言,我需要按照最近的邻居规则计算线性索引的矩阵,这就是我在第一个代码块中使用嵌套循环所做的。我认为这将是至关重要的一点,但是我对与矩阵一起使用的过程有多大概括。使用循环,我将进入缩放矩阵的每个单元格,并计算原始矩阵的哪个相应单元格的位置。因此,例如,如果我在哪里检查scaled_matrix(i, j)
,我会知道在该单元格中,我必须放置orig_matrix(i*x_ratio, j*y_ratio)
,依此类推。我的想法是计算包含所有正确索引的scaled_matrix
,然后继续进行。
在此问题中讨论了对您的第一个问题的回答。MATLAB以列级订单存储其矩阵。因此,对于您的角色数组q
q(1) = 'a'
q(2) = 'c'
q(3) = 'b'
q(4) = 'd'
这就是为什么用于缩放q
至4x4的正确矩阵确实是为什么 [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]
,而不是其他矩阵。
您的第二个问题已经在" Matlab中最近的邻居插值算法"帖子中有一个答案。该帖子中所接受的答案不使用您想要的任何循环。