【OpenCV】c++实现 图像矩阵与数组的相互转化

布满荆棘的人生 2023-07-07 08:50 53阅读 0赞

图像矩阵在内存中的存储方式

灰度图
在这里插入图片描述

灰度图一个像素由一个字节组成,即单通道

RGB图

在这里插入图片描述

RGB图像的一个像素由以B,G,R顺序的三个字节组成,即三通道

关键步骤

可以将RGB图像的宽乘3,使用字节数单位uchar,而不用其像素单位vec3b,与灰度图的单位统一,即可以统一处理

代码实现

图像–>二维数组

  1. //传入图片地址,输出二维vector
  2. vector<vector<uchar> > decode(char* path) //path为图片路径
  3. {
  4. Mat img = imread(path); // 将图片传入Mat容器中
  5. // 显示原图片
  6. // namedWindow("old", WINDOW_NORMAL);
  7. // imshow("old", img);
  8. // waitKey(0);
  9. int w = img.cols * img.channels(); //可能为3通道,宽度要乘图片的通道数
  10. int h = img.rows;
  11. vector<vector<uchar> > array(h, vector<uchar>(w)); //初始化二维vector
  12. for (int i = 0; i < h; i++)
  13. {
  14. uchar* inData = img.ptr<uchar>(i); //ptr为指向图片的行指针,参数i为行数
  15. for (int j = 0; j < w; j++)
  16. {
  17. array[i][j] = inData[j];
  18. }
  19. }
  20. return array;
  21. }

二维数组–>图像

  1. //传入二维vecotr,显示输出的图片,并保存图片到指定地址
  2. void code(vector<vector<uchar> > array, char* path)
  3. {
  4. size_t h = array.size();
  5. size_t w = array[0].size();
  6. //初始化图片的像素长宽
  7. Mat img(h, (size_t)(w/3), CV_8UC3); //保存为RGB,图像列数像素要除以3;
  8. for (size_t i = 0; i < h; i++)
  9. {
  10. uchar* outData = img.ptr<uchar>(i);
  11. for (size_t j = 0; j < w; j++)
  12. {
  13. outData[j] = array[i][j];
  14. }
  15. }
  16. namedWindow("new", WINDOW_NORMAL);
  17. imshow("new", img);
  18. waitKey(0);
  19. imwrite("目标地址\\save.jpg", img);
  20. }

测试主函数

  1. #include<vector>
  2. #include <opencv2/opencv.hpp>
  3. //#include "opencv2/highgui/highgui.hpp"
  4. //#include "opencv2/core/core.hpp"
  5. using namespace std;
  6. using namespace cv;
  7. #include"decode.h"
  8. #include"code.h"
  9. int main()
  10. {
  11. char readPath[] = "读入地址\\图片";
  12. vector<vector<uchar> > array;
  13. array = decode(readPath);
  14. char writePath[] = "目标地址\\项目";
  15. code(array, writePath);
  16. return 0;
  17. }

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读