为什么图像的红色、绿色、蓝色通道单独进行灰度化处理(Matlab)?

3

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

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

例如,原始图像如下:
enter image description here 如果显示红色、绿色和蓝色通道,您将得到以下灰度图像:
enter image description here 如果将其中一个通道与两个黑色矩阵(零矩阵)连接起来,就可以得到彩色图像。让我们对剩余的通道连接黑色图像矩阵:
blackImage = uint8(zeros(rows, columns));
newRedChannel = cat(3, redChannel, blackImage, blackImage);
newGreenChannel = cat(3, blackImage, greenChannel, blackImage);
newBlueChannel = cat(3, blackImage, blackImage, blueChannel);

它输出以下图像: enter image description here

为什么要这样做?为什么每个颜色的单独信道必须与零矩阵(黑色图像)连接在一起,以便在显示时着色?为什么单独的颜色信道实际上只是灰度图像(如果单独显示)?

1个回答

8
在MATLAB中,灰度图像表示为二维矩阵。彩色图像表示为三维矩阵。红色图像仍然是彩色图像,因此它仍然必须是三维图像。由于它是纯红色图像,因此没有其他颜色,绿色和蓝色通道应为空,因此为零的矩阵。
还要注意,当我们说灰度时,实际上是指indexed image。因此,您可以通过应用colourmap将其变为彩色图像。如果您应用的颜色映射范围从黑色到红色,则您的二维矩阵将显示为上面的红色图像。问题是,MATLAB如何知道应用哪个颜色映射?是的,这确实比彩色图像占用更少的空间。但它增加了代码的复杂性。
另一方面,如果您将两个颜色通道设置为零,您会期望图像看起来像什么?唯一合乎逻辑的答案就是您上面创建的单独颜色通道图像。
如果您愿意,可以将您的问题重新表述为“MATLAB还有哪些其他实现方式?”。换句话说,如果您的红色通道是一个2D图像,MATLAB如何知道它是红色通道而不是绿色通道或灰度图像?挑战自己去思考一种更实用的表示这些数据的方式。我认为这个练习会让您相信MATLAB在这个问题上的设计选择是正确的。
此外,值得注意的是,许多文件格式(例如.bmp)都以同样的方式工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接