灰度化算法原理

RGB应该都听说过,我们一般看到的彩色图像嘛,R、G、B分别对应了三原色:红色(red)、绿色(green)和蓝色(blue)。如果有玩过P图的,也许会知道,画板调色也是调这三个通道图像的亮度,亮度范围在0到255之间。
所以这很容易就可以推导出来一个结果:
rgb(255,0,0)就是红色,rgb(0,255,0)就是绿色,rgb(0,0,255)就是蓝色,三通道亮度拉满rgb(255,255,255)就是白色。三者如果化作三个坐标轴,关系就如图所示。
20200316204921686.png
这里结合一下matlab来说明一下。

img = imread('lena.png');
[y,x,color] = size(img);

我们来看看上面两行代码得到的结果。

代码结果
imread就是读取图片,size就是把前面读取到的信息提取出来。可以看到,经过imread函数,图像已经变成了矩阵,也就是三个512x512的矩阵。这里的512x512是我导入的图像的大小,单位是像素。
其实说白了,所谓的灰度,其实就是像素的亮度。每个像素的亮度值都在(0,255)之间,所以如果要显示的话,将三个通道的亮度值提取出来,就可以看到三张灰度的图像。
202003162058371.png
从上面这张图像来看,可以看到红色通道那一张比较亮,这也可以说明,红色的值比较多。
而我们灰度化的目的,就是将RGB三通道的亮度值融合一起,变成一张灰度图像。
所以我们要用编程实现,就是弄几个循环,然后对RGB三个通道的亮度值进行处理。这个处理方法一共有三种。
一种就是最大值法
所谓最大值法,就是比较三通道的每一个像素的亮度值,谁的亮度值大(也可以说是灰度值),就取谁的值。
第二种是平均值法
所谓平均值法,其实就是将三个通道的灰度值全部加起来,然后求一个平均值。
第三种是加权平均法
所谓加权平均法,就是将三通道的灰度值乘一定比例,然后再把三通道的灰度值相加。

代码实现

接下来就根据这三种方法使用matlab进行编程实现。代码如下:

%灰度化算法
%matlab实现

clear;
clc;
img = imread('lena.png');
%提取图像的信息:行、列以及通道数量
[m,n,color] = size(img);
%创建一个模板
gray_img1 = zeros(m,n);
gray_img2 = zeros(m,n);
gray_img3 = zeros(m,n);
for x = 1:m
    for y = 1:n
        %最大值法
        gray_img1(x,y) = max(img(x,y,1),max(img(x,y,2),img(x,y,3)));
        %平均值法
        gray_img2(x,y) = (double(img(x,y,1))+double(img(x,y,2))+double(img(x,y,3)))/3;
        %加权平均法
        gray_img3(x,y) = 0.229*img(x,y,1)+0.578*img(x,y,2)+0.114*img(x,y,3);
    end
end
figure();
subplot(131);
imshow(uint8(gray_img1),[]);
xlabel('最大值法');
subplot(132);
imshow(uint8(gray_img2),[]);
xlabel('平均值法');
subplot(133);
imshow(uint8(gray_img3),[]);
xlabel('加权平均法');

然后我们可以看一下效果:
灰度化效果
从上面三张图片看,最大值法的结果明显会亮一点。而平均值法和加权平均法差别看似不是很大,但有的时候对于个别特殊的图像,加权平均法还是挺有用的,可以分别调整三个颜色通道的权重值,这样会方便对图像进行处理。

%这个是改进的代码,虽然说区别不大,但看上去更加简洁
%最大值法
gray_img1 = max(max(img(:,:,1),img(:,:,2)),img(:,:,3));
%平均值法
gray_img2 = (img(:,:,1)+img(:,:,2)+img(:,:,3))./3;
%权值平均法
gray_img3 = 0.4*img(:,:,1)+0.5*img(:,:,2)+0.1*img(:,:,3);
%%注意要将其转化为double型
文章目录