OpenCV4学习笔记(4)——像素逻辑操作及图像通道的分离与合并

这次要记录的是图像像素的逻辑操作和图像通道的分离与合并。

  1. 像素逻辑操作
/********************像素--逻辑操作********************/
	Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3);
	Rect rect1(100, 100, 100, 100);
	src1(rect1) = Scalar(0, 0, 255);			//将rect1区域变为red
	//Scalar(B, G, R)   设置三通道值,将图像设置成单一灰度和颜色
	Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);
	Rect rect2(150, 150, 100, 100);
	src2(rect2) = Scalar(0, 255, 255);			//将rect2区域变为green+red=yellow

	Mat dst_and, dst_or, dst_not, dst_xor;
	bitwise_and(src1, src2, dst_and);
	bitwise_or(src1, src2, dst_or);
	bitwise_xor(src1, src2, dst_xor);
	bitwise_not(image, dst_not);

	namedWindow("dst_and", WINDOW_AUTOSIZE);
	moveWindow("dst_and", 400, 200);
	imshow("dst_and", dst_and);
	namedWindow("dst_or", WINDOW_AUTOSIZE);
	moveWindow("dst_or", 500, 200);
	imshow("dst_or", dst_or);
	namedWindow("dst_xor", WINDOW_AUTOSIZE);
	moveWindow("dst_xor", 450, 200);
	imshow("dst_xor", dst_xor);
	namedWindow("dst_not", WINDOW_AUTOSIZE);
	moveWindow("dst_not", 550, 200);
	imshow("dst_not", dst_not);

首先生成了两张全黑的(400,400)的图像,然后分别在这两张图上绘制一个矩形,src1上绘制一个红色矩形,src2上绘制一个黄色矩形。两幅图的BGR值分别为(0,0,255)和(0,255,255)。
当对这两幅图进行与(and)操作时,得到的非交叉区域为全黑的(0,0,0),交叉区域则为红色(0,0,255):
在这里插入图片描述
当对两幅图像进行或(or)操作时,非交叉区域分别保持原有的颜色,而交叉部分变为黄色(0,255,255):
在这里插入图片描述
当对两幅图像进行异或(xor)操作时,非交叉区域保持原有颜色,而交叉部分变为绿色(0,255,0):
在这里插入图片描述
当对图像进行非(not)操作时,相当于对图像取反,得到一个类似于负片的效果,相当于之前在遍历图像时用255对每个像素值去做减法:
在这里插入图片描述
2.图像通道的分离和合并

/********************通道分离与合并********************/
	//vec3b 定义一个存放三通道灰度值的向量
	vector<Mat> vec_Mat;			//定义一个存放三通道三张图片的向量
	Mat image_B, image_G, image_R;
	Mat dst;
	split(image, vec_Mat);			//分离成3张单通道图
	vec_Mat[0] = Scalar(0);			//B通道灰度值为0
	image_B = vec_Mat[0];
	image_G = vec_Mat[1];
	image_R = vec_Mat[2];
	merge(vec_Mat, dst);			//三通道向量合并
	namedWindow("image_B", WINDOW_AUTOSIZE);
	moveWindow("image_B", 400, 200);
	imshow("image_B", image_B);
	namedWindow("image_G", WINDOW_AUTOSIZE);
	moveWindow("image_G", 400, 200);
	imshow("image_G", image_G);
	namedWindow("image_R", WINDOW_AUTOSIZE);
	moveWindow("image_R", 400, 200);
	imshow("image_R", image_R);
	namedWindow("dst", WINDOW_AUTOSIZE);
	moveWindow("dst", 400, 200);
	imshow("dst", dst);

图像通道的分离使用split()函数,第一个参数是输入图像,第二个参数则是存放三通道图像的一个Mat类型的向量。随后使用vec_Mat[0] = Scalar(0);将第零个元素的像素值置零,由于是按照B、G、R的顺序分离,所以也就是将B通道图置零,再依次输出三通道图像。
最后使用merge()函数将三通道图合并起来,第一个参数是存放三通道图像的一个Mat类型的向量,第二个参数则是输出图像。由于B通道被置零了,所以最后合并出来的图像将会偏黄一些(只有G和R通道),效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原图像:
原图像

总结:这次记录的两个小知识点虽然真的很小,但在后续的学习中,很多地方都会涉及到他们,所以还是需要能够熟练地使用这两个方法。好的这次就记录到这啦~下次有空继续!

PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

发布了36 篇原创文章 · 获赞 43 · 访问量 1822

猜你喜欢

转载自blog.csdn.net/weixin_45224869/article/details/104533192
今日推荐