矩阵操作,缩放和最近的邻居(无循环)



我正在尝试实现最近在MATLAB上缩放图片的最近的邻居算法。我正在尝试无需使用任何循环来实现它 - 从我收集的矩阵来看,使用矩阵会大大提高性能。我真的很麻烦地找到方法。我认为这应该是正确的过程:

  1. 找到缩放图片的宽度和高度比
  2. 计算一个尺寸矩阵(width*scaleheight*scale),该矩阵包含每个单元格的最近邻居指数
  3. 将此矩阵应用于启动图片('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矩阵的正确索引。但是,如果这样做,我会得到一个矩阵,其中 cb被倒了,是错误的:

>> 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中最近的邻居插值算法"帖子中有一个答案。该帖子中所接受的答案不使用您想要的任何循环。

最新更新