如何在MATLAB中将灰度矩阵转换为RGB矩阵?

11
rgbImage = grayImage / max(max(grayImage));
或者
rgbImage = grayImage / 255;

上述哪个是正确的,为什么?

2个回答

24

要将灰度图像转换为RGB图像,您需要解决两个问题:

  • 灰度图像是2D的,而RGB图像是3D的,所以你需要将灰度图像数据复制三次,并沿第三个维度连接三个副本。
  • 图像数据可以以许多不同的数据类型存储,因此您必须相应地进行转换。当存储为double数据类型时,图像像素值应该是0到1范围内的浮点数。当存储为uint8数据类型时,图像像素值应该是0到255范围内的整数。您可以使用函数class检查图像矩阵的数据类型。

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

  • To convert a uint8 or double grayscale image to an RGB image of the same data type, you can use the functions repmat or cat:

    rgbImage = repmat(grayImage,[1 1 3]);
    rgbImage = cat(3,grayImage,grayImage,grayImage);
    
  • To convert a uint8 grayscale image to a double RGB image, you should convert to double first, then scale by 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]);
    
  • To convert a double grayscale image to a uint8 RGB image, you should scale by 255 first, then convert to uint8:

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

我刚刚进行了一个测试,似乎 double(grayImage)grayImage 是相同的?而且在MATLAB中, ./.* 是除法和乘法运算符吗?看起来 .// 是相同的? - user198729
@user198729:运算符./.*表示逐元素除法和乘法,因此图像矩阵的每个元素都被255除或乘。您可以通过输入class(grayImage)来检查矩阵的类(即数据类型)。虽然double(grayImage)grayImage可能看起来相同,但它们可能是不同的类(以不同的方式存储其值)。 - gnovice
жҲ‘е°қиҜ•дәҶеҗ„з§Қж“ҚдҪңпјҢдҪҶ / е’Ң ./ д»ҺжңӘдә§з”ҹдёҚеҗҢзҡ„з»“жһң... еӣ дёә double(grayImage) е’Ң grayImage жҳҜзӣёеҗҢзҡ„пјҢжүҖд»Ҙ double(grayImage)./255 д№ҹдёҺ grayImage./255 зӣёеҗҢгҖӮдҪ иғҪеҗҰз»ҷеҮәдёӨдёӘдҫӢеӯҗпјҢиҜҙжҳҺдёәд»Җд№ҲйңҖиҰҒ ./ е’Ң doubleпјҹ - user198729
@user198729:首先,如果B是单个标量值,则命令A/B将与A./B给出相同的结果。写成./只是为了让阅读代码的人明确地知道正在进行元素级别的除法。其次,我认为在我的答案中已经很清楚,只有当您想要从另一种数据类型转换为double时才需要使用double。如果grayImage已经是double类型,则不需要转换。 - gnovice
哦,看来我误解了C/C++中的double和浮点数数据类型,谢谢你的回答! - user198729

2

按照定义,RGB图像有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 图像,你需要将单通道矩阵转换为三通道矩阵。


我认为按照定义,rgbImage 的最大值应该是 1,代表着白色,但事实似乎并非如此? - user198729
不一定,这取决于您对图像的使用。 - Jacob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接