c++中图像像素类型 :
uchar:灰度图像像素,单个值
Vec3b:彩色图像像素,3个值
单个像素的访问
pixel = image.at<uchar>(row, col);
opencv中图像像素读写操作:
c++中像素遍历方式:
1、数组遍历(for)
void QuickDemo::pixel_visit_Demo(Mat& image) {
int h = image.rows;
int w = image.cols;
int dims = image.channels();
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
if (dims == 1) {//灰度图像
int pv = image.at<uchar>(row, col);
image.at<uchar>(row, col) = 255 - pv;
}
if (dims == 3) {//彩色图像
Vec3b bgr = image.at<Vec3b>(row, col);
image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
}
}
}
namedWindow("像素读写演示", WINDOW_FREERATIO);
imshow("像素读写演示", image);
}
2、指针方式遍历(比for快一点)
void QuickDemo::pixel_visit_Demo(Mat& image) {
int h = image.rows;
int w = image.cols;
int dims = image.channels();
for (int row = 0; row < h; row++) {
uchar* curren_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++) {
if (dims == 1) {//灰度图像
int pv = *curren_row;
*curren_row++ = 255 - pv;
}
if (dims == 3) {//彩色图像
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
*curren_row++ = 255 - *curren_row;
}
}
}
namedWindow("像素读写演示", WINDOW_FREERATIO);
imshow("像素读写演示", image);
}
说明:
在每行的初始处创建的指针,uchar* curren_row = image.ptr<uchar>(row);
会在列循环(col层循环)中,随着*curren_row++ = 255 - pv;指令自动后移。
对于彩色图,对单个的像素点后移通道数量次数即可,如上++了三次。