opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素

2023-05-13,,

动态地址访问像素:src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j) 

int b = src.at<Vec3b>(i, j)[0];
int g = src.at<Vec3b>(i, j)[1];
int r = src.at<Vec3b>(i, j)[2];

用来访问三通道图像的单个像素。对于三通道图像,每个像素存储了三个值,分别为蓝色、绿色、红色通道上的数值。

int gray_data = gray.at<uchar>(i, j);

用来访问灰度图像的单个像素。对于灰度图像,每个像素只存储一个值。

指针访问像素:src.ptr<uchar>(i) 

uchar* src_rows = src.ptr<uchar>(i);

申请一个指针指向每行第一个像素位置,用来遍历一行像素。

当图像为三色通道时,每个像素存储三个值,B、G、R,每行形如 B、G、R、B、G、R、B 。。。

当图像为灰度图像时,每个像素存储一个值。

代码示例:

//将图像手动转换为灰度图
//写法一:
#include<opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/1.jpg");
Mat diy_gray = Mat(src.size(), CV_8UC1);
for (int i = ; i < src.rows; i++) {
for (int j = ; j < src.cols; j++) {
int b = src.at<Vec3b>(i, j)[];
int g = src.at<Vec3b>(i, j)[];
int r = src.at<Vec3b>(i, j)[];
double gray_data = 0.114*b + 0.587*g + 0.299*r;
diy_gray.at<uchar>(i, j) =static_cast<uchar>(gray_data);
}
}
imshow("gray1", diy_gray);
waitKey();
} //写法二:
#include<opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/1.jpg");
Mat diy_gray = Mat(src.size(), CV_8UC1);
for (int i = ; i < src.rows; i++) {
uchar* src_rows = src.ptr<uchar>(i);
uchar* gray_rows = diy_gray.ptr<uchar>(i);
for (int j = ; j < src.cols*src.channels(); j += src.channels()) {
int b = src_rows[j];
int g = src_rows[j + ];
int r = src_rows[j + ];
double gray_data = 0.114*b + 0.587*g + 0.299*r;
gray_rows[j/src.channels()] = static_cast<uchar>(gray_data);
}
}
imshow("diy_gray", diy_gray);
printf("\n");
waitKey();
}

opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素的相关教程结束。

《opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素.doc》

下载本文的Word格式文档,以方便收藏与打印。