本文详细介绍了使用 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为图像的列数,而矩阵中的每个元素即为像素。
根据每个像素所代表的信息不同,可将图像分为二值图像、灰度图像和彩色图像。
注:基础术语
- 像素(Pixel):图像的基本单位。
- 分辨率(Resolution):图像的宽度和高度(例如,1920x1080)。
- 位深度(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轴。