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

还有很多其他的配色方案不是飞机。

以干净的无符号字符数组格式存储数据后,您可以非常简单地将其与您为图像显示目的而选择的任何第三方库集成。