使用 OpenCV 时,访问特定像素的通道值对于图像处理任务至关重要。本文解决了一个常见问题:“如何获取特定像素的通道值?”
假设 Mat 对象 foo 表示的图像采用常用的 8 位格式每个通道 (CV_8UC3) 格式,获取通道值需要以下内容步骤:
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process B, G, and R values here... } }
在此代码中,Vec3b 表示一个 3 通道向量,其中每个通道对应于蓝色、绿色和红色 (BGR) 值。
性能优化:
出于性能原因,直接访问数据缓冲区可能是首选:
uint8_t* pixelPtr = (uint8_t*)foo.data; int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R // Process B, G, and R values here... } }
或者,可以使用基于行的访问:
int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for(int i = 0; i < foo.rows; i++) { uint8_t* rowPtr = foo.row(i); for(int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = rowPtr[j*cn + 0]; // B bgrPixel.val[1] = rowPtr[j*cn + 1]; // G bgrPixel.val[2] = rowPtr[j*cn + 2]; // R // Process B, G, and R values here... } }
通过遵循这些方法,您可以高效地检索各种图像处理任务的各个像素的通道值在 OpenCV 中。
以上是如何访问 OpenCV Mat 图像中特定像素的通道值?的详细内容。更多信息请关注PHP中文网其他相关文章!