OpenCV像素逻辑操作

引言

像素级逻辑操作是数字图像处理的核心技术之一,OpenCV提供了一套完整的位运算函数。本文将深入解析四种基础逻辑操作(AND/OR/NOT/XOR),并通过简单案例展示其在图像处理中的应用。

1:基础逻辑操作API

1.1 核心操作符

操作类型 函数原型 数学表达式 特性说明
AND bitwise_and(src1, src2, dst) dst = src1 & src2 保留共同亮区
OR bitwise_or(src1, src2, dst) dst = src1 src2
NOT bitwise_not(src, dst) dst = ~src 像素值取反
XOR bitwise_xor(src1, src2, dst) dst = src1 ^ src2 差异区域高亮

2:基础代码实现

2.1 基本操作示例

#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;

int main()
{
	cv::Mat srcImage=cv::imread("E:/image/lena.png");
	//逻辑非
	//Mat dst = ~srcImage;
	Mat dst;
	cv::bitwise_not(srcImage, dst); 
	imshow("原图", srcImage);
	imshow("逻辑非", dst);
	waitKey();
	cv::destroyAllWindows();

	//逻辑与
	Mat img1, img2;
	img1 = Mat::zeros(200, 200, CV_8UC3);
	img2 = Mat::zeros(200, 200, CV_8UC3);
	rectangle(img1, Rect(10, 10, 100, 100), Scalar(0, 255, 255), -1, 8);
	rectangle(img2, Rect(50, 50, 100, 100), Scalar(255, 255, 0), -1, 8);

	Mat dst1;
	bitwise_and(img1, img2, dst1);
	imshow("img1", img1);
	imshow("img2", img2);
	imshow("and", dst1);

	bitwise_or(img1, img2, dst1);
	imshow("or", dst1);

	bitwise_xor(img1, img2, dst1);
	imshow("xor", dst1);

	waitKey();
	cv::destroyAllWindows();
	return 0;
}

2.2 关键注意事项

  1. 输入图像必须具有相同尺寸和类型
  2. 彩色图像处理会分别作用于每个通道
  3. 可选的mask参数用于指定操作区域
  4. 支持运算符矩阵表达式:result = img1 & img2;

2.3 代码运行效果图

下图是逻辑非

在这里插入图片描述

下图是与、异或、并的结果。Scalar(0, 255, 255)和Scalar(255, 255, 0) 与后结果是(0,255,0)所以显示绿色;异或的结果是(255,0,255)所以中间相同的部分显示紫色;并的结果是(255,255,255)所以中间显示白色

在这里插入图片描述

3.图片逻辑运算应用

3.1 提取感兴趣区域 and

#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;

int main()
{
	cv::Mat srcImage=cv::imread("E:/image/lena.png");
	//与提取区域
	Mat img1 = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
	rectangle(img1, Rect(srcImage.rows/2-100, srcImage.cols/2-100, 300, 300), Scalar(255,255,255), -1, 8);
	Mat dst;
	bitwise_and(img1, srcImage, dst);

	imshow("mask",img1);
	imshow("dst", dst);
	waitKey();
	cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述

3.2 图片加密应用 xor

虽然这种加密比较简单但是执行效率高

#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;

int main()
{
	cv::Mat srcImage=cv::imread("E:/image/lena.png");

	//加密应用
	Mat key(srcImage.size(), srcImage.type());
	randu(key, Scalar::all(0), Scalar::all(256));
	imshow("key", key);

	// 对图像进行加密(按位异或)
	Mat img1;
	bitwise_xor(srcImage, key, img1);
	imshow("encryption", img1);

	// 对加密后的图像进行解密(再次按位异或)
	Mat img2;
	bitwise_xor(img1, key, img2);
	imshow("decryption", img2);

	waitKey();
	cv::destroyAllWindows();

	return 0;
}

在这里插入图片描述

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐