type
Post
status
Published
date
Mar 17, 2023 04:58 PM
slug
summary
tags
图像编程
category
技术折腾
icon
fas fa-trophy-alt
password
老记不住, 查了一下它的历史因素
现象:
opencv 图像切片用numpy 实现, 但numpy 与 我用惯的wand比, 图像形状有点反人类习惯, 总记不住.
OpenCV中的图像通常以NumPy数组表示,数组的形状为
(height, width, channels)
在访问和修改像素值时,我们使用[y, x]而不是[x, y]。
原因
图像在 numpy 中, 数组的形状为什么height 在前面的原因
在NumPy中,图像数组的形状为(height, width, channels)的原因是基于行优先(row-major)存储顺序。在行优先存储顺序中,二维数组的行按顺序排列,每一行内的元素按顺序存储。在这种情况下,height对应于图像的行数,而width对应于图像的列数。
[ [A, B, C], [D, E, F], [G, H, I] ]
这个数组的形状是(3, 3),因为它有3行和3列。行优先存储顺序意味着,在内存中,数组元素将以 A, B, C, D, E, F, G, H, I 的顺序存储。这就是为什么height(行数)在形状表示中位于第一位置的原因。
当处理彩色图像时,我们需要考虑通道。对于一个BGR彩色图像,NumPy数组将具有三个通道。在这种情况下,数组的形状将为(height, width, 3)。在这种表示中,每个像素由一个大小为3的数组表示,其中包含蓝色、绿色和红色通道的值。
将height(图像的行数)放在形状表示的前面是一种遵循行优先存储顺序的惯例,因此在处理图像时,我们可以更自然地访问和处理每一行的数据。这也使得在循环遍历图像时,行和列索引的使用更加直观。
for y in range(height): for x in range(width): pixel_value = image[y, x]