RGB图像可以看作彼此堆叠的三个图像(红色比例图像,绿色比例图像和蓝色比例图像)。在MATLAB中,RGB图像基本上是M * N * 3的彩色像素阵列,其中每个彩色像素都是一个三元组,它对应于指定空间位置处RGB图像的红色,蓝色和绿色分量。
同样,可以将灰度图像视为单层图像。在MATLAB中,灰度图像基本上是M * N数组,其值已按比例缩放以表示强度。
在MATLAB中,有一个名为rgb2gray()的函数可用于将RGB图像转换为灰度图像。在这里,我们将不使用rgb2gray()函数将RGB图像转换为灰度图像。
我们的关键思想是通过计算所有三个颜色分量的加权和,将RGB图像像素转换为单个值,该RGB图像像素将对应于指定空间位置的图像的红色,蓝色和绿色分量的三重态值转换为单个值。
转换算法:
- 将RGB彩色图像读取到MATLAB环境中
- 将RGB图像中的红色,蓝色和绿色分量提取到3种不同的二维矩阵中
- 创建一个与RGB图像具有相同行数和列数的新矩阵,其中包含全零。
- 通过形成红色,绿色和蓝色分量的加权总和,将位置(i,j)处的每个RGB像素值转换为灰度值,并将其分配给新矩阵中的对应位置(i,j)
grayscale value at (i, j) = 0.2989 * R(i, j) + 0.5870 * G(i, j) + 0.1140 * B(i, j);
注意:用于计算灰度值的系数与用于在Rec.4中计算亮度(E’y)的系数相同。 ITU-R BT.601-7建议书(国际电联无线电通信部门对广播业务(电视)的建议)
执行:
% Function will take a colour image as input and will return a grayscale image
function [gray_img] = colouredToGray(img)
% Extract Red colour component to R, Green colour component to G
% and Blue colour component to B
R=img(:, :, 1);
G=img(:, :, 2);
B=img(:, :, 3);
% Getting number of rows in M and number of column in N of RGB image matrix
% ~ is used to ignore dimension of RGB image
% as size(img) function will return row, column and dimension of the RGB image
[M, N, ~]=size(img);
% creating a new 2-d matrix 'gray_img' of size M*N of 'uint8' data type with all
% elements as zero
gray_img=zeros(M, N, 'uint8');
% calculating grayscale values by forming a weighted sum of the R, G, and B components
% for each pixel
for i=1:M
for j=1:N
gray_img(i, j)=(R(i, j)*0.2989)+(G(i, j)*0.5870)+(B(i, j)*0.114);
end
end
end
上面的函数将从MATLAB命令窗口中调用
>> % Reading an RGB image file in MATLAB environment
>> img=imread('apple.jpg');
>> % The above function will be called here
>> I=colouredToGray(img);
>> figure, imshow(I);
输入:
输出:
好处:
- 要存储RGB彩色图像的单个彩色像素,我们将需要8 * 3 = 24位(每个颜色分量为8位),但是当我们将RGB图像转换为灰度图像时,仅需要8位即可存储单个像素图片。因此,与存储RGB图像相比,存储灰度图像所需的内存要少33%
- 灰度图像更容易在各种任务中工作,例如在许多形态学运算和图像分割问题中,单层图像(灰度图像)比三层图像(RGB彩色图像)更容易处理
- 当我们处理单层图像时,也更容易区分图像的特征