手动将RGB图像转换为Grayscale Matlab

时间:2013-06-24 13:31:53

标签: matlab image-processing

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

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

我试图通过

首先阅读图像
fid = fopen('color.raw');
myimage = imread(fid, [512 384], 'uint8');
fclose(fid);

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

从概念上讲,您只需对红色,绿色和蓝色组件求平均值,然后将该平均值作为红色,绿色和蓝色组件的输出。您可以使用简单的算术平均值

来完成此操作
  • (R + G + B)/ 3。

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

  • (R * G * B)^(1/3)。

答案 1 :(得分: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。

答案 2 :(得分:2)

其他用户表示平均所有3个值的问题在于,这根本不是我们眼睛的工作方式。

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

enter image description here

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

0.2989 * R + 0.5870 * G + 0.1140 * B

看到价值观的鲜明对比?

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

MATLAB渲染它的方式如下:

enter image description here