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轴。

相关推荐
CTA量化套保10 分钟前
最新量化表达入门,从概念规则到简单实现
人工智能·python
AI应用苏大大13 分钟前
企业AI架构缺陷:低价工具堆叠,造成结构性效率浪费
人工智能
空中湖32 分钟前
Spring AI Agent 编排:ReAct 模式 + 多 Agent 协作实战
人工智能·spring·react.js
only-qi32 分钟前
RAG 工作机制详解:构建高质量知识库的技术全流程
网络·人工智能·rag
John_ToDebug37 分钟前
Git Stash 完全指南:临时保存工作区的艺术
人工智能·git·agent
feibaoqq38 分钟前
Atlas边端板卡AI识别:部署方法、技术实现、优劣及应用场景
人工智能·低空经济·低空安防
小保CPP44 分钟前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
Xzaveir1 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
FII工业富联科技服务1 小时前
从灯塔工厂到AI Factory新模式:AI正在重构制造业的四大核心能力
大数据·运维·人工智能·重构·ar·制造
前端开发江鸟1 小时前
从一个最小 Runtime Demo 看懂:陌生的 599 为什么不能重试
人工智能