在图像处理中,逻辑运算是非常常见的操作之一。通过像素位的逻辑运算,我们可以执行一些有趣的图像处理效果,例如结合两幅图像的特定区域、反转图像或提取图像的某些部分。OpenCV 提供了一些常用的函数来进行这些操作,比如 、
bitwise_and()、
bitwise_or() 和
bitwise_xor() 等。
bitwise_not()
1. 准备工作
首先,确保你的环境已经安装了 OpenCV。我们将通过 OpenCV 进行基本的图像加载、显示和位运算。
2. 基本的位运算介绍
OpenCV 中提供了以下四个主要的位运算函数:
:按位与操作,只有两个输入图像相应位置的像素都为 1 时,结果像素才为 1。
bitwise_and()
:按位或操作,只要两个输入图像相应位置的像素有一个为 1,结果像素就为 1。
bitwise_or()
:按位异或操作,只有两个输入图像相应位置的像素不同(一个为 1,另一个为 0)时,结果像素才为 1。
bitwise_xor()
:按位取反操作,反转图像的每个像素位,0 变为 1,1 变为 0。
bitwise_not()
3. 示例代码:简单的图像逻辑操作
我们将创建两幅图像 和
m1,它们分别包含不同颜色的矩形。然后,我们通过逻辑运算符对这两幅图像进行操作,并展示结果。
m2
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void bitwise_demo(Mat& image) {
// 创建两幅全黑的图像
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
// 在 m1 上画一个蓝色矩形(坐标:100,100,大小:80x80)
rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
// 在 m2 上画一个黄色矩形(坐标:150,150,大小:80x80)
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
// 显示两幅图像
imshow("m1", m1);
imshow("m2", m2);
Mat dst; // 结果图像
// 使用位异或(XOR)操作
bitwise_xor(m1, m2, dst);
// 显示处理结果
imshow("像素位操作", dst);
}
4. 代码解析
图像创建:
:创建一个 256×256 的图像,并且每个像素包含 3 个通道(即彩色图像)。默认情况下图像是黑色的(即所有像素值为 0)。
Mat::zeros(Size(256, 256), CV_8UC3)
绘制矩形:
:在
rectangle() 和
m1 上分别绘制不同颜色的矩形。
m2 定义了矩形的位置和大小,
Rect(100, 100, 80, 80) 定义了颜色(蓝色)。
Scalar(255, 255, 0)
显示图像:
:用来显示图像。我们用
imshow() 来显示
imshow("m1", m1),用
m1 来显示
imshow("m2", m2)。
m2
位运算:
:执行按位异或(XOR)操作。此操作对每个像素位执行:
bitwise_xor(m1, m2, dst)
如果两个像素位相同(都为 0 或都为 1),则结果为 0;
如果两个像素位不同(一个为 0,一个为 1),则结果为 1。
显示结果:
:显示位操作后的结果。
imshow("像素位操作", dst)
5. 其他常见的逻辑运算
除了 ,你还可以使用其他位运算函数来执行不同的逻辑操作:
bitwise_xor
:只有两个矩形的重叠区域会保留,其他部分会变成黑色。
bitwise_and()
bitwise_and(m1, m2, dst);
imshow("按位与操作", dst);
:两个矩形区域合并在一起,重叠部分保留,其他部分也会显示出来。
bitwise_or()
bitwise_or(m1, m2, dst);
imshow("按位或操作", dst);
:将图像反转,图像的所有像素值都会被取反。颜色变得与原始图像完全相反。
bitwise_not()
bitwise_not(m1, dst);
imshow("按位取反操作", dst);
6. 实际应用
逻辑位运算在图像处理中的应用非常广泛,以下是几个常见的应用场景:
图像融合:通过 或
bitwise_or() 可以将两张图像的某些部分融合在一起。
bitwise_and()
图像遮罩:通过逻辑运算,你可以创建一个图像的遮罩,进而对图像的特定区域进行处理。例如, 可以提取两个图像的重叠区域。
bitwise_and()
图像分割:通过 等运算,可以有效地分割图像中的不同区域。
bitwise_xor()
7. 演示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void bitwise_demo(Mat& image) {
// 创建两幅全黑的图像
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
// 在 m1 上画一个蓝色矩形(坐标:100,100,大小:80x80)
rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
// 在 m2 上画一个黄色矩形(坐标:150,150,大小:80x80)
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
// 显示两幅图像
imshow("m1", m1);
imshow("m2", m2);
Mat dst; // 结果图像
// 使用位异或(XOR)操作
bitwise_xor(m1, m2, dst);
// 显示处理结果
imshow("像素位操作", dst);
bitwise_and(m1, m2, dst);
imshow("按位与操作", dst);
bitwise_or(m1, m2, dst);
imshow("按位或操作", dst);
bitwise_not(m1, dst);
imshow("按位取反操作", dst);
bitwise_not(m2, dst);
imshow("按位取反操作", dst);
}
int main() {
Mat src = cv::imread(PicPath);
bitwise_demo(src);
waitKey(0); // 等待用户按键
destroyAllWindows(); // 关闭所有窗口
return 0;
}














暂无评论内容