十、图像像素点的与、或、非、异或操作

项目功能实现:对图片像素点进行与或非操作
按照之前的博文结构来,这里就不在赘述了

在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则0

	bitwise_or(y1, y2, result_or);//或操作,有1则1

	//或操作其实就是按位取反而已,下面俩个操作效果等价
	bitwise_not(image,result_not); //按位取反,0变成1,1变成0
	result_not_1 = ~image;

	bitwise_xor(y1,y2,result_xor);//异或操作,相同为0,相异为1

	imshow("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
对于相交区域而言

BGR
y12552550
y20255255

255按位展开为:1111 1111
对于B这个通道,相与之后结果为0
对于G这个通道,相与之后结果为255
对于R这个通道,相与之后结果为0
故最终的颜色为(0,255,0),为绿色
在这里插入图片描述

④OR或操作

或操作,有1则1,因为底色为全0的黑色,这里的或操作相当于神经网络语义分割里面的交并比IOU

未相交的地方颜色保持原有颜色不变

相交地方进行或操作

BGR
y12552550
y20255255

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的黑色,故除了相交的区域之外,其他的区域保持原色彩不变

相交的区域进行异或即可

BGR
y12552550
y20255255

255按位展开为:1111 1111
对于B这个通道,异或之后结果为255
对于G这个通道,异或之后结果为0
对于R这个通道,异或之后结果为255
故最终的颜色为(255,0,255),为紫色
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

beyond谚语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值