国内设计网站公司,平台兼职网站开发,做模板的软件,越南做彩票网站是违法的吗一、含义
线性索引#xff0c;顾名思义就是说把图像矩阵展平#xff0c;相当于变成一维的图像数组#xff0c;故像素点的线性索引就是其在图像数组中的索引值
行列号索引#xff0c;对于一个二维的图像矩阵有行有列#xff0c;知道行号和列号就可以唯一确定一个点的位置…一、含义
线性索引顾名思义就是说把图像矩阵展平相当于变成一维的图像数组故像素点的线性索引就是其在图像数组中的索引值
行列号索引对于一个二维的图像矩阵有行有列知道行号和列号就可以唯一确定一个点的位置类似于二维的坐标横坐标纵坐标
下面举个例子来具体地阐述一下线性索引和行列号索引的含义
例如有一张大小为 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 为 1col_index 为 2 时根据公式计算得到线性索引为 5 同样如果要从线性索引计算出行列索引可以使用以下公式 row_index linear_index // num_cols col_index linear_index % num_cols 这样就可以根据需要在行列索引和线性索引之间进行转换