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

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。基于C++的OpenCV4入门基础–图像运算,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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() 函数对一张图像与一个标量相加,标量是指一个 1×3 的 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]++;//统计不同像素点的数量,做直方图统计
		}
	}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182023.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!