基础入门
图像的属性指的是描述图像基本信息的数据,包括但不限于:图像的尺寸、颜色通道数、像素数据类型等。这些属性对于图像处理非常重要,因为它们直接关系到如何正确地读取、处理和存储图像。常见的图像属性包括:
尺寸:图像的宽度和高度,可通过OpenCV中的image.size()来获取。
颜色通道数:图像中表示颜色信息的不同分量的数量。常见的颜色空间有RGB、灰度、HSV 等,不同颜色空间对应的通道数不同。RGB有红、绿、蓝三个颜色通道,灰度有单个灰度通道,HSV有色调(Hue)、饱和度(Saturation)、明度(Value)三个颜色通道。颜色通道数可通过OpenCV中的image.channels()来获取。
步长:指在图像数据中,从一行的开始到下一行开始所需的字节数,即每一行的字节数。步长可能比像素宽度大,以适应内存对齐。步长允许图像数据跨越不连续的内存块,这样即使图像数据不是连续存储的,也能够正确地访问图像数据。步长可通过OpenCV中的image.step和image.rowStep()来获取。
接口介绍
除了以上的属性外,图像还有其他一些有用的属性,包括:深度、像素总数、像素数据类型等。下面,我们将介绍各个属性的含义,以及如何通过OpenCV接口获取这些属性。
深度:表示图像中每个像素的位数,可通过image.depth()获取。比如:8位无符号整型的深度为CV_8U,32位单精度浮点型的深度为CV_32F。
连续性:指示图像数据是否连续存储在内存中,可通过image.isContinuous()获取。
元素总数:图像中像素的总数,可通过image.total()获取。
数据指针:指向图像数据的指针,可通过image.data或image.ptr()获取。
像素数据类型:不仅包括深度信息,还包含了通道数的信息,可通过image.type()获取。在OpenCV中,像素数据类型是一个组合标识符,它结合了深度和通道数来表示图像中每个像素的完整数据类型。举几个例子,可能有助于我们进一步理解。
(1)CV_8UC1:每个像素占用8位,单通道(灰度图像)。
(2)CV_8UC3:每个像素占用8位,三通道(RGB彩色图像)。
(3)CV_16UC1:每个像素占用16位,单通道。
(4)CV_32FC1:每个像素占用32位,单通道。
图像的行:图像的行数,可通过image.rows获取。
图像的列:图像的列数,可通过image.cols获取。
元素的字节步长:图像单行数据的字节跨度,可通过image.step1()获取。如果矩阵是连续的(即没有步长或偏移),那么它将返回每行所占的字节数。如果矩阵只有一行,则返回值就是整个矩阵的宽度乘以每个元素的大小。如果矩阵有多行,并且每一行都是连续存储的,那么step1()返回的将是这些连续行的字节宽度。
元素占用的字节数:图像中单个元素的字节数,可通过image.elemSize()获取。对于CV_8UC3类型的图像矩阵,elemSize()会返回3。
实战解析
下面的实战代码读取了一个图像文件,并打印输出了其图像属性,包括:图像尺寸、颜色通道数、步长、图像深度、图像连续性、元素总数、像素数据类型、图像的行数、图像的列数、元素的字节步长、元素占用的字节数等。
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
Mat image = imread("OpenCV.png");
if(image.empty())
{
cout << "Can not open or find the image" << endl;
return -1;
}
cout << "Image Size: " << image.size().width << " x " << image.size().height << endl;
cout << "Image Channels: " << image.channels() << endl;
cout << "Image Step: " << image.step << endl;
cout << "Image Depth: " << image.depth() << endl;
cout << "Image is Continuous: " << image.isContinuous() << endl;
cout << "Total Elements: " << image.total() << endl;
cout << "Image Type: " << image.type() << endl;
cout << "Image Rows: " << image.rows << endl;
cout << "Image Cols: " << image.cols << endl;
cout << "Image Byte Step: " << image.step1() << endl;
cout << "Image Element Size: " << image.elemSize() << endl;
waitKey(0);
destroyAllWindows();
return 0;
}
执行上面的示例代码,运行效果可参考下图。