动态地址访问像素: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 = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; 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];
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(0);
}
//写法二:
#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 = 0; i < src.rows; i++) {
uchar* src_rows = src.ptr<uchar>(i);
uchar* gray_rows = diy_gray.ptr<uchar>(i);
for (int j = 0; j < src.cols*src.channels(); j += src.channels()) {
int b = src_rows[j];
int g = src_rows[j + 1];
int r = src_rows[j + 2];
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("
");
waitKey(0);
}