08.OpenCV像素逻辑操作
像素级逻辑操作是数字图像处理的核心技术之一,OpenCV提供了一套完整的位运算函数。本文将深入解析四种基础逻辑操作(AND/OR/NOT/XOR),并通过5个实际案例展示其在图像处理中的强大应用。
·
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 关键注意事项
- 输入图像必须具有相同尺寸和类型
- 彩色图像处理会分别作用于每个通道
- 可选的mask参数用于指定操作区域
- 支持运算符矩阵表达式:
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;
}

更多推荐

所有评论(0)