【问题标题】:building an image from Mat object in OpenCV在 OpenCV 中从 Mat 对象构建图像
【发布时间】:2013-09-04 08:53:12
【问题描述】:

我正在使用 OpenCV,我有一个大小为 1024*1024 的 Mat 对象(从照片中提取并进行操作),值在 [1..25] 范围内。例如:

Mat g;
g=[1,5,2,14,13,5,22,24,5,13....;
21,12,...;
..
.];

我想将这些值表示为图像。这只是一个插图图像来显示不同的区域,每个区域都有一种颜色。 例如:所有等于 1 的值=red,所有等于 14 的值=blue,依此类推..

然后构建并展示这张照片。

有人知道我应该如何进行吗?

谢谢!

【问题讨论】:

    标签: c++ opencv mat


    【解决方案1】:

    如果你不太在意你得到什么颜色,你可以缩放你的数据(所以它几乎填满了 0 到 255 的范围),然后使用内置的颜色图。 例如

    cv::Mat g = ...
    cv::Mat image;
    cv::applyColorMap(g * 10, image, COLORMAP_RAINBOW);
    

    applyColorMap() doco

    【讨论】:

    • 我试过了,但是当我尝试使用颜色图时我得到一个黑色的图像,我不知道为什么......无论如何谢谢:)
    • @triple13 彩虹色图甚至不包含黑色,所以你做错了什么。
    • 是的,我知道。我认为问题是我的 Mat 的类型,因为如果我使用 imread 加载普通图像然后应用颜色图,它可以正常工作
    【解决方案2】:

    colormaps ,但如果您的数据仅在 [0..25] 范围内,它们将无济于事。所以你可能需要推出你自己的版本:

       Vec3b lut[26] = { 
            Vec3b(0,0,255),
            Vec3b(13,255,11),
            Vec3b(255,22,1),
            // all the way down, you get the picture, no ?
       };
    
       Mat color(w,h,CV_8UC3);
       for ( int y=0; y<h; y++ ) {   
           for ( int x=0; x<w; x++ ) {
               color.at<Vec3b>(y,x) = lut[ g.at<uchar>(y,x) ];   
              // check the type of "g" please, i assumed CV_8UC1 here. 
              // if it's CV_32S, use g.at<int>  , i.e, you need the right type here 
           }
       }
    

    【讨论】:

    • @berak..非常感谢这段代码完美运行。虽然我不得不使用合适的像素值手动选择“lut”的元素值,但只要它工作正常就可以了。当我尝试使用颜色图时,我有一个黑色的图像,我不知道为什么。也许是因为 Mat 的类型或其他原因,但没问题,我还是用了另一种方式。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多