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中,图像可以轻易地读取和显示。

cpp 复制代码
#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++代码示例:

cpp 复制代码
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轴。

相关推荐
deephub28 分钟前
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
人工智能·深度学习·transformer·大语言模型·注意力机制
搏博40 分钟前
神经网络问题之二:梯度爆炸(Gradient Explosion)
人工智能·深度学习·神经网络
KGback1 小时前
【论文解析】HAQ: Hardware-Aware Automated Quantization With Mixed Precision
人工智能
电子手信1 小时前
知识中台在多语言客户中的应用
大数据·人工智能·自然语言处理·数据挖掘·知识图谱
不高明的骗子1 小时前
【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境
人工智能·pytorch·深度学习·cuda
Chef_Chen1 小时前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
搏博1 小时前
神经网络问题之:梯度不稳定
人工智能·深度学习·神经网络
GL_Rain1 小时前
【OpenCV】Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR)
人工智能·opencv·计算机视觉
shansjqun1 小时前
教学内容全覆盖:航拍杂草检测与分类
人工智能·分类·数据挖掘
狸克先生2 小时前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互