2010-04-12 212 views

回答

22

要转换grayscale imageRGB image,有两个问题必须解决:

  • Grayscale images是2-d,而RGB images是3-d,所以你要复制的灰度图像数据的三个次并沿着第三维连接三个副本。
  • 图像数据可以存储在许多不同的data types,所以你必须相应地转换它们。当作为double数据类型存储时,图像像素值应该是0到1范围内的浮点数。存储为uint8数据类型时,图像像素值应该是0到255范围内的整数。您可以使用功能class检查图像矩阵的数据类型。

这里有3个典型的状况下,你可能会遇到:

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

    rgbImage = repmat(grayImage,[1 1 3]); 
    rgbImage = cat(3,grayImage,grayImage,grayImage); 
    
  • 要转换uint8 gra到double RGB图像yscale图像,你应该转换为double第一,然后规模由255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]); 
    
  • 要在double灰度图像转换为uint8 RGB图像,你应该通过255第一标尺,然后转换成uint8

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

我刚做了一个测试,看起来'double(grayImage)'和'grayImage'是一样的吗?在MATLAB中用'./'和'。*'来划分和乘积运算符?似乎'。/'和'/'是一样的吗? – user198729 2010-04-12 13:11:02

+0

@ user198729:运算符'./'和'。*'表示*元素*分割和乘法,以便图像矩阵的每个元素除以或乘以255.您可以检查类(即数据类型)通过输入'class(grayImage)'来输入矩阵。虽然'double(grayImage)'和'grayImage'可能会出现*相同,它们可能每个都是不同的类(使得它们以不同的方式存储它们的值)。 – gnovice 2010-04-12 13:17:28

+0

我尝试了各种操作,但是'/'和'。/'从不给出不同的结果...并且因为double(grayImage)与'grayImage'相同,所以double(grayImage)./ 255'也是和'grayImage./255'一样。所以,你可以举两个例子来说明为什么'./'和'double'是必须的? – user198729 2010-04-12 13:25:13

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图像,则需要将单通道矩阵转换为3通道矩阵。

+0

我认为,通过定义'rgbImage'的最大值为'1',表示'white',但这似乎不是如此呢? – user198729 2010-04-12 08:42:31

+0

不是,它取决于您对图像的使用情况。 – Jacob 2010-04-12 14:10:46