图像处理(一)
彩色图片转灰度图片
三种实现方式
-
最大值法
\(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也就是加权平均的方法,对光线明暗的处理是最好的。