OpenCV 图像像素的逻辑操作

一、知识点
1、图像像素的逻辑操作,指的是位操作bitwise,与、或、非、异或等。

2、位操作简介:

cpp 复制代码
  位1     位2     与and     或or     异或xor
  0       0        0        0         0
  0       1        0        1         1
  1       0        0        1         1
  1       1        1        1         0

3、void rectangle(InputOutputArray img, Rect rec, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0);

(1)、在图像上绘制或填充一个矩形。

(2)、参数说明:

img: 输入、输出参数,表示要绘制或填充矩形的图像。

rec: 定义了矩形左上角位置、宽、高。

color: 矩形线框或填充的颜色。

thickness: >0时表示矩形线框粗细,<0时表示填充矩形。

lineType: 线条的类型,如8连通、4连通。

shift: 点坐标中的小数位数。

4、void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

(1)、执行两个数组的位与操作。

(2)、参数说明:

src1: 第一个输入数组。

src2: 第二个输入数组。 src1和src2大小和类型得相同。

dst: 输出数组,src1 & src2的结果数组。

mask: 掩码数组,可选。 这个数组是8位单通道,且大小和输入数组相同,只有掩码中的非零元素对应的输入数组元素才会进行位与操作。 未指定掩码,则对整个输入数组进行位与操作。

5、void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

(1)、执行两个数组的位或操作。

(2)、参数说明:

src1: 第一个输入数组。

src2: 第二个输入数组。 src1和src2大小和类型得相同。

dst: 输出数组,src1 | src2的结果数组。

mask: 掩码数组,可选。 这个数组是8位单通道,且大小和输入数组相同,只有掩码中的非零元素对应的输入数组元素才会进行位或操作。 未指定掩码,则对整个输入数组进行位或操作。

6、void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

(1)、执行两个数组的异或操作。

(2)、参数说明:

src1: 第一个输入数组。

src2: 第二个输入数组。 src1和src2大小和类型得相同。

dst: 输出数组,src1 ^ src2的结果数组。

mask: 掩码数组,可选。 这个数组是8位单通道,且大小和输入数组相同,只有掩码中的非零元素对应的输入数组元素才会进行异或操作。 未指定掩码,则对整个输入数组进行异或操作。

7、void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());

(1)、取反数组的每一位。

(2)、参数说明:

src: 输入数组。

dst: 输出数组,!src的结果数组。

mask: 掩码数组,可选。 这个数组是8位单通道,且大小和输入数组相同,只有掩码中的非零元素对应的输入数组元素才会进行取反操作。 未指定掩码,则对整个输入数组进行取反操作。

二、示例代码:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>


int main()
{
    cv::Mat m1 = cv::Mat::zeros(256, 256, CV_8UC3);
    cv::Mat m2 = cv::Mat::zeros(256, 256, CV_8UC3);
    cv::rectangle(m1, cv::Rect(100, 100, 80, 80), cv::Scalar(255, 255, 0), -1, cv::LINE_8, 0);
    cv::rectangle(m2, cv::Rect(150, 150, 80, 80), cv::Scalar(0, 255, 255), -1, cv::LINE_8, 0);
    cv::imshow("m1", m1);
    cv::imshow("m2", m2);

    //两个矩形相交部分是(150, 150)到(180, 180)之间。

    //两个矩形相交部分经过与后, 结果为BGR(0, 255, 0); 图像其它像素经过与后,结果为BGR(0, 0, 0)。
    cv::Mat dst1;
    cv::bitwise_and(m1, m2, dst1);
    cv::imshow("bitwise_and", dst1);

    //两个矩形相交部分经过或后,结果为BGR(255, 255, 255); 两个矩形不相交部分原先是什么颜色, 或后结果仍为什么颜色; 图像其它像素经过或后,结果为BGR(0, 0, 0)。
    cv::Mat dst2;
    cv::bitwise_or(m1, m2, dst2);
    cv::imshow("bitwise_or", dst2);

    //两个矩形相交部分经过异或后,结果为BGR(255, 0, 255); 两个矩形不相交部分原先是什么颜色, 或后结果仍为什么颜色; 图像其它像素经过或后,结果为BGR(0, 0, 0)。
    cv::Mat dst3;
    cv::bitwise_xor(m1, m2, dst3);
    cv::imshow("bitwise_xor", dst3);

    //m1矩形经过非后,结果为BGR(0, 0, 255); 图像其它像素经过非后,结果为BGR(255, 255, 255)。
    cv::Mat dst4;
    cv::bitwise_not(m1, dst4);
    cv::imshow("bitwise_not", dst4);
    
    cv::waitKey(0);
    return 0;
}

运行结果:

相关推荐
机器之心14 分钟前
突破LLM遗忘瓶颈,谷歌「嵌套学习」让AI像人脑一样持续进化
人工智能·openai
Juchecar15 分钟前
利用AI辅助"代码考古“操作指引
人工智能·ai编程
Juchecar21 分钟前
AI时代,如何在人机协作中保持代码的清晰性与一致性
人工智能·ai编程
掘金安东尼38 分钟前
被权重出卖的“脏数据”:GPT-oss 揭开的 OpenAI 中文训练真相
人工智能
Orange_sparkle1 小时前
关于dify中http节点下载文件时,文件名不为原始文件名问题解决
人工智能·http·chatgpt·dify
王哈哈^_^1 小时前
【完整源码+数据集】蓝莓数据集,yolo11蓝莓成熟度检测数据集 3023 张,蓝莓成熟度数据集,目标检测蓝莓识别算法系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
盘古开天16661 小时前
通俗易懂:YOLO模型原理详解,从零开始理解目标检测
人工智能·yolo·目标检测
OpenBuild.xyz1 小时前
x402 生态系统:Web3 与 AI 融合的支付新基建
人工智能·web3
嵌入式老牛1 小时前
OpenCV 第10课 图像处理—阈值处理
图像处理·opencv·计算机视觉
王哈哈^_^1 小时前
【完整源码+数据集】高空作业数据集,yolo高空作业检测数据集 2076 张,人员高空作业数据集,目标检测高空作业识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪·视觉检测