知识点
c++中的像素遍历与访问
-数组遍历
-指针方式便利
数组遍历
void QUickdemo::pixel_visit_demo(Mat& image)
{
int kuan = image.cols;
int gao = image.rows;
int tongdaoshu = image.channels();
for (int row = 0; row < gao; row++) {--遍历图像的宽和高
for (int cot = 0; cot < kuan; cot++) {
if (tongdaoshu == 1) { //灰度图像
int pv = image.at<uchar>(row,cot);//获取当前像素,像素点每个像素值是字节类型就是uchar转换为int类型
image.at<uchar>(row, cot) = 255 - pv;
}
if (tongdaoshu == 3) { //彩色图像
Vec3b BGR=image.at<Vec3b>(row, cot);//三个通道若为int型则是Vec3i 浮点型是vec3f,b是uchar类型
image.at<Vec3b>(row, cot)[0] = 255 - BGR[0];
image.at<Vec3b>(row, cot)[0] = 255 - BGR[1];
image.at<Vec3b>(row, cot)[0] = 255 - BGR[2];
}
}
}
namedWindow("像素演示", WINDOW_FREERATIO);
imshow("像素演示", image);
}
指针遍历
代码
void QUickdemo::pixel_visit_demo(Mat& image)
{
int kuan = image.cols;
int gao = image.rows;
int tongdaoshu = image.channels();
for (int row = 0; row < gao; row++)
{
uchar* current_row = image.ptr<uchar>(row);
for (int cot = 0; cot < kuan; cot++) {
if (tongdaoshu == 1) {
//灰度图像
//int pv = image.at<uchar>(row, cot);//获取当前像素,像素点每个像素值是字节类型就是uchar转换为int类型
int pv = *current_row;
*current_row++= 255 - pv;//current_row所指的位置取出一个值,取反,之后将结果存回该位置,并将指针移动到下一位置
}
if (tongdaoshu == 3) { //彩色图像
Vec3b BGR = image.at<Vec3b>(row, cot);//三个通道若为int型则是Vec3i 浮点型是vec3f,b是uchar类型
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}