• VS2010和matlab混合编程时的图像矩阵传递


    在C++中,读入一幅图像使用语句如下,读入的图像像素为0-255之间的某一整数:

    Mat disp_image = imread(path,1);

    其中图像每个像素的RGB值是用3元素向量来存储(B,G,R)的,某一像素点的RGB值读取方式如下:

    Vec3b& mp = disp_image.at<Vec3b>(j, i);           //C++用向量存储像素值
    double B = mp.val[0];        
    double G = mp.val[1];
    double R = mp.val[2];

    在matlab中,读入一幅图像并转换为double型使用语句如下,读入的图像像素在0-1之间:

    input_im=im2double(imread(path));

     matlab中用三维矩阵存储像素值,即R,G,B三个平面。注意此处与C++的BGR顺序不同。

     明白了图像的存储原理,就可以进行矩阵转换了。

    在C++与matlab混合编程时,要使用数据接口类mwArray,可以简单理解为一个矩阵,即便是一个数值也转化为这种矩阵进行传递。

    将C++形式的图像矩阵转为mwArray矩阵,传入matlab函数的方式如下:

    //调用matlab程序进行图像增强
        mwSize  mdim[3] ={disp_image.rows,disp_image.cols,3};
        mwArray mdisp_image(3,mdim,mxDOUBLE_CLASS,mxREAL);
    //C++输入转matlab  接口矩阵转化及像素归一化
        for(int j = 0; j < disp_image.rows; ++j){
            for(int i = 0; i <disp_image.cols; ++i){
                    Vec3b& mp = disp_image.at<Vec3b>(j, i);        //C++用向量存储像素值
                    double B = mp.val[0]*1.0/255;                //像素归一化到0-1之间
                    double G = mp.val[1]*1.0/255;
                    double R = mp.val[2]*1.0/255;
                    mdisp_image(j+1,i+1,1)=R;            //matlab中用三个面R,G,B存储像素值
                    mdisp_image(j+1,i+1,2)=G;            //C++图像矩阵像素值赋给matlab矩阵
                    mdisp_image(j+1,i+1,3)=B;
            }        
        }

    将matlab处理后的图像mwArray矩阵转为C++的Mat,方式如下:

    //matlab结果转C++
    mwArray moutput_im2(3,mdim,mxDOUBLE_CLASS,mxREAL);     
        Mat output_image=disp_image.clone();    
        for(int j = 0; j < disp_image.rows; ++j){
                for(int i = 0; i < disp_image.cols; ++i){    
                    double Bd = moutput_im2.Get(3,j+1,i+1,3);
                    double Gd = moutput_im2.Get(3,j+1,i+1,2);
                    double Rd = moutput_im2.Get(3,j+1,i+1,1);
                    int B=int(Bd*255);                        //像素范围扩展到0-255
                    int G=int(Gd*255);
                    int R=int(Rd*255);
                    output_image.at<Vec3b>(j, i)[0] = B;    //matlab图像矩阵像素值赋给C++
                    output_image.at<Vec3b>(j, i)[1] = G;
                    output_image.at<Vec3b>(j, i)[2] = R;
                }        
            }

    好不容易琢磨出来,分享给大家吧。

  • 相关阅读:
    项目风险软考之软工基础知识(1)
    序列输出ZOJ1108 FatMouse's Speed
    电平波特率UART自适应波特率的设置方法
    nullnull2013金山西山居创意游戏程序挑战赛——初赛(3)生日猜猜猜
    删除监听oracle单库彻底删除干净的方法
    类关闭由一个activity启动第二个activity
    代码文件android:向手机卡上写入文件时总是不成功,解决办法
    功能应用程序延迟发送:4款定时发送短信的应用程序
    监听事件android activity中键盘的监听
    nullnull爆笑百家讲坛之十大逆袭情侣.
  • 原文地址:https://www.cnblogs.com/yingying0907/p/2722688.html
Copyright © 2020-2023  润新知