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
将src1
和 src2
每个像素的像素值按位与,比如某位置对应两个像素值分别为:23
和 185
,则输出像素值为17
,因为23
,185
的二进制分别为10111
,10111001
,按位与得到10001
即17
。
/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
\newline
src1如下图:
\newline
src2如下图:
\newline
bitwise_and效果如下图:
2. bitwise_or
将src1
和 src2
每个像素的像素值按位或,比如某位置对应两个像素值分别为:23
和 185
,则输出像素值为191
,因为23
,185
的二进制分别为10111
,10111001
,按位或得到10111111
即191
。
/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
\newline
bitwise_o效果r如下图:
3. bitwise_not
将src
像素的像素值按位取非,比如某像素值为:23
,则输出像素值为232
,因为23
的二进制为10111
,按位取反得到11101000
即232
。
/* 输入 src 可为灰度图或彩色图;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
\newline
bitwise_not效果如下图:
4. bitwise_xor
将src1
和 src2
每个像素的像素值按位异或,比如某位置对应两个像素值分别为:23
和 185
,则输出像素值为177
,因为23
,185
的二进制分别为10111
,10111001
,按位异或得到10101110
即174
。
/* 输入 src1,src2,可为灰度图或彩色图,src1 和 src2 大小需一样;
** 输出 dst,尺寸和类型与 src 保持一致;
** 掩膜 mask,可通俗理解为一个遮罩,只对 mask 设定的有效区域进行操作;
*/
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());
\newline
bitwise_xor效果如下图:
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;
}
结果如下:
\newline
\newline
\newline
总结
主要记录bitwise_and
,bitwise_or
,bitwise_not
,bitwise_xor
的作用,帮助理解与使用。
更多推荐
所有评论(0)