【发布时间】:2011-02-06 20:38:35
【问题描述】:
rgbImage = grayImage / max(max(grayImage));
或
rgbImage = grayImage / 255;
以上哪项是正确的,原因是什么?
【问题讨论】:
标签: image matlab matrix rgb grayscale
rgbImage = grayImage / max(max(grayImage));
或
rgbImage = grayImage / 255;
以上哪项是正确的,原因是什么?
【问题讨论】:
标签: image matlab matrix rgb grayscale
要将grayscale image 转换为RGB image,您必须解决两个问题:
double 数据类型时,图像像素值应为 0 到 1 范围内的浮点数。当存储为 uint8 数据类型时,图像像素值应为 0 到 1 范围内的整数255. 可以使用class函数检查图像矩阵的数据类型。以下是您可能会遇到的 3 种典型情况:
要将uint8 或double 灰度图像转换为相同数据类型的RGB 图像,您可以使用函数repmat 或cat:
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中的除法和乘积运算符吗?似乎./ 与/ 相同?
./和.*表示element-wise除法和乘法,这样图像矩阵的每个元素都除以或乘以255 . 您可以通过键入class(grayImage) 来检查矩阵的类(即数据类型)。虽然double(grayImage) 和grayImage 可能看起来相同,但它们可能各自是不同的类(因此它们以不同的方式存储它们的值)。
/和./从来没有给出不同的结果...而且因为double(grayImage)与grayImage相同,double(grayImage)./255也与grayImage./255.那么,你能举两个例子来说明为什么./和double是必要的吗?
B 是单个标量值,则命令A/B 将给出与A./B 相同的结果。编写./ 只是让正在阅读代码的人清楚地知道正在发生逐元素划分。其次,我认为我的回答很清楚,只有当您想要从 另一种数据类型 转换为 double 时,才需要使用 double。如果grayImage 已经是double 类型,则无需转换。
double 和float point 在c/c++ 中的类似数据类型,谢谢您的回答!
根据定义,RGB 图像有 3 个通道,这意味着您需要一个 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,但似乎不是这样?