rgbImage = grayImage / max(max(grayImage));
或者rgbImage = grayImage / 255;
上述哪个是正确的,为什么?
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]);
按照定义,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 图像,你需要将单通道矩阵转换为三通道矩阵。
rgbImage
的最大值应该是 1
,代表着白色,但事实似乎并非如此? - user198729
double(grayImage)
和grayImage
是相同的?而且在MATLAB中,./
和.*
是除法和乘法运算符吗?看起来./
和/
是相同的? - user198729./
和.*
表示逐元素除法和乘法,因此图像矩阵的每个元素都被255除或乘。您可以通过输入class(grayImage)
来检查矩阵的类(即数据类型)。虽然double(grayImage)
和grayImage
可能看起来相同,但它们可能是不同的类(以不同的方式存储其值)。 - gnovice/
е’Ң./
д»ҺжңӘдә§з”ҹдёҚеҗҢзҡ„з»“жһң... еӣ дёәdouble(grayImage)
е’ҢgrayImage
жҳҜзӣёеҗҢзҡ„пјҢжүҖд»Ҙdouble(grayImage)./255
д№ҹдёҺgrayImage./255
зӣёеҗҢгҖӮдҪ иғҪеҗҰз»ҷеҮәдёӨдёӘдҫӢеӯҗпјҢиҜҙжҳҺдёәд»Җд№ҲйңҖиҰҒ./
е’Ңdouble
пјҹ - user198729B
是单个标量值,则命令A/B
将与A./B
给出相同的结果。写成./
只是为了让阅读代码的人明确地知道正在进行元素级别的除法。其次,我认为在我的答案中已经很清楚,只有当您想要从另一种数据类型转换为double
时才需要使用double
。如果grayImage
已经是double
类型,则不需要转换。 - gnovicedouble
和浮点数数据类型,谢谢你的回答! - user198729