使用 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中文网其他相关文章!