3

让我先说一下,我知道有些功能可以为我做这件事,但我想手动做,这样我就可以了解这里到底发生了什么。

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

我试图先读入图像

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

但 myimage 最终是一个空的 0 x 0 矩阵。我想我需要为每个像素分配一个“R”“G”和“B”值,从而为每个像素提供三种颜色的三个值,但我不确定这是否正确,甚至如何尝试。

我的问题如下:我将如何读取 RGB 图像然后变成灰度图像。

编辑:所以我明白在获得 RG 和 B 值后如何将 RGB 转换为灰度,但我似乎无法让 Matlab 读取图像,有人可以提供任何帮助吗?使用 imread 似乎最有意义,但是

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

不工作,我收到 fopen 文件名无效的错误,我真的不明白为什么。

4

3 回答 3

3

从概念上讲,您只需平均红色、绿色和蓝色分量,然后提供该平均值作为红色、绿色和蓝色分量的输出。您可以使用简单的算术平均值来做到这一点

  • (r+g+b)/3。

或者对于踢球,您可以使用几何平均值来获得稍微不同的对比度。

  • (r*g*b)^(1/3)。
于 2013-06-24T13:35:12.637 回答
3

imread - 从图形文件中读取图像(在文档中) http://www.mathworks.com/help/matlab/ref/imread.html

对于 RGB 到灰度,使用亮度方法。http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

光度法是平均法的更复杂的版本。它还对这些值进行平均,但它形成了一个加权平均值来解释人类的感知。我们对绿色比其他颜色更敏感,所以绿色的权重最大。光度的公式是 0.21 R + 0.71 G + 0.07 B。

于 2013-06-24T13:35:19.790 回答
2

正如其他用户所指出的那样,对所有 3 个值进行平均的问题在于,我们的眼睛根本不是这样工作的。

当你平均你的图像时,你会得到下面的结果(在内置的 peppers.png 图像上)

在此处输入图像描述

当您找到平均值时,您实际上是在做 grayImg=.33*R+.33*G+.33*B,现在将其与 MATLAB 计算灰度值的方式进行比较(考虑人类如何查看图像)

0.2989 * R + 0.5870 * G + 0.1140 * B

看到价值观的鲜明对比了吗?

为了获得更好看的数据,请更接近 MATLAB 使用的系数 :)

MATLAB 的渲染方式是这样的:

在此处输入图像描述

于 2013-06-24T17:53:45.987 回答