基于C++的OpenCV4入门基础--图像运算

本文介绍了OpenCV4中基于C++的图像运算,包括cv2.add()函数进行基本的图像加法运算,以及cv2.addWeighted()函数进行加权加法运算。详细解释了函数参数及其应用场景,并提供了代码示例,帮助读者理解和应用这些函数进行图像叠加和混合操作。

1,函数 cv2.add() 用于图像的加法运算。

函数说明:

cv2.add(src1, src2, dst, mask, dtype) → dst

函数 cv2.add() 对两张相同大小和类型的图像进行加法运算,或对一张图像与一个标量进行加法运算。

两张图像相加时,将两张图像相同位置像素的各通道值或灰度值分别相加,可以理解为一种图像叠加方式;对一张图像与一个标量相加时,则将图像所有像素的各通道值分别与标量的各通道值相加。
参数说明:
scr1, scr2:进行加法运算的图像
dst:输出的图像,可选项,默认值为 None
mask:掩模图像,8位灰度格式;掩模图像数值为 0 的像素,输出图像对应像素的各通道值也为 0。可选项,默认值为 None
dtype:图像数组的深度,即每个像素值的位数,可选项

注意事项:
OpenCV 加法:cv2.add() 是饱和运算(相加后如大于 255 则结果为 255)。
使用 cv2.add() 函数对两张图片相加时,图片的大小和类型(通道数)必须相同
使用 cv2.add() 函数对一张图像与一个标量相加,标量是指一个 1x3 的 numpy 数组,相加后图像整体发白。

代码示例:

	Mat dst1, dst2, dst3, dst4;

	add(src1, src2, dst1);
	imshow("add-Demo", dst1);

2,函数 cv2.addWeight() 用于图像的加权加法运算。

函数说明:

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype) → dst 

函数 cv2.addWeighted() 对两张相同大小和类型的图像按权重相加,可以实现图像的叠加和混合。加权加法的计算表达式为:

dst = src1 * alpha + src2 * beta + gamma

参数说明:

scr1, scr2:ndarray 多维数组,表示一个灰度或彩色图像
alpha:第一张图像 scr1 的权重,通常取为 0~1 之间的浮点数
beta:第二张图像 scr2 的权重,通常取为 0~1 之间的浮点数
gamma: 灰度系数,图像校正的偏移量,用于调节亮度
dtype 输出图像的深度,即每个像素值的位数,可选项,默认等于 src1.depth()
返回值:dst,加权加法运算结果的图像数组
注意事项:
使用 cv2.addWeight() 函数对两张图片相加时,图片的大小和类型(通道数)必须相同
alpha,beta,gamma 可调,可以根据需要调整图像的权重,以达到不同的显示效果。推荐取 beta=1-alpha, gamma=0。

该接口可以实现图像亮度和对比度调整
PS: 黑色(0,0,0),白色(255,255,255),对RGB图像来说,亮度越大值越高,因此,通过增加像素值就可以提高亮度,反之减小亮度,而对比度体现的是图像的差异度,需要让图片的像素乘以某个值,增大差异就增大了对比度。
代码示例:

	//打开原始图片
    Mat src3 = imread("F:/code/images/kobe.jpg",IMREAD_COLOR);
	if (src3.empty()) {
		cout << "fail to read image" << endl;
		return -1;
	}
	imshow("input3", src3);
	
	//创建与原始图一样大小和类型的空像素图
	Mat black = Mat::zeros(Size(src3.size()), src3.type());
	//imshow("black", black);
	black = Scalar(127,127,127);

	//对原始图进行像素操作
	Mat dst;
	add(src3, black, dst);//给图片加亮
	subtract(src3, black,dst);//给图片减亮
	//imshow("dst", dst);

	Mat dst2;
	addWeighted(src3,1.5,black,0.5,0.0,dst2);//增加对比度
	addWeighted(src3, 1.5, black, -0.5, 0.0, dst2);
	addWeighted(src3, 0.5, black, 0.5, 0.0, dst2);//伪装一下透明度:原始图像素乘以0.5
	imshow("dst2", dst2);

3,像素信息统计
像素最大值与最小值:minMaxLoc ,此API只支持单通道的图像
求得单通道图像中,像素的最大值和最小值,以及他们分别的像素点位置坐标

	double min_val;
	double max_val;
	Point min_loc;
	Point max_loc;

	minMaxLoc(img, &min_val, &max_val, &min_loc, &max_loc);//注意,这个 img 要是单通道

	printf("min:%.2f,max:%.2f\n", min_val, max_val);
	printf("minloc:(%d,%d),maxloc:(%d,%d)\n", min_loc.x, min_loc.y,max_loc.x,max_loc.y);

像素均值和方差:mean meanStdDev

	Scalar s = mean(img);//获取三通道图像的均值
	printf("mean:%.2f,%.2f.%.2f\n", s[0],s[1],s[2]);

	Mat mm, mstd;
	meanStdDev(img, mm, mstd);//save 3 channels mean and stddev
	printf("mm:%.2f,%.2f,%.2f mstd:%.2f,%.2f,%.2f\n", mm.at<double>(0, 0),mm.at<double>(1, 0), mm.at<double>(2, 0), 
		mstd.at<double>(0, 0), mstd.at<double>(1, 0), mstd.at<double>(2, 0));

像素值信息统计:通过遍历像素值做统计
定义一个整型的 vector , 大小为256,因为像素值的大小是:0-255;然后通过遍历图像的像素值,在对应的vector位置上自加,实现统计,后续可以将统计结果通过直方图显示。

	//统计灰度图像
	vector<int> hist(256);
	for (int i = 0; i < 256; i++) {
		hist[i] = 0;
	}
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			int pv = img.at<uchar>(row, col);
			hist[pv]++;//统计不同像素点的数量,做直方图统计
		}
	}

你的鼓励将是我创作的最大动力
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤舟簔笠翁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值