【问题标题】:How to convert a grayscale matrix to an RGB matrix in MATLAB?如何在 MATLAB 中将灰度矩阵转换为 RGB 矩阵?
【发布时间】:2011-02-06 20:38:35
【问题描述】:
rgbImage = grayImage / max(max(grayImage));

rgbImage = grayImage / 255;

以上哪项是正确的,原因是什么?

【问题讨论】:

    标签: image matlab matrix rgb grayscale


    【解决方案1】:

    要将grayscale image 转换为RGB image,您必须解决两个问题:

    • Grayscale images 是 2-D,而 RGB images 是 3-D,因此您必须将灰度图像数据复制三次,然后将三个副本沿三维连接。
    • 图像数据可以存储在许多不同的data types 中,因此您必须对它们进行相应的转换。当存储为 double 数据类型时,图像像素值应为 0 到 1 范围内的浮点数。当存储为 uint8 数据类型时,图像像素值应为 0 到 1 范围内的整数255. 可以使用class函数检查图像矩阵的数据类型。

    以下是您可能会遇到的 3 种典型情况:

    • 要将uint8double 灰度图像转换为相同数据类型的RGB 图像,您可以使用函数repmatcat

      rgbImage = repmat(grayImage,[1 1 3]);
      rgbImage = cat(3,grayImage,grayImage,grayImage);
      
    • 要将uint8 灰度图像转换为double RGB 图像,应先转换为double,然后按255 缩放:

      rgbImage = repmat(double(grayImage)./255,[1 1 3]);
      
    • 要将double灰度图像转换为uint8RGB图像,应先缩放255,然后再转换为uint8

      rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);
      

    【讨论】:

    • 我刚做了一个测试,好像double(grayImage)grayImage一样?而且./.*是MATLAB中的除法和乘积运算符吗?似乎.// 相同?
    • @user198729:运算符./.*表示element-wise除法和乘法,这样图像矩阵的每个元素都除以或乘以255 . 您可以通过键入class(grayImage) 来检查矩阵的类(即数据类型)。虽然double(grayImage)grayImage 可能看起来相同,但它们可能各自是不同的类(因此它们以不同的方式存储它们的值)。
    • 我尝试了各种操作,但/./从来没有给出不同的结果...而且因为double(grayImage)grayImage相同,double(grayImage)./255也与grayImage./255.那么,你能举两个例子来说明为什么./double是必要的吗?
    • @user198729:首先,如果B 是单个标量值,则命令A/B 将给出与A./B 相同的结果。编写./ 只是让正在阅读代码的人清楚地知道正在发生逐元素划分。其次,我认为我的回答很清楚,只有当您想要从 另一种数据类型 转换为 double 时,才需要使用 double。如果grayImage 已经是double 类型,则无需转换。
    • 哦,我好像误解了doublefloat point 在c/c++ 中的类似数据类型,谢谢您的回答!
    【解决方案2】:

    根据定义,RGB 图像有 3 个通道,这意味着您需要一个 3 维矩阵来表示图像。所以,正确的答案是:

    rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);
    

    在规范化grayImage 时要小心。如果grayImageuint8,那么您将在255*grayImage/max(grayImage(:)) 操作中失去一些精度。

    此外,标准化grayImage 取决于数据。在您的问题中,您使用了两种方法:

    rgbImage = grayImage / max(max(grayImage));
    

    对灰度图像进行归一化处理,使图像中的最大值为1

    rgbImage = grayImage / 255;
    

    只有当grayImage 中的值在0-255 范围内时才有意义。

    所以这真的取决于你想做什么。但是,如果您想要 RGB 图像,则需要将单通道矩阵转换为 3 通道矩阵。

    【讨论】:

    • 我以为rgbImage的最大值定义为1,表示white,但似乎不是这样?
    • 不是真的,这取决于您对图像的使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多