openCV:从矩阵绘制颜色图

Posted

技术标签:

【中文标题】openCV:从矩阵绘制颜色图【英文标题】:openCV: Plotting a colormap from a matrix 【发布时间】:2014-11-17 06:10:53 【问题描述】:

我有一个 50 x 50 的矩阵,它的某些值从 1 到 50。我需要使用 OpenCV 绘制相同的颜色图。

我已经在 MATLAB 中完成了这项工作(在 this answer 的帮助下):

>> A = randi([10,60],100,100);
>> colormap('hot')
>> imagesc(A)
>> colorbar    

输出类似于。

我想用 openCV 做同样的事情。

我该如何进行呢?

我无法理解如何实现这样的“热”功能(只看到热)

:

此外,我也有兴趣放置一个颜色条,如第一张图片所示。


更新(我正在运行的最终代码)

不幸的是,我仍然无法绘制正确的颜色图:这是 MATLAB 代码:

注意:A 是一个 10 x 100 的矩阵。

A=[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ; ]

colormap('hot'); 图像c(A) 彩条

这是输出:

现在我创建了一个包含相同数据的文本文件,我的文本文件如下所示:

并使用以下代码实现了与 MATLAB 相同的结果:

   int main() 







ifstream Read("myfile.txt");

vector<int> nums;
while ( !Read.eof() ) 
    int n;
    Read >> n;
    nums.push_back(n);

// now make a Mat from the vector:
Mat mat(nums);

cout<<mat<<endl; //for testing 


Mat mat1d(nums);
Mat mat2d = mat1d.reshape(1, 10);
//
Mat image; //create an empty image. (you can leave it empty ;)
//// Apply the colormap, but on the 2d mat, not on the 2d vector, please:
applyColorMap( mat2d, image, COLORMAP_JET );
            // Show the result:
imshow("colormap", image);
waitKey(0);
return 0;

但是上面的输出是没有意义的。

我需要匹配来自 MATLAB 和 Opencv 的结果。

【问题讨论】:

docs.opencv.org/modules/contrib/doc/facerec/colormaps.html 您显示的代码似乎与您的问题完全无关。 @berak 感谢您的链接。是的,我的方法是错误的。我虽然会尝试修改此代码以获取 2d 热图。 @berak BTW 你能看看my another question @berak 请参阅我上面的更新部分。我想在矩阵而不是图像上应用颜色图。 【参考方案1】:

您将不得不将 1d 矢量重塑为 2d mat:

    //
    // before doing anything else, CLEAN UP YOUR DAMN TXTFILE. 
    // it should contain nothing than numbers and spaces.
    ifstream Read("m.txt");

    // be extra picky about the type here.
    // we are reading in a 8bit grayscale map.
    vector<uchar> nums;
    for (int i=0; (i<100*10)&&(!Read.eof()); i++ ) 
        int n;
        Read >> n;
        nums.push_back(n);
    

    // now make a Mat from the vector:
    Mat mat1d(nums);
    Mat mat2d = mat1d.reshape(1, 10);

    // your data is in the [0..9] range, so scale up to [0..255] uchar range
    mat2d *= (255/10); 

    cout<<mat2d<<endl; //for testing 
    //
    Mat image; //create an empty image. (you can leave it empty ;)
    //// Apply the colormap, but on the 2d mat, not on the 2d vector, please:
    applyColorMap( mat2d, image, COLORMAP_HOT );
                // Show the result:
    imshow("colormap", image);
    waitKey(0);

【讨论】:

1 个元素(通道),10 行,请see here 不幸的是,即使现在它也不起作用。请在上面查看我的更新。 您的文本文件的内容是什么?和上面更新下的截图一样吗?

以上是关于openCV:从矩阵绘制颜色图的主要内容,如果未能解决你的问题,请参考以下文章

android opencv 如何获得特定像素点的颜色

opencv学习_矩阵运算和绘制图像

opencv学习_矩阵运算和绘制图像

从 3 通道彩色图像的原始数据加载 Opencv 矩阵

Python下opencv使用笔记(简单几何图像绘制)

使用Python,OpenCV对图像进行亚像素点检测,并拟合椭圆进行绘制