OpenCV Vec3b类型用法
Vec3b 是 OpenCV 中非常重要的一个模板类,让我详细解释一下:
Vec3b 的基本概念
Vec3b 是一个3元素的向量(vector),专门用于表示像素值:
- Vec:向量(Vector)
- 3:3个元素
- b:
uchar类型(unsigned char,0-255范围)
等效定义
typedef Vec<uchar, 3> Vec3b;
这相当于:
struct Vec3b {uchar val[3]; // 3个uchar类型的数组
};
在图像处理中的用途
1. 访问彩色图像像素
Mat colorImage = imread("image.jpg"); // 读取彩色图像(BGR格式)// 访问第i行第j列的像素
Vec3b pixel = colorImage.at<Vec3b>(i, j);// 访问三个通道的值
uchar blue = pixel[0]; // B通道
uchar green = pixel[1]; // G通道
uchar red = pixel[2]; // R通道// 或者使用成员变量方式访问
uchar b = pixel.val[0]; // B通道
uchar g = pixel.val[1]; // G通道
uchar r = pixel.val[2]; // R通道
2. 修改像素值
// 将像素设置为纯红色
colorImage.at<Vec3b>(i, j) = Vec3b(0, 0, 255); // (B, G, R)// 或者逐个设置
Vec3b& pixel = colorImage.at<Vec3b>(i, j);
pixel[0] = 0; // B = 0
pixel[1] = 0; // G = 0
pixel[2] = 255; // R = 255
Vec3b 的其他变体
OpenCV 提供了多种类似的向量类型:
Vec2b // 2个uchar元素
Vec3b // 3个uchar元素(最常用,用于彩色图像)
Vec4b // 4个uchar元素(带alpha通道)Vec3i // 3个int元素
Vec3f // 3个float元素
Vec3d // 3个double元素
实际应用示例
#include <opencv2/opencv.hpp>
using namespace cv;void vec3bExample() {Mat image = imread("color_image.jpg");// 遍历图像并操作Vec3b像素for (int i = 0; i < image.rows; i++) {for (int j = 0; j < image.cols; j++) {Vec3b& pixel = image.at<Vec3b>(i, j);// 增强红色通道if (pixel[2] + 50 < 255) {pixel[2] += 50; // R通道增加} else {pixel[2] = 255;}// 或者直接创建新的Vec3b// image.at<Vec3b>(i, j) = Vec3b(100, 150, 200);}}imshow("Processed Image", image);waitKey(0);
}
与灰度图像对比
// 灰度图像使用 uchar
Mat grayImage = imread("image.jpg", 0);
uchar pixelValue = grayImage.at<uchar>(i, j);// 彩色图像使用 Vec3b
Mat colorImage = imread("image.jpg", 1);
Vec3b pixelValues = colorImage.at<Vec3b>(i, j);
总结
Vec3b 是:
- OpenCV 中表示彩色像素的标准方式
- 一个包含3个
uchar(0-255)的结构 - 按 BGR 顺序存储(OpenCV的默认顺序)
- 用于
Mat::at<>模板方法中访问彩色图像像素
理解 Vec3b 对于在 OpenCV 中进行像素级操作至关重要!
