2016-11-26 12 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; 
    } 

ジェット以外のカラースキームがたくさんあります。

クリーンな符号なし文字配列形式のデータを取得したら、画像表示用に選択したサードパーティ製のライブラリと簡単に統合できます。

関連する問題