【发布时间】:2017-11-24 20:06:39
【问题描述】:
我正在尝试在 Matlab 上实现用于缩放图片的最近邻算法。我试图在不使用任何循环的情况下实现它——因为从我收集到的信息来看,使用矩阵可以极大地提高性能。 我真的很难找到如何做到这一点。我认为这应该是正确的程序:
- 求缩放后图片的宽高比
- 计算包含每个单元格最近邻索引的维度矩阵(
width*scale、height*scale) - 将此矩阵应用于起始图片(的矩阵)以获得缩放的图片
我对矩阵及其运算在 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,然后继续。
【问题讨论】:
-
您可以使用两个向量进行索引,一个用于所有行,一个用于所有列。您将分别计算行/列索引,例如在 Y 和 X 中,然后执行
image(Y,X)。