• OpenCV入门3:像素操作


    OpenCV中,图像的像素值是以一个多维数组的形式表示的。上一篇已经介绍了cv::Mat类。对于图像中的每一个像素,可以通过Mat对象中的at(i,j)函数(type可以是uchar、int等)获得Mat对象的像素值。

    • 访问像素值:
    1. cv::Vec3b pixel = image.at(y, x); // 获取指定像素处的像素值
    2. unsigned char r = pixel[2]; // 获取红色通道的像素值
    • 修改像素值:
    image.at(y, x) = cv::Vec3b(255, 0, 0); // 设置指定像素处的像素值为蓝色

    对于一幅图片,如果想要对其中的一些像素点进行计算,一般通过Mat矩阵的二维循环逐一改变像素值。例如: 

    1.   Mat image = imread("test.jpg");
    2.   int rows = image.rows;
    3.   int cols = image.cols;
    4.   for (int i = 0; i < rows; i++)
    5.   {
    6.       for (int j = 0; j < cols; j++)
    7.       {
    8.           Vec3b& color = image.at(i, j);
    9.           color[0] = 255 - color[0]; // 修改 B 像素值
    10.           color[1] = 255 - color[1]; // 修改 G 像素值
    11.           color[2] = 255 - color[2]; // 修改 R 像素值
    12.       }
    13.   }
    14.   imshow("image", image);
    15.   waitKey();

    这段代码演示了如何遍历图像的每个像素并反转BGR通道的值,然后显示处理后的图像。

    其实很多图像变换再OpenCV中已经封装了相应的功能函数,不需要开发者进行像素级的操作,下面列举几个常用的OpenCV图像变换和像素运算,后续有机会还会专门讲解图像变换。

    • 图像阈值化:

    通过对图像进行阈值化操作,可以将像素值转换为二进制形式,用于图像分割、目标检测等应用。cv::threshold()是一个常用的函数,它将图像像素值与设定的阈值比较,根据条件将像素值设为给定的最大值或最小值。

    1. cv::Mat grayImage;
    2. cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); // 将彩色图像转为灰度图像
    3. cv::Mat thresholdImage;
    4. cv::threshold(grayImage, thresholdImage, 128, 255, cv::THRESH_BINARY); // 将灰度图像进行二值化处理
    • 图像像素算术运算:

    可以对两个图像进行像素级的算术运算,如加法、减法、乘法或除法。函数cv::add()、cv::subtract()、cv::multiply()、cv::divide()等常用于图像的像素级算术运算。

    1. cv::Mat image1 = cv::imread("image1.jpg");
    2. cv::Mat image2 = cv::imread("image2.jpg");
    3. cv::Mat result;
    4. cv::add(image1, image2, result); // 图像相加
    5. cv::Mat diff;
    6. cv::subtract(image1, image2, diff); // 图像相减

    这些是OpenCV中常见的像素级相关操作和计算的示例,包括像素值的读取和修改、图像阈值化、像素算术运算等。通过对图像的每个像素进行操作和计算,我们可以实现丰富的图像处理和分析功能。

    上述代码中还用到了图像读取的函数imread()。这个函数是OpenCV中图像加载的方法。除此之外还有一些常用的图像操作的方法,举例如下:

    • 加载和保存图像:

    cv::imread()函数可以读取多种图像格式的文件,例如JPEG、PNG等,cv::imwrite()函数可以将图像保存到磁盘上。例如:

    1.   Mat image = imread("test.jpg");
    2.   imwrite("output.jpg", image);
    • 图像的基本处理:

    OpenCV中提供了一些基本的图像处理函数,例如resize()(调整图像大小)、reshape()(调整通道数)、copyTo()(复制图像)等。例如:

    1.   Mat image = imread("test.jpg");
    2.   Mat resizedImage;
    3.   resize(image, resizedImage, Size(128, 128));
    4.   imshow("image", resizedImage);
    5.   waitKey();

    这段代码演示了如何将图像缩小并显示缩小后的图像。

  • 相关阅读:
    哈喽GPT-4o——对GPT-4o 提示词的思考与看法
    『C语言进阶』字符函数和内存函数(1)
    (6)SpringMVC中使用CharacterEncodingFilter编码过滤器处理请求和响应的乱码问题
    冰冰学习笔记:string类的简单模拟
    Ngnix优化
    C#_Win32_PInvoke源码生成器
    i.MX6ULL驱动开发 | 33 - NXP原厂网络设备驱动浅读(LAN8720 PHY)
    Vue 3 渲染机制解密:从模板到页面的魔法
    Word控件Spire.Doc 【段落处理】教程(三):在 C#、VB.NET 中管理词标题以形成目录
    BLE Mesh中广播包类型Mesh Beacon、Mesh Message、PB-ADV,以及代理的PB-GATT
  • 原文地址:https://blog.csdn.net/eric41050808/article/details/134256601