【Opencv&Cpp】04 像素下的图像:图像像素的读写操作、反色操作

本文详细介绍了C++中OpenCV库如何进行图像像素的读写,包括灰度图像的单通道操作和彩色图像的三通道处理,通过`at`函数和指针遍历两种方式实现像素值的修改。

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

mat.at<uchar>(row, col)

mat.at<Vec3b>(row, col)

image.ptr<uchar>(row)

 图像像素的读写操作主要是像素遍历与访问

  • 数组遍历
  • 指针遍历

数组遍历

灰度图像

int pv = image.at<uchar>(row, col); //读取图片像素灰度值
image.at<uchar>(row, col) = 255 - pv;   //取反

彩色图像

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];

int w = image.cols; //列数
	int h = image.rows;//行数
	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];
			}
		}
	}

指针遍历

for (int row = 0; row < h; row++) {
		uchar* current_row = image.ptr<uchar>(row);
		for (int col = 0; col < w; col++) {
			if (dims == 1) { // 灰度图像
				int pv = *current_row;
				*current_row++ = 255 - pv;  // 赋值之后,指针后移
			}
			if (dims == 3) { // 彩色图像
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
			}
		}
	}

结果一样

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值