2016-11-26 93 views
0

這裏是Matlab中的代碼和我使用Matlab獲得的結果圖片。出於某些目的,我需要將Matlab代碼轉換爲C++。我已經完成了C++數據結構的轉換,然後我需要處理顯示圖片的部分。我決定使用OpenCV庫來替換Matlab中的圖像處理。我發現OpenCV中的convertTo,applyColorMapimshow等函數可以替代Matlab中的函數imagesc。所以,我在網上模擬了我搜索的代碼。但它不起作用。如何使用convertTo,applyColorMap,imshow來複制matlab輸出的功能?

這是我在C++代碼:

for (cutNumber = 1; cutNumber <= 9; cutNumber++) 
{ 
    momentString = "dBT"; 
    DataSelect* BaseData_Select = select(theObj,cutNumber,momentString); 
    int ncols = BaseData_Select->allLength/BaseData_Select->dataLength; 
    // 對應matlab auto.m第138行。下面是繪製dBZ的B顯圖 
    Mat mydata(BaseData_Select->dataLength, ncols, CV_32F); 
    for (int i = 0; i < BaseData_Select->dataLength; i++) 
    { 
     for (int j = 0; j < ncols; j++) 
     { 
      int temmmp = i*ncols+ j; 
      mydata.at<float>(i, j) = BaseData_Select->data[i*ncols + j]; 
     } 
    } 
    double Amin = *min_element(mydata.begin<float>(), mydata.end<float>()); // Amin is -19 
    double Amax = *max_element(mydata.begin<float>(), mydata.end<float>()); // Amax is 64 
    cv::minMaxIdx(mydata, &Amin, &Amax); 
    cv::Mat adjMap; 
    float scale = 255/(Amax - Amin); 
    mydata.convertTo(adjMap, CV_8UC1, scale, -Amin*scale); 
    cv::Mat resultMap; 
    applyColorMap(adjMap, resultMap, cv::COLORMAP_AUTUMN); 
    cv::imshow("Out", resultMap); 
    cv::imwrite("output.bmp", resultMap); 
} 

這裏是處理在Matlab圖像的代碼。

figure(H_figure_PHIDP); 
subplot(3,3,Cut_Number); 
imagesc(PHIDP.Data); 
colormap('default'); 
caxis([ -20 60]); 
ylim([Sphere_Distance_Cell-Sphere_Distance_Cell_Extend Sphere_Distance_Cell+Sphere_Distance_Cell_Extend]) 
xlim([Sphere_Center_Ray-Sphere_Azimuth_Cell_Extend Sphere_Center_Ray+Sphere_Azimuth_Cell_Extend]) 
xlabel('徑向數目'); 
ylabel('距離庫'); 

在Matlab上運行的結果畫面是我想要使用OpenCV函數。

enter image description here

而用C我的結果畫面++是下面的圖片是錯誤的畫面絕對。

enter image description here

可以在任何一個可以幫助我解決這個問題?

+0

你的問題是相當不確定的。請學會創建一個[MCVE](http://stackoverflow.com/help/mcve),並詢問*特定的*有關特定*問題的問題。 –

回答

0

imagesc創建一個圖像,它是數據的熱圖。所以低值是藍色的,高值是微紅的。你幾乎可以使用任何方案。

從這裏偷一些配色方案。

http://www.malcolmmclean.site11.com/www/datadensity/DataDensity.html

void createjet(unsigned char *rgb, int N) 

    /* 
     Convert data matrix to heat map using jet colourscheme 
    */ 
    unsigned char *dataasrgbajet(Mat& mydata, double amin, double amax int *width, int *height) 
    { 
     int i, j, index; 
     unsigned char jet[256*3]; 
     unsigned char *rgba = malloc(mat.width * mat.height * 4); 
     createjet(jet, 256); 
     for(i=0;i<mat.height;i++) 
     for(j=0;j<mat.width;j++) 
     { 
      index = ((mat[i][j] - amin) * 256)/(amax - amin); 
      index = clamp(index, 0, 255); 
      rgba[i*width+j] = jet[index*3]; 
      rgba[i*width+j+1] = jet[index*3+1]; 
      rgba[i*width+j+2] = jet[index*3+2]; 
      rgba[i*width+j+3] = 255; 
     } 
    *width = mat.width; 
    *height = mat.height; 
    return rgba; 
    } 

還有很多其他的配色方案不是飛機。

以乾淨的無符號字符數組格式存儲數據後,您可以非常簡單地將其與您爲圖像顯示目的而選擇的任何第三方庫集成。