【OpenCV + VS】图像的像素位运算

        在图像处理中,逻辑运算是非常常见的操作之一。通过像素位的逻辑运算,我们可以执行一些有趣的图像处理效果,例如结合两幅图像的特定区域、反转图像或提取图像的某些部分。OpenCV 提供了一些常用的函数来进行这些操作,比如
bitwise_and()

bitwise_or()

bitwise_xor()

bitwise_not()
等。

1. 准备工作

首先,确保你的环境已经安装了 OpenCV。我们将通过 OpenCV 进行基本的图像加载、显示和位运算。

2. 基本的位运算介绍

OpenCV 中提供了以下四个主要的位运算函数:


bitwise_and()
:按位与操作,只有两个输入图像相应位置的像素都为 1 时,结果像素才为 1。


bitwise_or()
:按位或操作,只要两个输入图像相应位置的像素有一个为 1,结果像素就为 1。


bitwise_xor()
:按位异或操作,只有两个输入图像相应位置的像素不同(一个为 1,另一个为 0)时,结果像素才为 1。


bitwise_not()
:按位取反操作,反转图像的每个像素位,0 变为 1,1 变为 0。

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. 代码解析

图像创建:


Mat::zeros(Size(256, 256), CV_8UC3)
:创建一个 256×256 的图像,并且每个像素包含 3 个通道(即彩色图像)。默认情况下图像是黑色的(即所有像素值为 0)。

绘制矩形:


rectangle()
:在
m1

m2
上分别绘制不同颜色的矩形。
Rect(100, 100, 80, 80)
定义了矩形的位置和大小,
Scalar(255, 255, 0)
定义了颜色(蓝色)。

显示图像:


imshow()
:用来显示图像。我们用
imshow("m1", m1)
来显示
m1
,用
imshow("m2", m2)
来显示
m2

位运算:


bitwise_xor(m1, m2, dst)
:执行按位异或(XOR)操作。此操作对每个像素位执行:

如果两个像素位相同(都为 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;
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
乐熠的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容