opencv c++ 图像像素的读写(4)

本文介绍C++中使用OpenCV库进行图像像素读写的方法,包括灰度图像和彩色图像的单个像素访问及批量修改。通过两种遍历方式:数组遍历和指针遍历实现图像像素的反转效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;指令自动后移

对于彩色图,对单个的像素点后移通道数量次数即可,如上++了三次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值