这篇文章只罗列出一些最简单的图像格式转换方法。
1,RGB图像转与灰度图相互转换
从视觉角度来看rgb图像是有色彩的,而灰度图则只有255种灰色。
从矩阵来看,rgb是个三维矩阵--三个二维矩阵落在一起,一层是R一层是G一层是B。灰度图是个二维矩阵。
从rgb图像转换为灰度图很容易:rgb2gray(f) 一个函数搞定。至于原理是什么,没时间管它因为暂时用不着,感兴趣的有时间可以了解一些。
但是从灰度图转换为rgb有点费事了,我也很奇怪这一点,去网上查了好多,貌似技术控们总是喜欢用技术含量高的东西,很多方法都是用colormap完成的,这东西很好,但是我不能在10分钟搞明白,所以我又找到了一个更简单的方法--把二维的复制三次让他成为三维的不就行了?嗯,果真是行的。
rgbf=repmat(gf,[1 1 3]), 这个函数就是把灰度图像f的矩阵,在一维方向复制一次,二维方向复制一次,三维方向复制三次。~不是在源图像复制,是在rgbf上复制,复制完rgbf是个size(f,1),size(f,2),3的三维矩阵。这样就可以把rgbf当做彩色图来使用了,比如将图片(100,100)这一点标记为红色---rgbf(100,100,:)=[255,0,0];
下面举个简单的小例子。因为我的目的不是将灰度图复原成彩色图,而只是在灰度图上用一些色彩标记一些特定的区域而已,目的很简单,实现起来也很容易。下面将展示如何将fig1中的黑色部分变为红色。fig1其实是个二值图像,之后0和1两个值。
代码很简单:
blacks=find(fig1==0); %得到黑色区域
fr=fig1; % 复制r,g,b通道
fg=fig1;
fb=fig1;
fr(blacks)=255; % 将黑色变为红色
fg(blacks)=0;
fb(blacks)=0;
figrgb=cat(3,fr,fg,fb); % 合成彩色图像
fig1 figrgb
2,double(f),将unit8或是uint16转化为浮点型,因为无符号整形是很容易越界的,所以经常要转换为浮点数来用。
3,把浮点数转换为unit8或是unit16 把矩阵乘以255或是65536就可以。
4,mat2gray(f) 把矩阵f的值转换到[0 1]范围内。
5,im2uint8(f) 转换为uint8格式,如果f是浮点数,那么先将f整到[0 1]范围内。