一、含义
线性索引,顾名思义就是说把图像矩阵展平,相当于变成一维的图像数组,故像素点的线性索引就是其在图像数组中的索引值
行列号索引,对于一个二维的图像矩阵有行有列,知道行号和列号就可以唯一确定一个点的位置,类似于二维的坐标(横坐标,纵坐标)
下面举个例子来具体地阐述一下线性索引和行列号索引的含义:
例如,有一张大小为 100x100 的灰度图,那么可以用一个二维的图像矩阵来表示,也就是100行100列的矩阵,如下图所示:
综上所述就是关于线性索引和行列号索引的简要介绍,下面我们再来讨论一下线性索引和行列号索引之间如何相互转换?
二、线性索引转换为行列号索引
可以使用 Python 的整除 ( // )和取余( % )运算
在进行转换的讲解之前,我们要先知道二维矩阵(此处以二维矩阵为例)是按照什么方式进行数据存储的,也就是说是行优先存储还是列优先存储。
1.行优先存储
含义:元素先存满第一行后再存储第二行,也就是第一行所有的元素都在第二行之前
假设有一个n行m列的矩阵以及一个线性索引index,可以用下面的代码转换线性索引为行列号索引:
rows = n # 矩阵行数
cols = m # 矩阵列数
index = index # 线性索引#计算行列索引
row_index = index // cols # 取商
col_index = index % cols # 取余print("Row index:",row_index)
print("Column index:",col_index)
这段代码首先使用整除运算 // 计算行索引,然后使用取余运算 % 计算列索引
这是因为在行优先的二维矩阵中,每存储cols个元素,行数就增加1(注意:在Python中行号和列号都是从0开始的)
2.列优先存储
含义:元素先存满第一列后再存储第二列,也就是第一列所有的元素都在第二列之前
接着上面的例子来进行讲解,列优先存储就要先计算列号,然后通过余数计算行号
rows = n # 矩阵行数
cols = m # 矩阵列数
index = index # 线性索引#计算行列索引
col_index = index // rows # 取商
row_index = index % rows # 取余print("Row index:",row_index)
print("Column index:",col_index)
这段代码首先使用整除运算 // 计算列索引,然后使用取余运算 % 计算行索引
这是因为在列优先的二维矩阵中,每存储rows个元素,列数就增加1(注意:在Python中行号和列 号都是从0开始的)
3. 行优先和列优先存储的差异
下面我们再来看看对于同一个点进行 行优先存储 和 列优先存储 的区别:
其中,region_edge_s.mat 是存储了如上图二值图像所示的连通域,属于每个连通域点的线性索引信息的Matlab文件,并且是以结构体形式存储的,如下图所示:
下面我们来将存储在文件中的线性索引转换为对应图像中的行列号索引,经过上图所示文件的读取操作后,field变量已经将连通域中点的线性索引进行了保存。
首先定义了一个函数 linear_index_to_2d_index ,此函数接受线性索引 linear_index 和 列数 num_cols 作为参数,计算行号和列号并进行返回
然后新建了一个大小为512x512的全零图像矩阵image(初始的图像为全黑),将得到的行号和列号所对应的位置处的像素值置为255(也就是以白色来显示)
最后使用matplotlib库来绘制图像image,代码以及运行结果如下图所示:
- 按列优先存储:
- 按行优先存储
综上所如图所示,可以很清楚地看到 按行存储 和 按列存储 之间的差异。
注意: 在这个例子中,可以看到 按列存储 图像可以得到和原始图像一样的结果, 这说明文件 region_edge_s.mat 中的线性索引是按列存储的。因为 Matlab是按照列优先的原则存储元素。所以在进行线性索引转换行列号索引的时候,一定要清楚该图像是按行存储的信息还是按列存储的。
三、行列号索引转换为线性索引
将行列号索引转换为线性索引的方法取决于如何排列数据(按行存储的数据还是按列存储的数据)
下面举个 按行存储 的行列号转换为线性索引 的例子:
一般情况下,对于二维矩阵或数组,行列号索引可以转换为线性索引的公式如下:
假设有一个矩阵或数组,行数为 num_rows
,列数为 num_cols
,行索引为 row_index
,列索引为 col_index
,那么线性索引可以通过以下公式计算:
线性索引 = row_index * num_cols + col_index
这个公式基于矩阵在内存中的布局方式。行索引乘以列数得到的值代表了前面所有行占据的位置数量,再加上列索引得到具体位置的偏移量。
假设有一个3x3的矩阵,要将行列索引转换为线性索引:
num_rows = 3
num_cols = 3
row_index = 1
col_index = 2linear_index = row_index * num_cols + col_index
print("线性索引:", linear_index)
-
在这个例子中,当 row_index 为 1,col_index 为 2 时,根据公式计算得到线性索引为 5
同样,如果要从线性索引计算出行列索引,可以使用以下公式:
row_index = linear_index // num_cols
col_index = linear_index % num_cols这样就可以根据需要在行列索引和线性索引之间进行转换