图像矩阵在内存中的存储方式
灰度图
灰度图一个像素由一个字节组成,即单通道
RGB图
RGB图像的一个像素由以B,G,R顺序的三个字节组成,即三通道
关键步骤
可以将RGB图像的宽乘3,使用字节数单位uchar,而不用其像素单位vec3b,与灰度图的单位统一,即可以统一处理
代码实现
图像–>二维数组
//传入图片地址,输出二维vector
vector<vector<uchar> > decode(char* path) //path为图片路径
{
Mat img = imread(path); // 将图片传入Mat容器中
// 显示原图片
// namedWindow("old", WINDOW_NORMAL);
// imshow("old", img);
// waitKey(0);
int w = img.cols * img.channels(); //可能为3通道,宽度要乘图片的通道数
int h = img.rows;
vector<vector<uchar> > array(h, vector<uchar>(w)); //初始化二维vector
for (int i = 0; i < h; i++)
{
uchar* inData = img.ptr<uchar>(i); //ptr为指向图片的行指针,参数i为行数
for (int j = 0; j < w; j++)
{
array[i][j] = inData[j];
}
}
return array;
}
二维数组–>图像
//传入二维vecotr,显示输出的图片,并保存图片到指定地址
void code(vector<vector<uchar> > array, char* path)
{
size_t h = array.size();
size_t w = array[0].size();
//初始化图片的像素长宽
Mat img(h, (size_t)(w/3), CV_8UC3); //保存为RGB,图像列数像素要除以3;
for (size_t i = 0; i < h; i++)
{
uchar* outData = img.ptr<uchar>(i);
for (size_t j = 0; j < w; j++)
{
outData[j] = array[i][j];
}
}
namedWindow("new", WINDOW_NORMAL);
imshow("new", img);
waitKey(0);
imwrite("目标地址\\save.jpg", img);
}
测试主函数
#include<vector>
#include <opencv2/opencv.hpp>
//#include "opencv2/highgui/highgui.hpp"
//#include "opencv2/core/core.hpp"
using namespace std;
using namespace cv;
#include"decode.h"
#include"code.h"
int main()
{
char readPath[] = "读入地址\\图片";
vector<vector<uchar> > array;
array = decode(readPath);
char writePath[] = "目标地址\\项目";
code(array, writePath);
return 0;
}