OpenCV(cv::bitwise_not())
cv::bitwise_not()
是 OpenCV 中用于对图像或矩阵进行按位取反操作的函数。它将输入图像的每个像素的值进行按位反转,生成输出图像。按位取反是对每个位进行反转,即将二进制数中的 0 变为 1,1 变为 0。
1. 函数定义
void cv::bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
参数:
-
src
:输入图像或矩阵,类型可以是 8 位、16 位或 32 位整型、浮点型(单通道或多通道)。输入图像必须是单通道或多通道的矩阵。每个像素的每个位都会被反转。 -
dst
:输出图像或矩阵,大小和类型与输入图像src
相同。即dst
是按位反转后的结果图像。 -
mask
(可选):操作的掩码图像。类型为 8 位单通道图像。如果提供了mask
,则只有掩码中非零值对应的位置会被进行取反操作,其他地方保持不变。如果不提供掩码,整个图像的所有像素都会被反转。
2. 工作原理
cv::bitwise_not()
会对输入图像的每个像素值执行按位取反操作。如果输入图像是灰度图像,像素值为 0 到 255 的范围,取反后每个像素的值会变为 255 - 原像素值
。对于彩色图像,函数会对每个通道分别进行按位取反操作。
-
灰度图像的例子:
对于灰度图像,像素值为 8 位无符号整型 (0 到 255)。假设某个像素值是 100,它的二进制形式是01100100
,取反后变为10011011
,即255 - 100 = 155
。 -
彩色图像的例子:
对于彩色图像,cv::bitwise_not()
会对每个通道(R、G、B)分别进行操作。例如,某个像素值为(100, 150, 200)
,取反后变为(255-100, 255-150, 255-200)
,即(155, 105, 55)
。
3. 示例
#include <opencv2/opencv.hpp>
int main() {
// 读取输入图像
cv::Mat src = cv::imread("input.jpg", cv::IMREAD_COLOR);
// 检查图像是否成功加载
if (src.empty()) {
std::cout << "Error: Could not open or find the image!" << std::endl;
return -1;
}
// 创建输出图像
cv::Mat dst;
// 对图像进行按位取反操作
cv::bitwise_not(src, dst);
// 显示原图像和处理后的图像
cv::imshow("Original Image", src);
cv::imshow("Bitwise Not Image", dst);
// 等待按键
cv::waitKey(0);
return 0;
}
关键点总结:
cv::bitwise_not()
对图像的每个像素进行逐位取反。- 可以选择通过掩码
mask
控制操作的范围,只有掩码中非零的部分会被按位取反。 - 输入图像与输出图像必须大小和类型相同。
这个函数常用于图像处理中的一些特定操作,比如生成负片图像、在掩码中反转某些区域等。