imread是用于读取图像的主要函数。这个函数打开图像,并以矩阵格式存储图像。imread接受两个参数:第一个参数是一个包含这个图像路径的字符串,第二个参数默认情况下是可选的,它把加载图像作为一种彩色图像。第二个参数允许以下选项:
1、CV_LOAD_IMAGE_ANYDEPTH:如果设置为这个常数,当输入具有相应的深度时返回一个16位或32位图像;否则,imread函数将它转换为8位图像;
2、CV_LOAD_IMAGE_COLOR:如果设置为这个常数,总是将图像转换为彩色的;
3、CV_LOAD_IMAGE_GRAYSCALE:如果设置为这个常数,总是将图像转换为灰度。
在计算机中,可以使用imwrite函数存储矩阵图像,该函数的第一个参数是带有所需扩展的图像保存路径。第二个参数事项保存的矩阵图像。在示例代码中,创建并存储灰度图像,然后加载并将存储在gray变量中的灰度图像保存为JPG格式的灰度图像。
若要访问图像的一个像素,可以使用Opencv的Mat类中的cv::Mat::at<typename t>(row,col)模板函数。末班参数是要有返回类型。8位彩色图像中的typename是一个Vec3b类,它存储三个无符号字符数据(Vec=向量,3=组件数,以及b=1字节)。在灰度图像中,可以直接使用图像中的五福号的字符或任何其他数字形式,例如unchar pixel=color.at<unchar>(myRow,myCol);
最后显示图像,可以使用imshow函数创建一个窗口,其中第一个参数是标题,第二个参数是图像矩阵。
如果想允许等待用户按任意键停止应用程序,可以使用Opencv中的waitKey函数,并将参数设置为要等待的毫秒数。如果将这一参数设置为0,将永远等待。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
//OpenCV头文件
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
int main(int argc, const char ** argv)
{
//读图像
Mat color = imread("E:\\img\\lena.jpg");
Mat gray = imread("E:\\img\\lena.jpg", 0);
//写图像
imwrite("E:\\img\\lenaGray.jpg", gray);
//通过opencv函数获取相同像素
int myRow = color.cols - 1;
int myCol = color.rows - 1;
Vec3b pixel = color.at<Vec3b>(myRow, myCol);
cout << "Pixel value(R,G,B):(" << (int)pixel[0] << "," <<(int)pixel[1] << "," << (int)pixel[2] << ")" << endl;
//显示图像
imshow("Lena RGB", color);
imshow("Lena Gray", gray);
//等待按键
waitKey(0);
return 0;
}
结果: