MATLAB 中的索引问题(图像处理)

Indexing issue in MATLAB (image processing)

我正在处理预测块匹配运动估计算法。这意味着,运动矢量的值是使用以前找到的值找到的,我被一件非常微不足道的事情困住了。

我正在处理分成块的图像,所以我应该有每个块的运动矢量。我创建了一个 2xN 矩阵 motion_vectors,其中 N 是所有块的数量 (blocks_in_the_first_row*blocks_in_the_first_column)。第一行是 x 坐标,第二行是运动矢量的 y 坐标。

我有 2 个预测器来帮助估计当前块的运动向量。 如果我当前的块位于 (i,j) 位置,那么预测变量的位置是 (i, j-1) (块 "on top)" 和 (i-1, j) (左边的块)。

我的问题是,由于尺寸不同(一个是 2xN矩阵,其他blocks_in_row x blocks_in_column)。我也不想更改 motion_vectors 的维度,因为那时我需要一个双 "layer" 数组。一个用于 x 坐标,一个用于 y,但这不适合进一步的设计。

我希望我说得明白,如果不明白,请告诉我。

感谢您提供任何线索!

如果您正在访问 motion_vectors 的元素,您将获取有关相应块的数据。这意味着有一个在索引 1N 和特定块之间进行转换的系统,其中 Nblocks_in_row*blocks_in_column。如果 index 1 是左上角的块,index 2 是它右边的块,并且你在阅读一本书时递增(从左到右并换行到下一行),那么你将翻译如下:

row_of_block = floor((index_in_motion_vector-1)/number_of_columns) + 1  
col_of_block = mod((index_in_motion_vector-1), number_of_columns) + 1

(这称为行优先排序。)

如果索引 1 是左上角的块,索引 2 是它下面的块,并且在完成后换行到下一列的顶部,则转换将是

row_of_block = mod((index_in_motion_vector-1), number_of_rows) + 1
col_of_block = floor((index_in_motion_vector-1)/number_of_rows) + 1

(这称为列优先排序,是 MATLAB 默认使用的顺序。)

因此,如果您将 1 迭代到 N,您可以只使用这些转换。如果你想迭代 1number_of_rows,以及 1number_of_columns,你会做相反的事情。

如果您使用的是书本式的块索引(行优先排序),则转换为运动向量的索引将是

col_in_motion_vector = (row_of_block-1)*number_of_columns + column_of_block

如果您使用第二种从上到下并环绕的索引块方法(按列排序),则转换为

col_in_motion_vector = (column_of_block-1)*number_of_rows + row_of_block