• 2004-12-14

    用matlab读取16位、14位、12位灰度bmp图像(*.bmp) - [Matlab]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://darnshong.52blog.net/logs/2186935.html

    16位、14位、12位灰度bmp图像(*.bmp)并不是标准的格式,bmp图像只有16位的彩色图像而没有16位的灰度图像之说。所以,对于16位、14位、12位灰度bmp图像,一般是当做16位的彩色图像写入的,由于这个原因,计算机上看到的这些16位、14位、12位灰度bmp图像看起来都是彩色的,虽然我们写数据的时候写的是灰度的信息。

      用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;

    参考:用matlab读取16位灰度bmp图像(续)
      
      
      
        
      

     


    收藏到:Del.icio.us




    评论

  • 请问你里面的那个a=double()函数在哪里啊?
  • 不错,学习学习!
  • 不错 !

  • 了解,了解,谢谢.

  • 学习了一下,谢谢

发表评论

您将收到博主的回复邮件
记住我