项目功能实现:对图片像素点进行与或非操作
按照之前的博文结构来,这里就不在赘述了
在OpenCV中,颜色是(B,G,R)通道排列
一、头文件
yuhuofei.h
定义一个YUHUOFEI类,里面声明了一个yuhuofei方法
#pragma once#include<opencv2/opencv.hpp>using namespace cv;class YUHUOFEI {public:void yuhuofei(Mat& image);
};
二、函数实现
yuhuofei.h
Mat y1 = Mat::zeros(Size(256, 256), CV_8UC3);
生成一张全为0的大小为256*256像素的8位无符号三通道的彩色图片
CV_8UC3,8位(8)、无符号字符(unsigned char,UC)、三通道(3)
rectangle(y1, Rect(50, 50, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
参数一:在y1的基础绘制个矩形
参数二:Rect(起始x位置,起始y位置,高,宽)
参数三:Scalar(B,G,R)
参数四:绘制方式,若为-1表示填充,之外数字越大线条越粗
参数五:LINE_AA:反锯齿,效果好,但是反应速度慢、LINE_8(常用):以周围8个像素为基准进行消除因线段而产生的锯齿
参数六:锯齿的偏移量,微调,默认为0就行
#include"yuhuofei.h"
#include<iostream>
#include<opencv2/opencv.hpp>void YUHUOFEI::yuhuofei(Mat& image) {Mat y1 = Mat::zeros(Size(256, 256), CV_8UC3);Mat y2 = Mat::zeros(Size(256, 256), CV_8UC3);Mat result_and,result_or,result_not, result_not_1, result_xor;rectangle(y1, Rect(50, 50, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);rectangle(y2, Rect(80, 80, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);/*参数一:对y1这个图像进行操作参数二:Rect(初始横坐标,初始纵坐标,高,宽)参数三:Scalar填充或绘制的线条颜色参数四:-1的话表示填充,其他数字表示绘制线条的宽度参数五:LINE_AA:反锯齿,效果好,但是反应速度慢、LINE_8:以周围8个像素为基准进行消除因线段而产生的锯齿参数六:锯齿的偏移量,微调*/imshow("y1", y1);imshow("y2", y2);bitwise_and(y1, y2, result_and);//与操作,有0则0bitwise_or(y1, y2, result_or);//或操作,有1则1//或操作其实就是按位取反而已,下面俩个操作效果等价bitwise_not(image,result_not); //按位取反,0变成1,1变成0result_not_1 = ~image;bitwise_xor(y1,y2,result_xor);//异或操作,相同为0,相异为1imshow("and", result_and);imshow("or", result_or);imshow("not", result_not);imshow("not_1", result_not_1);imshow("xor", result_xor);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "yuhuofei.h"using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);if (src.empty()) {printf("load image is false...\n");return -1;}namedWindow("yanyu", WINDOW_FREERATIO);imshow("yanyu", src);YUHUOFEI yy;yy.yuhuofei(src);waitKey(0);destroyAllWindows();return 0;
}
项目结构如图所示:
运行效果如下:
解释:
①对于y1图像而言
Mat y1 = Mat::zeros(Size(256, 256), CV_8UC3);
rectangle(y1, Rect(50, 50, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
y1的大小为256*256
大小的像素值全0的黑色三颜色通道的图片
且在起始位置(50,50)
处开始,高和宽均为80
像素,颜色为B=255、G=255、R=0
,最终显示为天蓝色
故y1的效果图如下所示:
②对于y2图像而言
同理,
Mat y2 = Mat::zeros(Size(256, 256), CV_8UC3);
rectangle(y2, Rect(80, 80, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
y2的大小为256*256
大小的像素值全0的黑色三颜色通道的图片
且在起始位置(80,80)
处开始,高和宽均为80
像素,颜色为B=0、G=255、R=255
,最终显示为黄色
故y2的效果图如下所示:
③AND与操作
与操作,有0则0,除相交区域以外都为黑色,因为黑色为0
对于相交区域而言
B | G | R | |
---|---|---|---|
y1 | 255 | 255 | 0 |
y2 | 0 | 255 | 255 |
255按位展开为:1111 1111
对于B这个通道,相与之后结果为0
对于G这个通道,相与之后结果为255
对于R这个通道,相与之后结果为0
故最终的颜色为(0,255,0),为绿色
④OR或操作
或操作,有1则1,因为底色为全0的黑色,这里的或操作相当于神经网络语义分割里面的交并比IOU
未相交的地方颜色保持原有颜色不变
相交地方进行或操作
B | G | R | |
---|---|---|---|
y1 | 255 | 255 | 0 |
y2 | 0 | 255 | 255 |
255按位展开为:1111 1111
对于B这个通道,相或之后结果为255
对于G这个通道,相或之后结果为255
对于R这个通道,相或之后结果为255
故最终的颜色为(255,255,255),为白色
⑤NOT非操作
按位取反,0变为1,1变成0
非操作是单目运算符
也可以通过取反符号~
进行操作
result_not和result_not_1是等价的
bitwise_not(image,result_not); //按位取反,0变成1,1变成0
result_not_1 = ~image;
原图:
result_not:
result_not_1:
⑥异或XOR操作
异或:相异为1,相同为0
因为底色是全为0的黑色,故除了相交的区域之外,其他的区域保持原色彩不变
相交的区域进行异或即可
B | G | R | |
---|---|---|---|
y1 | 255 | 255 | 0 |
y2 | 0 | 255 | 255 |
255按位展开为:1111 1111
对于B这个通道,异或之后结果为255
对于G这个通道,异或之后结果为0
对于R这个通道,异或之后结果为255
故最终的颜色为(255,0,255),为紫色