【问题标题】:Why Red, Green, Blue channels of image separetely are grayscaled (Matlab)?为什么图像的红、绿、蓝通道分别是灰度(Matlab)?
【发布时间】:2016-03-20 21:13:06
【问题描述】:

Matlab 将图像存储为 3 维数组。前两个维度对应于上图轴上的数字。每个像素由图像第三维中的三个条目表示。三层中的每一层都代表像素阵列中红色、绿色和蓝色的强度。我们可以通过以下方式提取图像的独立红绿蓝分量:

redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);

例如原图为:

如果您显示红色绿色和蓝色通道,您会得到以下灰度图像:

如果您将这些通道之一与两个黑色矩阵(零矩阵)连接,您将获得彩色图像。让我们将每个通道与剩余通道的黑色图像矩阵连接起来:

blackImage = uint8(zeros(rows, columns));
newRedChannel = cat(3, redChannel, blackImage, blackImage);
newGreenChannel = cat(3, blackImage, greenChannel, blackImage);
newBlueChannel = cat(3, blackImage, blackImage, blueChannel);

它输出以下图像:

为什么会这样?为什么每种颜色的单个通道必须与剩余通道的零矩阵(黑色图像)连接,以便在显示时对其进行着色?如果单独显示,为什么单个颜色通道实际上只是灰度图像?

【问题讨论】:

    标签: image matlab image-processing rgb


    【解决方案1】:

    在 MATLAB 中,灰度图像表示为 2D 矩阵。彩色图像作为 3D 矩阵。红色图像仍然是彩色图像,因此它仍然必须是 3D 图像。由于它是纯红色图像,因此没有其他颜色,因此绿色和蓝色通道应该是空的,因此是零矩阵。

    另请注意,当我们说灰度时,我们实际上指的是indexed image。因此,您可以通过应用colourmap 将其设为彩色图像。如果您要应用从黑色到红色的颜色图,那么您的 2D 矩阵将显示为上面的红色图像。问题是,MATLAB 怎么知道要应用什么颜色图?是的,这确实比彩色图像占用更少的空间。但它增加了代码的复杂性。

    另一方面,问问自己,如果您将两个颜色通道设置为零,您希望图像看起来像什么?唯一合乎逻辑的答案就是您在上面创建的单独的颜色通道图像。

    如果您愿意,请尝试将您的问题改写为“MATLAB 还能如何实现这一点?”。换句话说,如果您的红色通道是 2D 图像,MATLAB 怎么知道它是红色通道而不是绿色通道或灰度图像?挑战自己,想出一种更实用的方法来表示这些数据。我认为这个练习会让你相信 MATLAB 在这个问题上的设计选择的优点。

    另外值得注意的是,许多文件格式,例如.bmp,以同样的方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2013-05-17
      • 1970-01-01
      • 2011-09-22
      • 2021-02-28
      • 2017-12-28
      • 2016-09-22
      相关资源
      最近更新 更多