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

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

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

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

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值