手动将RGB图像转换为灰度图像Matlab

3

首先声明一下,我知道有函数可以帮我完成这个任务,但我想手动操作一遍,以便更好地理解其中的细节。

我的目标是读入一张RGB图像并将其转换为灰度图像。到目前为止,我所有的图像处理工作都是基于灰度图像完成的,所以我有点迷茫。

我尝试过先通过以下代码读入图像:

fid = fopen('color.raw');
myimage = imread(fid, [512 384], 'uint8');
fclose(fid);

但我的图像最终变成了一个空的0 x 0矩阵。我认为我需要为每个像素分配一个“R”“G”和“B”值,从而为每个像素赋予三个颜色值,但我不确定是否正确,甚至不知道如何尝试。

我的问题是:如何读取RGB图像然后将其转换为灰度图像。

编辑:因此,在获取R,G和B值后,我理解如何将RGB转换为灰度,但我似乎无法让Matlab读入图像,有人可以提供任何帮助吗?使用imread似乎是最合适的,但

[pathname] = ...
     uigetfile({'*.raw';'*.mdl';'*.mat';'*.*'},'File Selector');
fid = fopen(pathname);
myimage = imread(fid);
fclose(fid);

出现问题了,我收到了一个fopen无效文件名的错误提示,但我真的不理解为什么会这样。

3个回答

3

概念上,您只需对红色、绿色和蓝色分量求平均值,然后将该平均值作为红色、绿色和蓝色分量的输出。您可以使用简单的算术平均数来实现这一点。

  • (r+g+b)/3.

或者为了好玩,您可以使用几何平均数来获得略微不同的对比度。

  • (r*g*b)^(1/3).

不错的观点,@LastCoder!当涉及到边缘检测或需要类似人类对比感知的区域时,你尤其需要使用亮度。 - RutledgePaulV
嘿,Paul_R和@LastCoder,我现在输出了4张图片(R G B和平均值),但平均值不是灰度图像,而是类似于绿色但红色较少。这张图片直观地看起来是前面3张的平均值,因为颜色在所有地方都不那么极端,但图像不像我想要的灰度图像。有什么提示吗?发生了什么? - user2475404
1
假设颜色由红、绿和蓝三个部分组成:我们从这一点开始 - 现在为导出的图像创建一个新的颜色。这种新的颜色将包含以下组件:red = averagegreen = averageblue = average。您不需要制作4张图片,只需在输出之前平均每个像素的组件即可。是的,Shaun314正确指出,加权平均值会产生更真实的对比度。我有点困惑你到底在做什么。导出的图像应该具有a == g == b,因此根本没有色调。 - RutledgePaulV
1
如果你的平均图像仍然是彩色的,那么可能是因为你将灰度值映射到了一种颜色上。请确保使用 colormap gray 命令。在Matlab中可能会有括号包围着gray,我已经有一段时间没有使用过了。 - Kyle Heuton
如果您给MATLAB一个2D矩阵,并且没有奇怪的颜色映射,它将永远不会返回实际具有颜色的东西。它是否实际上具有绿色色调,还是平均图像几乎匹配绿色值?我希望是后者,如果您查看亮度方程式,为什么绿色切片看起来类似于平均切片就很容易理解了。 - Shaun314

3

使用以下代码:fid = fopen('color.raw'); myimage = imread(fid, [512 384], '*uint16'); fclose(fid);会返回一个“无效文件名”的错误,但是color.raw是正确的文件名,并且它在Matlab文件夹中。您知道为什么会出现这种情况吗? - user2475404
@user2475404 - imread的文档要求第一个参数是文件名,但我怀疑你的问题与RAW格式有关。你的fread命令应该可以工作,但也许你的RAW文件有头字节导致失败。 - Louis Ricci

2
其他用户提到的将3个值平均化的问题在于这不是我们的眼睛工作的方式。当您对图像进行平均处理时,会得到以下结果(内置的peppers.png图像)。
您实际上是在找到平均值时执行grayImg=.33*R+.33*G+.33*B,现在将其与MATLAB如何计算灰度值进行比较(考虑到人类如何查看图像)0.2989 * R + 0.5870 * G + 0.1140 * B。
看到数值上的明显对比了吗?
为了获得更好的数据外观,应尽量接近MATLAB使用的系数:)
MATLAB的渲染方式如下图所示:

Shaun,我很惊讶差别如此之大。可能是因为原始图像使用了非常基础的颜色? - RutledgePaulV
说实话,我也很惊讶!这张图片本身非常基础,主要是红色和绿色(想象一下辣椒哈哈),我认为这就是原因。我猜测 OP 的图片也有类似的问题。 - Shaun314

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