[数字图像处理](一)彩色图像转灰度图像的三种方式与效果分析

图像处理(一)

彩色图片转灰度图片


三种实现方式

  • 最大值法

    \(imMax = max( im(i,j,1),im(i,j,2),im(i,j,3) )\)

  • 平均法

    \(imEva = \frac{im(i,j,1)}{3} + \frac{im(i,j,2)}{3} + \frac{im(i,j,3)}{3}\)

  • 加权平均值法

    \(imKeyEva = 0.2989\times im(i,j,1) + 0.5870\times im(i,j,2) + 0.1140\times im(i,j,3)\)

matlba实现

clc;
close all;
clear all;

%   相对路径读入图片(和代码在同一文件夹下)
im = imread('p2.jpg');
%---查看图片,检测是否成功读入
%   对显示的图片进行排版
subplot(2,3,4);
imshow(im);
%   对图片进行命名
title('原图');
[col,row,color] = size(im);%col为图片的行数,row为图片的列数,color对于彩色图片一般为3,每层对应RGB
%利用matlab自带的函数进行 rgb_to_gray;
im_matlab = rgb2gray(im);
subplot(2,3,1);
imshow(im_matlab);
title('matlab自带rgb2gray');
%--------------------------------------------------------
%---用最大值法
%   创建一个全为1的矩阵,长宽等同于原图的
im_max = ones(col,row);

for i = 1:1:col
    for j = 1:1:row
        im_max(i,j) = max( im(i,j,:)  );
    end
end
%   将矩阵变为8byte无符号整型变量(不然无法显示图片)
%   !!!最好在计算操作结束后再变化,不然会有精度问题!!!!!
im_max = uint8(im_max);
subplot(2,3,2);
imshow(im_max);
title('最大值法');
%--------------------------------------------------------
%    平均值法 
im_eva = ones(col,row);

for i = 1:1:col
    for j = 1:1:row
        im_eva(i,j) = im(i,j,1)/3 + im(i,j,2)/3 + im(i,j,3)/3 ;
        %   两种的结果其实一样,但是如果先转换为uint8就会出现精度问题
        %sum1 = im(i,j,1)/3 + im(i,j,2)/3 + im(i,j,3)/3
        %sum2 = ( im(i,j,1) + im(i,j,2)+ im(i,j,3) )/3;
        %fprintf( " %.4f  %.4f \n",sum1 ,sum2 ) ;
    end
end
im_eva = uint8(im_max);
subplot(2,3,3);
imshow(im_eva);
title('平均值法');
%--------------------------------------------------------
%    加权平均法(rgb2gray所使用的权值)
im_keyeva = ones(col,row);
%   加权算法先转换为uint8计算效果更好
im_keyeva = uint8(im_max);
for i = 1:1:col
    for j = 1:1:row
        im_keyeva(i,j) = 0.2989*im(i,j,1) + 0.5870*im(i,j,2) + 0.1140*im(i,j,3) ;
    end
end

subplot(2,3,5);
imshow(im_keyeva);
title('加权平均法');


总结


通过上面的代码结合实际的测试,果然,matlab自带的rgb2gray也就是加权平均的方法,对光线明暗的处理是最好的。

上一篇:即时通讯系列-WorkPlus简介


下一篇:通过图片识别实现水文数据抓取的方法