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;
            }        
        }

好不容易琢磨出來,分享給大家吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM