目录
1 图像逻辑运算的介绍
在进行图像处理时有时需要对图像进行逻辑运算,为了方便进行计算,opencv中封装了对图像进行逻辑运算的API函数。进行逻辑运算时的两个矩阵一定是具有相同的数据类型和尺寸。opencv中封装的逻辑运算包括:与、或、非、异或四种。如下面所示。
API | 含义 |
bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray()) | 按位与 |
bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray()) | 按位或 |
bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray()) | 按位异或 |
bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray()) | 按位非 |
2 图像逻辑运算的数学原理
假设图像a、b的为3*3的二值图像,图像a、b中的像素值如下。
我们需要将图像中的像素值转为二进制,如下:
坐标 | 11 | 12 | 13 | 21 | 22 | 23 | 31 | 32 | 33 |
a | 00000000 | 11111111 | 00000000 | 00000000 | 00000000 | 11111111 | 11111111 | 11111111 | 00000000 |
b | 00000000 | 00000000 | 11111111 | 00000000 | 11111111 | 11111111 | 11111111 | 00000000 | 11111111 |
与 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 11111111 | 11111111 | 00000000 | 00000000 |
或 | 00000000 | 11111111 | 11111111 | 00000000 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111 |
异或 | 00000000 | 11111111 | 11111111 | 00000000 | 11111111 | 00000000 | 00000000 | 11111111 | 11111111 |
a非 | 11111111 | 00000000 | 11111111 | 11111111 | 11111111 | 00000000 | 00000000 | 00000000 | 11111111 |
b非 | 11111111 | 11111111 | 00000000 | 11111111 | 00000000 | 00000000 | 00000000 | 11111111 | 00000000 |
与运算的位都为1时,才为1,其他都为0,可用“&”操作符替代;
或运算的位都为0时,才为0,其他都为1,可用“|”操作符替代;
异或运算的位不同时为1, 位相同时为0,可用“^”操作符替代;
非运算按位取反,1取反0, 0取反为1,可用“~”操作符替代;
3 图像逻辑运算API详解
在opencv的逻辑运算中,或、与、异或的参数基本一致。
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())
其中:
InputArray src1,输入的图像1;
InputArray src2,输入的图像2;
OutputArray dst,输出的图像;
InputArray mask = noArray(),蒙板,蒙板的作用是限制进行逻辑运算的区域。
在opencv的逻辑运算中,“非”的输入参数只需要一张图像即可。
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray())
InputArray src1,输入的图像;
OutputArray dst,输出的图像;
InputArray mask = noArray(),蒙板,蒙板的作用是限制进行逻辑运算的区域。
4 图像逻辑运算代码实现
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("G:\\image\\lena.png");
if (src.empty())
{
cout << "could not load image" << endl;
}
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
Mat src1;
threshold(gray, src1, 100, 255, THRESH_BINARY);
Mat src2 = Mat::zeros(src1.size(), src1.type());
Mat src3 = Mat::zeros(src1.size(), src1.type());
//与操作
Mat src_and, src_and_mask;
bitwise_and(src1, src2, src_and);
//带蒙版的与操作
Rect rect = Rect(100, 100, 100, 100);
rectangle(src3, rect, Scalar(255), -1);
bitwise_and(src1, src3, src_and_mask);
//或操作
Mat src_or;
bitwise_or(src1, src2, src_or);
//与或操作
Mat src_xor;
bitwise_xor(src1, src2, src_xor);
//非操作
Mat src_not;
bitwise_not(src1, src_not);
imshow("与", src_and);
imshow("带蒙版与", src_and_mask);
imshow("或", src_or);
imshow("异或", src_xor);
imshow("非", src_not);
waitKey(0);
return 0;
}