C++结合OpenCV:掌握图像基础与处理

        本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C++ 中进行图像读取、显示和基础操作。

1.图像的基本概念与术语

        图像表示

        在计算机视觉中,图像通常表示为一个二维或三维的数组。二维数组表示灰度图像,其中每个元素代表一个像素的亮度。三维数组表示彩色图像,通常使用 RGB(红、绿、蓝)色彩模型,如图1。

图1  RGB色彩模型

        首先,我们可以将一幅图像定义为一个二维函数ƒ(x,y),其中x和y是空间(平面)的坐标,f是图像在点(x,y)处具有某种性质的F的值,而任何一对空间标点(x,y)处的幅值f,即为图像在该点的强度和灰度。

接下来,我们对坐标点(x,y)使用整数值表示:x=0,1,2,…M-1和y =0,1,2...N-1,图像可表示为如下所示RaC矩阵形式,其中,R是图像的行数,C为图像的列数,而矩阵中的每个元素即为像素。

根据每个像素所代表的信息不同,可将图像分为二值图像、灰度图像和彩色图像。

注:基础术语

  1. 像素(Pixel):图像的基本单位。
  2. 分辨率(Resolution):图像的宽度和高度(例如,1920x1080)。
  3. 位深度(Bit Depth):每个像素可以使用的色彩范围(例如,8位表示256种可能的值

2.图像读取与显示

在opencv中,图像可以轻易地读取和显示。                 

#include <opencv2/opencv.hpp>  
#include <opencv2/highgui/highgui.hpp>  
int main() {  
    // 读取图像  
    cv::Mat img2 = cv::imread("img.jpg");    
    // 创建一个名为 "lesson" 的窗口  
    cv::namedWindow("lesson", cv::WINDOW_NORMAL);    
    // 在 "lesson" 窗口内显示图像  
    cv::imshow("lesson", img2);  
    // 等待用户按键,然后关闭窗口  
    cv::waitKey(0);  
    return 0;  
}

在本程序运行中:

1、在C++中,我们使用cv::Mat来表示图像。cv::imread()函数用于读取图像,返回一个cv::Mat对象。

2、cv::namedWindow()函数用于创建一个窗口,第一个参数是窗口名称,第二个参数是窗口标志。在这里,我们使用cv::WINDOW_NORMAL来允许窗口大小被调整。

3、cv::waitKey()函数用于等待用户按键。参数0表示无限等待,直到用户按下一个键。这个函数在显示图像时通常很有用,因为它允许用户看到图像,直到他们决定关闭它。如果用户按下了ESC键(ASCII码为27),那么程序将退出,在结束时返回0,表示程序正常退出。

运行上述程序,得到的运行结果如图2所示。

图2  程序的运行结果

        在实际使用中,可以先通过函数cv::namedWindow()来创建一个窗口,再让函数 cv::imshow()引用该窗口来显示图像。也可以不创建窗口,直接使用函数 cv::imshow()引用一个并不存在的窗口,并在其中显示指定图像,这样函数 cv::imshow()实际上会完成如下两步操作。

        第1步:函数 cv::imshow()创建一个指定名称的新窗口。

        第2步:函数 cv::imshow()将图像显示在刚创建的窗口内。

3.基础图像操作:像素读写与算术运算  

在OpenCV中可以读取和修改图像中的特定像素。

c++代码示例:       

cv::Vec3b value = image.at<cv::Vec3b>(100, 100);

image.at<cv::Vec3b>(100, 100) = cv::Vec3b(255, 0, 0);

        第一行代码读取一个像素的值,第二行行代码将位于(100, 100)位置的像素值设置为(255, 0, 0),这是一个BGR值,对应于红色(因为蓝色和绿色通道的值都是0,而红色通道的值是255)。cv::Vec3b(255, 0, 0)创建了一个新的cv::Vec3b对象,其BGR值分别为255、0和0。然后,我们使用at<cv::Vec3b>(100,100)将这个位置的像素值设置为新创建的颜色值。注意,在图像处理中,(x, y)坐标通常表示列和行,而不是传统的数学坐标系统中的x和y轴。

相关推荐

  1. OpenCV-图像基础处理

    2023-12-22 11:34:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 11:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 11:34:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 11:34:02       82 阅读
  4. Python语言-面向对象

    2023-12-22 11:34:02       91 阅读

热门阅读

  1. ffprobe工具

    2023-12-22 11:34:02       69 阅读
  2. Milvus实战:构建Q&A系统及推荐系统

    2023-12-22 11:34:02       72 阅读
  3. ros2/ros1中的cmakelists.txt文件解释

    2023-12-22 11:34:02       54 阅读
  4. 设计模式_行为型模式_观察者模式

    2023-12-22 11:34:02       62 阅读
  5. 如何看待“前端已死”

    2023-12-22 11:34:02       58 阅读
  6. 谁拿了最多奖学金【NOIP2005提高组】(c++)

    2023-12-22 11:34:02       60 阅读