3.图像的逻辑运算

目录

        1 图像逻辑运算的介绍

        2 图像逻辑运算的数学原理

        3 图像逻辑运算API详解

        4 图像逻辑运算代码实现

        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中的像素值如下。

a=\begin{bmatrix} 0 & 255&0 \\ 0& 0 & 255\\ 225&255 & 0 \end{bmatrix}

b=\begin{bmatrix} 0 & 0&255 \\ 0& 255 & 255\\ 225&0 & 255 \end{bmatrix}

        我们需要将图像中的像素值转为二进制,如下:

坐标111213212223313233
a000000001111111100000000000000000000000011111111111111111111111100000000
b000000000000000011111111000000001111111111111111111111110000000011111111
000000000000000000000000000000000000000011111111111111110000000000000000
000000001111111111111111000000001111111111111111111111111111111111111111
异或000000001111111111111111000000001111111100000000000000001111111111111111
a非111111110000000011111111111111111111111100000000000000000000000011111111
b非111111111111111100000000111111110000000000000000000000001111111100000000

        与运算的位都为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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别叭叭儿—好好学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值