OpenCV——图像按位运算

目录

OpenCV------图像按位运算由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

一、算法概述

1、逻辑运算

OpenCV4 针对两个图像之间的"与"、"或"、"异或"、以及"非"运算分别提供了bitwise_and()bitwise_or()bitwise_xor()bitwise_not()函数。图像像素间的逻辑运算与数字间的逻辑运算相同,具体规则见表1。图像的"非"运算只针对一个数值进行,因此在表1中对像素求非运算时对图像1的像素进行"非"运算。如果像素取值只有0和1,那么表1中的前4行数据正好对应了所有的运算规则,但是CV_8U类型的图像像素值从0取到255,此时的逻辑运算就需要将像素值转成二进制后再进行,因此CV_8U类型是8位数据,对0求非是11111111,也就是255.在表1的最后一行数据中,像素5对应的二进制为101,像素值6对应的二进制是110,因此"与"运算得100(4),"或"运算得011(3),对像素5进行非运算得11111010(250)。
表1 图像逻辑运算规则

| 图像数据类型 | 像素值1| 像素值2 |与|或|异或|非(图像)

| ------ | ------ | ------ |------ |------ |------ |------ |------ |------ |

| 二值 | 0 | 0 |0|0|0|1|

| 二值 | 1 | 0 |0|1|1|0|

| 二值 | 0 | 1 |0|1|1|1|

| 二值 | 1 | 1 |1|1|0|0|

| 8位 | 0 | 0 |0|0|0|255|

| 8位 | 5| 6 |4|7|3|250|

2、函数解析

cpp 复制代码
//像素求"与"运算
void bitwise_and(InputArray src1, 
                 InputArray src2,
                 OutputArray dst, 
                 InputArray mask = noArray());
 
//像素求"或"运算
void bitwise_or(InputArray src1, 
                InputArray src2,
                OutputArray dst, 
                InputArray mask = noArray());
 
//像素求"异或"运算
void bitwise_xor(InputArray src1, 
                 InputArray src2,
                 OutputArray dst, 
                 InputArray mask = noArray());
 
//像素求"非"运算
void bitwise_not(InputArray src, 
                 OutputArray dst,
                 InputArray mask = noArray());
  • src1:第一个图像矩阵,可以是多通道图像数据。
  • src2:第二个图像矩阵,尺寸、通道数和数据类型都需要与src1一致。
  • dst:逻辑运算输出结果,尺寸、通道数和数据类型都与src1一致。
  • mask:掩膜,用于设置图像或矩阵中逻辑运算的范围。

在进行逻辑运算时,一定要保证两个两个图像矩阵之间的尺寸、数据类型和通道数相同,多个通道进行逻辑运算时不同通道之间是独立运行的。

3、用途

按位运算的用途:比如要得到一个加logo的图像。如果将两幅图片直接相加会改变图片的颜色,如果用图像混合,则会改变图片的透明度,这时候就需要用按位操作,既不改变图像颜色,又不改变图像透明度,类似PS。

二、代码实现

cpp 复制代码
#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
    Mat img = imread("X8.jpg");
    if (img.empty())
    {
        cout << "请确认图像文件名称是否正确" << endl;
        return -1;
    }
    //1、创建两个黑白图像
    Mat img0 = Mat::zeros(200, 200, CV_8UC1);
    Mat img1 = Mat::zeros(200, 200, CV_8UC1);
    Rect rect0(50, 50, 100, 100);
    img0(rect0) = Scalar(255);
    Rect rect1(100, 100, 100, 100);
    img1(rect1) = Scalar(255);
    imshow("img0", img0);
    imshow("img1", img1);
    //-----------------------------------------------------------------
    // 在进行逻辑运算时,一定要保证两个两个图像矩阵之间的尺寸、数据类型
    // 和通道数相同,多个通道进行逻辑运算时不同通道之间是独立运行的。
    //-----------------------------------------------------------------
    //2、进行逻辑运算
    Mat myAnd, myOr, myXor, myNot, imgNot;
    bitwise_not(img0, myNot);       // 逻辑"非"运算
    bitwise_and(img0, img1, myAnd); // 逻辑"与"运算
    bitwise_or(img0, img1, myOr);   // 逻辑"或"运算
    bitwise_xor(img0, img1, myXor); // 逻辑"异或"运算
    bitwise_not(img, imgNot);       // 逻辑"非"运算
    imshow("myAnd", myAnd);
    imshow("myOr", myOr);
    imshow("myXor", myXor);
    imshow("myNot", myNot);
    imshow("img", img);
    imshow("imgNot", imgNot);
    waitKey(0);
    return 0;
}

三、结果展示

相关推荐
Bubluu8 分钟前
浏览器点击视频裁剪当前帧,然后粘贴到页面
开发语言·javascript·音视频
伊一大数据&人工智能学习日志12 分钟前
OpenCV计算机视觉 03 椒盐噪声的添加与常见的平滑处理方式(均值、方框、高斯、中值)
计算机视觉
御风@户外14 分钟前
质数生成函数、质数判断备份
算法·acm
湫ccc19 分钟前
《Opencv》基础操作详解(2)
人工智能·opencv·计算机视觉
羑悻的小杀马特19 分钟前
【AIGC篇】畅谈游戏开发设计中AIGC所发挥的不可或缺的作用
c++·人工智能·aigc·游戏开发
闻缺陷则喜何志丹27 分钟前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
CES_Asia28 分钟前
国资助力科技创新,闪耀CES Asia 2025
人工智能·科技·智能手机·智能音箱·智能电视
AI人H哥会Java29 分钟前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
前端Hardy37 分钟前
HTML&CSS:超炫丝滑的卡片水波纹效果
前端·javascript·css·3d·html
Dong雨38 分钟前
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
数据结构·算法·排序算法