OpenCV:对图像的位操作bitwise_and(与),bitwise_or(或),bitwise_not(非),bitwise_xor(异或)


前言

使用opencv对图像处理时,可能需要对图像按位操作,而opencv自带位操作运算函数,不必再手写遍历算法,位操作函数包括:
bitwise_and
bitwise_or
bitwise_not
bitwise_xor 异或


mask

关于掩膜mask请点击查看

\newline

像素按位操作函数

1. bitwise_and

src1src2每个像素的像素值按位与,比如某位置对应两个像素值分别为:23185,则输出像素值为17,因为23185的二进制分别为1011110111001,按位与得到1000117

/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

\newline
src1如下图:
src1

\newline

src2如下图:

src2.png

\newline

bitwise_and效果如下图:

and.png

2. bitwise_or

src1src2每个像素的像素值按位或,比如某位置对应两个像素值分别为:23185,则输出像素值为191,因为23185的二进制分别为1011110111001,按位或得到10111111191

/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

\newline

bitwise_o效果r如下图:

or.png

3. bitwise_not

src 像素的像素值按位取非,比如某像素值为:23,则输出像素值为232,因为23的二进制为10111,按位取反得到11101000232

/* 输入 src 可为灰度图或彩色图;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());

\newline

bitwise_not效果如下图:

not.png

4. bitwise_xor

src1src2每个像素的像素值按位异或,比如某位置对应两个像素值分别为:23185,则输出像素值为177,因为23185的二进制分别为1011110111001,按位异或得到10101110174

/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

\newline
bitwise_xor效果如下图:

xor.png

5.带掩膜操作

例如将src1中人头取反,其他保持不变,代码如下:

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
  Mat src1 = imread("img1.png", IMREAD_GRAYSCALE);
  Mat src2 = imread("img2.png", IMREAD_GRAYSCALE);
  cv::resize(src1, src1, Size(640, 480));
  cv::resize(src2, src2, Size(640, 480));
  imshow("src1", src1);
  imshow("src2", src2);
  // 将mask中包含人头的区域像素值设为255
  Mat mask = Mat::zeros(Size(640, 480), CV_8UC1);
  mask(Rect(320, 50, 260, 310)) = 255;

  Mat dst;
  // 只对人头取反
  bitwise_not(src1, dst, mask);
  imshow("mask1", mask);
  // 将mask反转,得到新的mask
  bitwise_not(mask, mask);
  imshow("mask2", mask);
  // 将src1中人头之外的区域拷贝到dst
  src1.copyTo(dst, mask);
  imshow("dst", dst);
  waitKey();

  return 0;
}

结果如下:

加载中,请稍后

mask1

\newline
加载中,请稍后
mask2

\newline
加载中,请稍后
dst

\newline


总结

主要记录bitwise_andbitwise_orbitwise_notbitwise_xor的作用,帮助理解与使用。

### 关于位运算符 XOR 的详细介绍 #### 定义功能 位运算符 `^` 被称为 **按位异或Bitwise XOR)** 运算符。它对两个整数的二进制表示形式中的每一位执行逻辑异或操作。如果对应的两位相同,则结果为 `0`;如果不同,则结果为 `1`[^2]。 #### 工作原理 假设我们有两个整数值 `a = 5` 和 `b = 3`,它们的二进制表示分别为: ```plaintext a = 5 -> 0101 (binary) b = 3 -> 0011 (binary) ``` 当应用 `^` 运算符时,逐位比较并计算如下: ```plaintext 0101 (a) XOR 0011 (b) --------- = 0110 (result in binary, equals to decimal 6) ``` 因此,`5 ^ 3` 的结果是 `6`。 #### 应用场景 按位异或运算符广泛应用于多种编程领域,包括但不限于数据加密、错误检测以及优化算法性能等方面。例如,在某些情况下可以通过两次相同的 XOR 操作来恢复原始数据,这一特性常用于简单的加密技术者交换变量值而无需额外存储空间的操作中[^1]。 以下是利用 Python 展示如何通过 XOR 实现两数互换的例子: ```python def swap_using_xor(a, b): print(f"Before swapping: a={a}, b={b}") a = a ^ b b = a ^ b a = a ^ b print(f"After swapping: a={a}, b={b}") swap_using_xor(7, 11) ``` 此代码片段展示了不借助临时变量完成两个整型变量之间值的交换过程。 #### 注意事项 尽管大多数现代计算机体系结构支持任意长度的数据类型作为输入参数参位级操作,但在硬件描述语言如 Verilog 中定义信号宽度尤为重要。如果不显式指定多比特宽信号,默认可能只分配单个比特给该信号[^3]。所以在涉及复杂电路设计时需特别留意这一点以免引发潜在问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fshinech

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

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

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

打赏作者

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

抵扣说明:

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

余额充值