rgbImage = grayImage/max(max(grayImage));
rgbImage = grayImage/255;
这上面是正确的,原因是什么?
rgbImage = grayImage/max(max(grayImage));
rgbImage = grayImage/255;
这上面是正确的,原因是什么?
要转换grayscale image到RGB image,有两个问题必须解决:
double
数据类型存储时,图像像素值应该是0到1范围内的浮点数。存储为uint8
数据类型时,图像像素值应该是0到255范围内的整数。您可以使用功能class
检查图像矩阵的数据类型。这里有3个典型的状况下,你可能会遇到:
要将uint8
或double
灰度图像转换成的RGB图像相同的数据类型,您可以使用的功能repmat
或cat
:
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]);
根据定义,RGB图像有3个通道,这意味着您需要一个三维矩阵来表示图像。所以,正确的答案是:
rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);
正常化时要小心grayImage
。如果grayImage
是uint8
那么您将在255*grayImage/max(grayImage(:))
操作中失去一些精度。
此外,标准化grayImage
取决于数据。在你的问题,你用两种方法:
rgbImage = grayImage/max(max(grayImage));
其标准化的灰度图像,使得图像中的最大值为1
和
rgbImage = grayImage/255;
它才有意义,如果在grayImage
谎言中的值0-255
系列。
所以它真的取决于你想要做什么。但是,如果您需要RGB图像,则需要将单通道矩阵转换为3通道矩阵。
我认为,通过定义'rgbImage'的最大值为'1',表示'white',但这似乎不是如此呢? – user198729 2010-04-12 08:42:31
不是,它取决于您对图像的使用情况。 – Jacob 2010-04-12 14:10:46
我刚做了一个测试,看起来'double(grayImage)'和'grayImage'是一样的吗?在MATLAB中用'./'和'。*'来划分和乘积运算符?似乎'。/'和'/'是一样的吗? – user198729 2010-04-12 13:11:02
@ user198729:运算符'./'和'。*'表示*元素*分割和乘法,以便图像矩阵的每个元素除以或乘以255.您可以检查类(即数据类型)通过输入'class(grayImage)'来输入矩阵。虽然'double(grayImage)'和'grayImage'可能会出现*相同,它们可能每个都是不同的类(使得它们以不同的方式存储它们的值)。 – gnovice 2010-04-12 13:17:28
我尝试了各种操作,但是'/'和'。/'从不给出不同的结果...并且因为double(grayImage)与'grayImage'相同,所以double(grayImage)./ 255'也是和'grayImage./255'一样。所以,你可以举两个例子来说明为什么'./'和'double'是必须的? – user198729 2010-04-12 13:25:13