如何使用convertTo,applyColorMap,imshow的函数来复制matlab输出?

时间:2016-11-26 07:51:53

标签: c++ matlab opencv

这是Matlab中的代码和我使用Matlab获得的结果图片。出于某些目的,我需要将Matlab代码转换为C ++。我已经完成了C ++中数据结构的转换,然后我需要处理显示图片的部分。我决定使用OpenCV库来替换Matlab中的图像处理。我发现OpenCV中的某些函数(如convertToapplyColorMapimshow)可以替换Matlab中的函数imagesc。所以,我模仿我搜索的在线代码。但它没有用。

这是我在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

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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;
  }

除了喷射之外还有很多其他颜色方案。

一旦您获得了干净的unsigned char数组格式的数据,您可以非常简单地将其与您选择用于图像显示的任何第三方库集成。