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

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

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

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),为紫色
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479900.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【XR806开发板试用】+移植rosserial到XR806

1 XR806简介 板子来源于极术社区的试用&#xff0c;XR806的在线网址 其主要参数&#xff1a; 主控XR806AF2LDDRSIP 288KB SRAM存储SIP 160KB Code ROM. SIP 16Mbit Flash.天线板载WiFi/BT双天线&#xff0c;可共存按键reboot按键 1&#xff0c;功能按键 1灯红色电源指示灯 1…

【计算机考研】408系统学习法

计算机专业课基本上都是数据结构&#xff0c;计算机组成原理&#xff0c;计算机网络和操作系统中的内容 如果你考的学校是自命题&#xff0c;那么考察的专业课一般比较少&#xff0c;只有1-3门&#xff0c;比较顶尖的学校自命题考的比408还要难。如果考的是408&#xff0c;那么…

学习鸿蒙基础(5)

一、honmonyos的page路由界面的路径 新建了一个page,然后删除了。运行模拟器的时候报错了。提示找不到这个界面。原来是在路由界面没有删除这个page。新手刚接触找了半天才找到这个路由。在resources/base/profile/main_pages.json 这个和微信小程序好类似呀。 吐槽&#xf…

python OpenCV:seamlessClone泊松融合

一、seamlessClone函数的用法 翻译 https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/ def seamlessClone(src, dst, mask, p, flags, blendNone): # real signature unknown; restored from __doc__"""seamlessClone(src, dst, mask, …

Django后台管理(一)

一、admin介绍 Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站上的内容 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/admin/ 提示 后台管理系统是管理人员使用,不是…

Spring6学习技术|IoC+基于xml管理bean

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; IoC 控制反转。是一种设计思想。 1.获取bean对象的方法 通过id&#xff0c;通过class&#xff0c;和双重方式。 ApplicationContext context new Cla…

opencv图像处理(一)

一. OpenCV 简介 OpenCV 是一个跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 应用领域 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、…

宝塔nginx配置SpringBoot服务集群代理

宝塔nginx配置SpringBoot服务集群代理 1、需求&#xff1a; 现有一个springboot服务需要部署成集群&#xff0c;通过nginx负载均衡进行访问&#xff0c;其中这个springboot服务内置了MQTT服务、HTTP服务、TCP服务。 MQTT服务开放了1889端口 HTTP服务开放了8891端口 HTTP服务开…

Laravel02 路由基本概念和用法 给视图传递请求参数

Laravel02 路由基本概念和用法 1. 路由的基本概念2. 给视图传递请求参数 1. 路由的基本概念 routes文件夹下的web.php是用来定义路由规则的。 自己定义一个路径 2. 给视图传递请求参数 在laravel里使用一个辅助函数request来快速获取请求参数

OpenGL学习——17.模型

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

python+selenium 定位到元素,无法点击的解决方法

今天小编就为大家分享一篇pythonselenium 定位到元素,无法点击的解决方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小编过来看看吧 selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75, 22)…

LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)

【LetMeFly】429.N 叉树的层序遍历&#xff1a;广度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;…