这次要记录的是图像像素的逻辑操作和图像通道的分离与合并。
- 像素逻辑操作
/********************像素--逻辑操作********************/
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:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!