opencv c++ 图像像素的算术操作(5)

该博客介绍了如何在OpenCV中进行图像的加、减、除和乘法操作。直接使用Scalar可以实现加、减、除,但乘法则需要使用multiply函数。此外,文章还展示了手动实现加法操作的代码,并强调了saturate_cast函数在确保像素值在0~255范围内的作用。

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

直接加、减、除:

Mat QuickDemo::operate_Demo(Mat& image) {
	Mat dst;
	dst = image + Scalar(50, 50, 50);
	//imshow("add operation", dst);
	return dst;
}

主函数部分:

int main(int argc, char** argv) {
	Mat my_image = imread(filepath);
	
	if (my_image.empty()) {
		cout << "error!" << endl;
		return -1;
	}

	imshow("input window", my_image);
	QuickDemo qd;
	Mat image2 = qd.operate_Demo(my_image);
	imshow("add operation", image2);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

运行结果:

 除加法外,还可以直接使用对应的减法、除法:

dst = image/ Scalar(2, 2, 2);

dst = image -  Scalar(50, 50, 50);

但是,当使用乘法时会报错:

dst = image* Scalar(2, 2, 2);//会报错

 

算术操作函数

 此时,有专门的函数来完成乘法操作:

multiply(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)

同理也有加法,减法,除法的函数:

add(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)

subtract(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)

divide(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)

 函数如下:

Mat QuickDemo::operate_Demo(Mat& image) {
	Mat dst;
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(2, 2, 2);
	multiply(image, m, dst);
    //add(image, m, dst);
	//subtract(image, m, dst);
	//divide(image, m, dst);
	
	return dst;
}

额外说明:

下述代码为具体矩阵加法实现代码,其中saturate_cast函数为限定函数,能把像素值限定在0~255内。

Mat QuickDemo::operate_Demo(Mat& image) {
	Mat dst;
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(50, 50, 50);
	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++) {
			Vec3b p1 = image.at<Vec3b>(row, col);
			Vec3b p2 = m.at<Vec3b>(row, col);
			//saturate_cast函数,可以把像素值限定在0~255
			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);
			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[0] + p2[0]);
			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[0] + p2[0]);
			}
		}
	return dst;
}

总结:

一般加减法、除法操作可以直接通过Scalar完成,也可以通过add,subtract, divide完成,而乘法操作只能通过multiply函数完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值