-
2004-12-14
用matlab读取16位、14位、12位灰度bmp图像(*.bmp) - [Matlab]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
16位、14位、12位灰度bmp图像(*.bmp)并不是标准的格式,bmp图像只有16位的彩色图像而没有16位的灰度图像之说。所以,对于16位、14位、12位灰度bmp图像,一般是当做16位的彩色图像写入的,由于这个原因,计算机上看到的这些16位、14位、12位灰度bmp图像看起来都是彩色的,虽然我们写数据的时候写的是灰度的信息。
http://darnshong.52blog.net/logs/2186935.html
用matlab可以读取16位的bmp图像,但是得到的数据是matlab解析过的彩色数据信息,RGB三个分量都是uint8,且matlab已经把RGB三分量的范围映射到0~255。这些并不是我们想要的bmp图像里的16位数据信息,必须经过适当的处理之后才能得到。只要得到了bmp图像里的16位数据信息,也就得到了那些非标准格式的灰度bmp图像(16位、14位、12位灰度bmp图像)的灰度信息。
倘若想保存16位、14位、12位灰度图像而又不让计算机解析成彩色图像,可以保存为*.png、*.tiff格式,这两种格式都支持16位的灰度图像。
另外还要提一下的是,由于我们现在所使用的计算机一般最高级也就24位的真彩色(RGB各8位),而要显示灰度图像,RGB三分量必须都相等,也就是说,用来显示灰度的其实只有8位,对于8位以上(不含8位)的灰度图像,计算机是没法正确显示的,无怪乎你若是把原来16位的灰度图像从bmp格式转化成png格式,图像反而不清楚了,因为16位灰度bmp格式时,计算机显示的是彩色图像,而16灰度png格式时,计算机显示的是灰色图像。
16位的bmp图像格式有两种,一种是R5G5B5,最高位不用,另一种是R5G6B5。
以下是matlab实现上述过程的源代码:
function b=read16graybmp(filename)
%usage: read16graybmp(filename)
%designed by darnshong ioe,cas
if(nargin~=1)
error('Need 1 parameters!');
end;
i=0:2^5-1;index5=floor(i*255.99/(2^5-1));%for 5bits
%index5=[0 8 16 24 33 41 49 57 66 74 82 90 99 107 115 123 132 140 148 156 165 173 181 189 198 206 214 222 231 239 247 255];
value5(index5 1)=0:2^5-1;
j=0:2^6-1;index6=floor(j*255.99/(2^6-1));%for 6bits
value6(index6 1)=0:2^6-1;
minfo=imfinfo(filename);
%if(strcmp(minfo.CompressionType,'none'))%for 555 format R5G5B5
a=double(imread(filename));% modified by darnshong,2006-09-06
b1=value5(a(:,:,1) 1);
b2=value5(a(:,:,2) 1);
b3=value5(a(:,:,3) 1);
b=bitshift(uint16(b1),10) bitshift(uint16(b2),5) uint16(b3);
% else % for 565 format R5G6B5 ,matlab not supported!
%a=imread(filename);
%b1=value5(a(:,:,1) 1);
%b2=value6(a(:,:,2) 1);
% b3=value5(a(:,:,3) 1);
% b=bitshift(uint16(b3),11) bitshift(uint16(b2),5) uint16(b1);
%end;随机文章:
利用低通滤波实现图像的插值放大 2006-03-31分辩率,刷新率设置出错导致无法显示! 2005-07-27应用图像数据仿真VHDL文件(基于Matlab与Modelsim)(三) 2004-11-08
收藏到:Del.icio.us






评论
不错 !
了解,了解,谢谢.
学习了一下,谢谢