图像像素操作与高效扫描方法
1. 像素操作基础
在彩色图像中,图像数据缓冲区的前三个字节是左上角像素的三个通道值,接下来的三个字节是第一行第二个像素的值,依此类推(默认情况下,OpenCV 使用 BGR 通道顺序)。宽度为 W、高度为 H 的图像需要一个大小为 WxHx3 个无符号字符(uchar)的内存块。不过,为了提高效率,每行的长度可能会用一些额外的像素进行填充。这是因为在某些情况下,当行的长度是 8 的倍数时,图像处理会更高效,这样能更好地与本地内存配置对齐。这些额外的像素不会被显示或保存,其具体值会被忽略。OpenCV 将填充行的长度称为有效宽度。显然,如果图像没有填充额外像素,有效宽度将等于图像的实际宽度。
以下是一些关键属性和方法:
- cols
和 rows
属性分别给出图像的宽度和高度。
- step
数据属性给出一行的有效宽度(以字节为单位)。
- elemSize
方法给出像素元素的大小。例如,对于一个 3 通道的短整数矩阵(CV_16SC3), elemSize
将返回 6。
- nchannels
方法给出图像的通道数(灰度图像为 1,彩色图像为 3)。
- total
方法返回矩阵中的总像素数。
每行的像素值数量可以通过以下代码计算:
int nc = image.cols * image.channels();