灰度图:2维矩阵
彩色图:3维矩阵
ps:目前大部分设备都是用无符号 8 位整数(类型为 CV_8U)表示像素亮度
Mat类定义:
class CV_EXPORTS Mat
{
public://一系列函数.../* flag 参数中包含许多关于矩阵的信息,如:-Mat 的标识-数据是否连续-深度-通道数目*/int flags;//矩阵的维数,取值应该大于或等于 2int dims;//矩阵的行数和列数,如果矩阵超过 2 维,这两个变量的值都为-1int rows, cols;//指向数据的指针uchar* data;//指向引用计数的指针//如果数据是由用户分配的,则为 NULLint* refcount;//其他成员变量和成员函数...
};
单通道图像:元素类型一般为 8U(即 8 位无符号整数),也可以是 16S、32F 等;这些类型可以直接用 uchar、short、float 等 C/C++语言中的基本数据类型表达
多通道图像:如RGB彩色图像,需要用三个通道来表示。在这种情况
下,如果依然将图像视作一个二维矩阵,那么矩阵的元素不再是基本的数据类型。可以采用Vec类,表示一个向量。如8U类型的RGB彩色图像使用Vec3b。
对于 Vec 对象,可以使用[]符号如操作数组般读写其元素,如:
Vec3b color; //用 color 变量描述一种 RGB 颜色
color[0]=255; //B 分量
color[1]=0; //G 分量
color[2]=0; //R 分量
at()函数:实现读取矩阵中的某个像素,或者对某个像素进行赋值操作。
uchar value = grayim.at<uchar>(i,j);//读出第 i 行第 j 列像素值
grayim.at<uchar>(i,j)=128; //将第 i 行第 j 列像素值设置为 128
对图像进行遍历,分别对单通道的 grayim 以及 3 个通道的 colorim,然后对两个图像的所有像素值
进行赋值,最后现实结果
Mat grayim(600, 800, CV_8UC1);Mat colorim(600, 800, CV_8UC3);//遍历所有像素,并设置像素值for( int i = 0; i < grayim.rows; ++i)for( int j = 0; j < grayim.cols; ++j )grayim.at<uchar>(i,j) = (i+j)%255;//遍历所有像素,并设置像素值for( int i = 0; i < colorim.rows; ++i)for( int j = 0; j < colorim.cols; ++j ){Vec3b pixel;pixel[0] = i%255; //Bluepixel[1] = j%255; //Greenpixel[2] = 0; //Redcolorim.at<Vec3b>(i,j) = pixel;}//显示结果imshow("grayim", grayim);imshow("colorim", colorim);waitKey(0);
使用迭代器遍历:
Mat grayim(600, 800, CV_8UC1);Mat colorim(600, 800, CV_8UC3);//遍历所有像素,并设置像素值MatIterator_<uchar> grayit, grayend;for( grayit = grayim.begin<uchar>(), grayend =
grayim.end<uchar>(); grayit != grayend; ++grayit)*grayit = rand()%255;//遍历所有像素,并设置像素值MatIterator_<Vec3b> colorit, colorend;for( colorit = colorim.begin<Vec3b>(), colorend =
colorim.end<Vec3b>(); colorit != colorend; ++colorit){(*colorit)[0] = rand()%255; //Blue(*colorit)[1] = rand()%255; //Green(*colorit)[2] = rand()%255; //Red}//显示结果
采用指针:
Mat grayim(600, 800, CV_8UC1);Mat colorim(600, 800, CV_8UC3);//遍历所有像素,并设置像素值for( int i = 0; i < grayim.rows; ++i){//获取第 i 行首像素指针uchar * p = grayim.ptr<uchar>(i);//对第 i 行的每个像素(byte)操作for( int j = 0; j < grayim.cols; ++j )p[j] = (i+j)%255;}//遍历所有像素,并设置像素值for( int i = 0; i < colorim.rows; ++i){//获取第 i 行首像素指针Vec3b * p = colorim.ptr<Vec3b>(i);for( int j = 0; j < colorim.cols; ++j ){p[j][0] = i%255; //Bluep[j][1] = j%255; //Greenp[j][2] = 0; //Red}}//显示结果