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
的元素,您将获取有关相应块的数据。这意味着有一个在索引 1
到 N
和特定块之间进行转换的系统,其中 N
是 blocks_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
,您可以只使用这些转换。如果你想迭代 1
到 number_of_rows
,以及 1
到 number_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
我正在处理预测块匹配运动估计算法。这意味着,运动矢量的值是使用以前找到的值找到的,我被一件非常微不足道的事情困住了。
我正在处理分成块的图像,所以我应该有每个块的运动矢量。我创建了一个 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
的元素,您将获取有关相应块的数据。这意味着有一个在索引 1
到 N
和特定块之间进行转换的系统,其中 N
是 blocks_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
,您可以只使用这些转换。如果你想迭代 1
到 number_of_rows
,以及 1
到 number_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