OpenCV(cv::bitwise_not())



cv::bitwise_not() 是 OpenCV 中用于对图像或矩阵进行按位取反操作的函数。它将输入图像的每个像素的值进行按位反转,生成输出图像。按位取反是对每个位进行反转,即将二进制数中的 0 变为 1,1 变为 0。



1. 函数定义

void cv::bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());

参数:

  1. src:输入图像或矩阵,类型可以是 8 位、16 位或 32 位整型、浮点型(单通道或多通道)。输入图像必须是单通道或多通道的矩阵。每个像素的每个位都会被反转。

  2. dst:输出图像或矩阵,大小和类型与输入图像 src 相同。即 dst 是按位反转后的结果图像。

  3. 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 控制操作的范围,只有掩码中非零的部分会被按位取反。
  • 输入图像与输出图像必须大小和类型相同。

这个函数常用于图像处理中的一些特定操作,比如生成负片图像、在掩码中反转某些区域等。



posted @ 2024-09-21 12:10  做梦当财神  阅读(103)  评论(0编辑  收藏  举报