关闭

颜色空间,图像格式,彩色转灰度函数

5468人阅读 评论(0) 收藏 举报
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
rgb颜色空间

灰度图像是一个特殊的彩色图像,r=g=b,如图


所以,要将彩色图像转化为灰度图像,只需令每个像素的r=g=b=x即可.而x等于多少,视不同情况而定。
补充:
黑色 r=0 g=0 b=0
白色 r=255 g=255 b=255

黑色物体之所以是黑色,是因为它吸收了所有的可见光,所以看上去是黑的,
而相反,白色物体反射了所有可见光,而所有可见光组合成白色,所以看上去是白的。

绿色的物体之所以是绿色,是因为它的表面分子、原子的特点是吸收其他颜色能力强,却不怎么吸收绿色光,才显绿色的。

//读取一个彩色图像
>> I=imread('lena.jpg');
>> whos I
  Name      Size                   Bytes  Class

  I       512x512x3               786432  uint8 array

Grand total is 786432 elements using 786432 bytes
//分别取r,g,b各个分量
>> r=I(:,:,1);
>> g=I(:,:,2);
>> b=I(:,:,3);
>> whos r
  Name      Size                   Bytes  Class

  r       512x512                 262144  uint8 array

Grand total is 262144 elements using 262144 bytes

>> whos g
  Name      Size                   Bytes  Class

  g       512x512                 262144  uint8 array

Grand total is 262144 elements using 262144 bytes

>> whos b
  Name      Size                   Bytes  Class

  b       512x512                 262144  uint8 array

Grand total is 262144 elements using 262144 bytes
//将源图像和三个分量的图像显示出来
>> subplot(1,4,1);imshow(I);title('I')
>> subplot(1,4,2);imshow(r);title('r')
>> subplot(1,4,3);imshow(g);title('g')
>> subplot(1,4,4);imshow(b);title('b')


matlab有一个函数可以直接取灰度图像,rgb2gray。其实它是取r,g,b和的均值计算gray的。验证如下
>> gray=rgb2gray(rgb);
>> whos gray
  Name       Size                   Bytes  Class

  gray     512x512                 262144  uint8 array
>> figure(2);subplot(1,2,1);imshow(gray);title('rgb2gray')
//用r,g,b平均值组成一个灰度图像
>> r=double(r);g=double(g);b=double(b);
>> average=(r+g+b)/3;
>> average=uint8(average);
>> whos average
  Name          Size                   Bytes  Class

  average     512x512                 262144  uint8 array
>> figure(2);subplot(1,2,2);imshow(average);title('average')

//显示的图像如下

直接观察图像的数据,像素值大致差不多的。
>> gray(1,:)

ans =

  Columns 1 through 25 

   162   161   161   160   162   156   163   162   165   161   162   160   154   165   158   154   159   153   162   161   152   156   157   156   154

>> average(1,:)

ans =

  Columns 1 through 25 

   163   162   162   161   163   157   163   162   165   161   162   160   153   164   158   152   157   151   161   159   150   154   153   154   153

可以将r,g,b三个分量再次组合成一个彩色rgb图像
rgb=cat(3,r,g,b)

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
YUV颜色空间

是欧洲电视系统采用的一种颜色编码方法。Y亮度,U,V色差。
rgb2yuv
function yuv = rgb2yuv(rgb)
% yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像,
% 输入图像是一个彩色像素的M×N×3的数组,
% 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
% 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
% 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。
%
% 输出YUV图像是uint8。
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);

% 执行转换函数
y = 0.299*r + 0.587*g + 0.114*b;
u = 0.567*(b - y);
v = 0.713*(r - y);

% 防止溢出
if(y < 0)
    y = 0;
end;
if(y > 1.0)
    y = 1.0;
end;
if(u < 0)
    u = 0;
end;
if(u > 1.0)
    u = 1.0;
end;
if(v < 0)
    v = 0;
end;
if(v > 1.0)
    v = 1.0;
end;
    
% 联合yuv,并转成uint8类型
y = y*255;
u = u*255;
v = v*255;
yuv = cat(3, y, u, v);
yuv = uint8(yuv);
rgb=imread('lena.jpg');
subplot(1,2,1);imshow(rgb);title('rgb');

yuv=rgb2yuv(rgb);
subplot(1,2,2);imshow(yuv);title('yuv');

//观察h,s,i分量值,与r,g,b有很大不同。
>> y=hsi(:,:,1);
>> y(1,:)

ans =

  Columns 1 through 27 

   162   161   161   160   162   156   163   162   165   161   162   160   154   165   158   154   159   153   162   161   152   156   157   156   154   156   154
...
>> u=hsi(:,:,2);
>> u(1,:)

ans =

  Columns 1 through 27 

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
...
>> v=hsi(:,:,3);
>> v(1,:)

ans =

  Columns 1 through 27 

    44    44    44    44    45    45    47    47    47    47    45    45    44    44    44    44    44    43    45    44    45    45    46    47    47    47    47
...


//观察y,u,v图像
subplot(1,3,1);imshow(y);title('y');  
subplot(1,3,2);imshow(u);title('u');  
subplot(1,3,3);imshow(v);title('v');



yuv2rgb
function rgb = yuv2rgb(yuv)
% yuv = rgb2yuv(rgb)把一幅RGB图像转换为YUV图像,
% 输入图像是一个彩色像素的M×N×3的数组,
% 其中每一个彩色像素都在特定空间位置的彩色图像中对应红、绿、蓝三个分量。
% 假如所有的RGB分量是均衡的,那么HSI转换就是未定义的。
% 输入图像可能是double(取值范围是[0, 1]),uint8或 uint16。
%
% 输出YUV图像是uint8。
yuv = im2double(yuv);
y = yuv(:, :, 1);
u = yuv(:, :, 2);
v = yuv(:, :, 3);

% 执行转换函数
r = y + 1.402*v;
g = y - 0.344*u - 0.714*v;
b = y + 1.772*u;

% 防止溢出
if(r < 0)
    r = 0;
end;
if(r > 1.0)
    r = 1.0;
end;
if(g < 0)
    g = 0;
end;
if(g > 1.0)
    g = 1.0;
end;
if(b < 0)
    b = 0;
end;
if(b > 1.0)
    b = 1.0;
end;
    
% 联合rgb
r = r*255;
g = g*255;
b = b*255;
rgb = cat(3, r, g, b);
rgb = uint8(rgb);

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
关于图像格式

bmp和jpg的比较
lena_bmp=imread('lena.bmp');%读取lena.bmp
imwrite(lena_bmp,'lena.jpg');%生成lena.jpg
lena_jpg=imread('lena.jpg');%读取lene.jpg

//观察变量
>> whos lena_bmp
  Name           Size                   Bytes  Class

  lena_bmp     512x512x3               786432  uint8 array

Grand total is 786432 elements using 786432 bytes

>> whos lena_jpg
  Name           Size                   Bytes  Class

  lena_jpg     512x512x3               786432  uint8 array

Grand total is 786432 elements using 786432 bytes

//观察图像,lena,jpg占用磁盘空间要远小于lena.bmp.
>> imfinfo 'lena.bmp'

ans = 

              Filename: 'lena.bmp'
           FileModDate: '05-Apr-2012 11:39:48'
              FileSize: 786486
                Format: 'bmp'
         FormatVersion: 'Version 3 (Microsoft Windows 3.x)'
                 Width: 512
                Height: 512
              BitDepth: 24
             ColorType: 'truecolor'
       FormatSignature: 'BM'
    NumColormapEntries: 0
              Colormap: []
               RedMask: []
             GreenMask: []
              BlueMask: []
       ImageDataOffset: 54
      BitmapHeaderSize: 40
             NumPlanes: 1
       CompressionType: 'none'
            BitmapSize: 786432
        HorzResolution: 0
        VertResolution: 0
         NumColorsUsed: 0
    NumImportantColors: 0

>> imfinfo 'lena.jpg'

ans = 

           Filename: 'lena.jpg'
        FileModDate: '05-Apr-2012 11:45:50'
           FileSize: 38916
             Format: 'jpg'
      FormatVersion: ''
              Width: 512
             Height: 512
           BitDepth: 24
          ColorType: 'truecolor'
    FormatSignature: ''
            Comment: {}


bmp文件格式挖掘
http://blog.csdn.net/o_sun_o/article/details/8351037
将lena.bmp以二进制形式打开,比如用ida,如下
,摘抄一部分
seg000:00000000  42 4D 36 00 0C 00 00 00-00 00 36 00 00 00 28 00 "BM6......6...(."
seg000:00000010  00 00 00 02 00 00 00 02-00 00 01 00 18 00 00 00 "............"
seg000:00000020  00 00 00 00 0C 00 00 00-00 00 00 00 00 00 00 00 "..............."
seg000:00000030  00 00 00 00 00 00 38 13-51 3A 15 53 44 22 62 3D "......8Q:SD"b="
seg000:00000040  1B 5B 40 20 61 35 15 56-3B 18 5B 41 1C 60 48 23 "[@ a5V;[A`H#"
seg000:00000050  67 42 1B 5F 3D 17 59 3F-19 5B 45 20 60 42 1D 5D "gB_=Y?[E `B]"
seg000:00000060  5C 3B 78 6E 58 92 7E 80-B0 A1 B0 D7 A9 BB D8 AA "\;xnX拁€啊白┗鬲"
seg000:00000070  BD D8 AD BC DC B0 BF E0-AF BF DC B0 C0 DD AB C0 "截馨苦馨垒"
seg000:00000080  DB A8 BD D9 A1 B9 D7 A3-BA DA 96 B1 D3 8F A8 D0 "郇劫」祝黑柋訌ㄐ"
seg000:00000090  7E 94 C8 58 64 A6 54 52-9E 58 50 A7 5D 5D BB 61 "~斎XdR瀀P]籥"
seg000:000000A0  67 CA 5A 67 CF 60 71 D8-6C 81 E4 71 87 E6 71 8C "g蔤g蟕q豯佷q囨q?
seg000:000000B0  E3 72 8F E4 6F 8F E2 7A-9C EF 76 9A E8 83 A5 F1 "鉹忎o忊z滐v氳儱?
seg000:000000C0  82 A2 EB 85 A3 EA 82 A3-EC 81 A2 EB 81 A1 E8 81 "偄雲j偅靵㈦仭鑱"
seg000:000000D0  A1 E8 82 A5 E9 81 A4 ED-80 A4 F2 7E A3 F3 75 9B "¤偉閬ろ€を~su?
seg000:000000E0  E9 7F A2 EC 83 9C E6 81-8E DA 6D 68 BD 45 33 86 "?㈧儨鎭広mh紼3?
seg000:000000F0  60 45 8F 6C 48 8E 52 2C-6E 4A 21 64 43 20 60 52 "`E弆H嶳,nJ!dC `R"
seg000:00000100  2F 6F 41 1F 5C 3C 13 51-40 12 54 41 0E 52 3C 0D "/oA\<Q@TAR<
"
seg000:00000110  51 3C 0F 54 3F 1B 5D 47-25 66 55 34 71 45 20 5E "Q<T?]G%fU4qE ^"
seg000:00000120  36 0D 47 3B 0F 4C 4A 20-5D 59 30 6E 42 18 59 3F "6
G;LJ ]Y0nBY?"
seg000:00000130  15 56 5D 32 75 59 2E 71-4D 24 68 68 3F 83 46 1D "V]2uY.qM$hh?僃"
seg000:00000140  61 51 28 6C 52 28 6F 5B-31 78 57 2D 74 4C 22 69 "aQ(lR(o[1xW-tL"i"
seg000:00000150  53 29 70 5C 30 75 59 2E-71 65 3A 7B 57 29 6B 4E "S)p\0uY.qe:{W)kN"
seg000:00000160  1D 61 4C 1A 60 55 22 66-66 33 6F 84 51 8D 7C 4A "aL`U"ff3o凲峾J"
seg000:00000170  8A 5B 2E 66 9F 7D 9C B1-92 B1 6C 48 7C 49 24 64 "奫.f焳湵挶lH|I$d"
seg000:00000180  3E 1C 5D 47 1E 61 61 30-74 62 2D 70 36 0B 4A 48 ">]Gaa0tb-p6JH"
seg000:00000190  1A 5C 51 1C 66 54 1C 67-5F 34 73 83 5C 93 83 60 "\QfTg_4s僜搩`"
seg000:000001A0  8C 84 5F 8D 4C 1D 55 3E-0F 4E 41 18 56 65 3B 7C "寗_峀U>NAVe;|"
seg000:000001B0  64 37 76 65 30 73 60 2A-6F 61 2B 70 57 27 69 90 "d7ve0s`*oa+pW'i?
seg000:000001C0  61 99 AB 76 A1 9B 65 90-7A 47 81 52 1F 62 48 19 "a櫕ve恴G丷bH"
seg000:000001D0  58 55 28 60 95 6F 93 AB-87 AB 6B 4B 7C 5F 3D 79 "XU(`昽摣嚝kK|_=y"
seg000:000001E0  41 18 56 38 0A 4C 4B 1C-5A 4F 1D 5D 44 15 54 3E "AV8
LKZO]DT>"
seg000:000001F0  0D 51 46 1A 5D 43 16 5B-5A 2F 72 52 27 6A 5E 34 "
QF]C[Z/rR'j^4"
seg000:00000200  75 65 3B 7C 52 28 65 57-2D 6A 56 29 68 49 1C 5B "ue;|R(eW-jV)hI["
seg000:00000210  3C 0D 4C 4F 20 5F 46 1B-5C 49 1D 58 61 39 69 8B "<
LO _F\IXa9i?
seg000:00000220  5B 8F 7E 45 89 4F 17 60-37 0C 4F 4C 27 65 72 49 "[弤E塐`7OL'erI"
seg000:00000230  86 77 50 8E 51 2F 70 5A-39 7C 87 65 A1 64 40 86 "唚P嶲/pZ9|噀@?
seg000:00000240  42 1E 78 36 16 7B 45 2C-8E 45 32 93 43 31 94 41 "Bx6{E,嶦2揅1擜"
seg000:00000250  33 98 41 35 99 3B 30 98-4A 41 A9 43 39 A4 44 3B "3楢5?0楯A〤9;"
seg000:00000260  A9 41 37 A9 44 3E AF 4A-43 B6 46 43 B7 48 45 B9 "〢7〥>疛C禙C稨E?
seg000:00000270  49 49 BD 47 47 BD 4C 4C-C2 48 47 BF 4E 4C C4 4D "II紾G絃L翲G縉L腗"
seg000:00000280  4B C3 4D 4B C3 5A 58 D0-51 50 C8 57 56 CE 51 52 "K肕K肸X蠶P萕V蜵R"
seg000:00000290  CA 57 58 D0 52 58 CF 4B-51 C8 4E 56 CD 53 5B D2 "蔠X蠷X螷Q萅V蚐[?
seg000:000002A0  4D 57 CD 52 5C D2 50 59-CE 51 5A CF 53 5C D1 57 "MW蚏\襊Y蜵Z蟂\裌"
seg000:000002B0  5E D3 59 60 D3 5C 61 D4-5E 62 D3 5E 62 D3 58 5B "^覻`覾a証b觀b覺["
seg000:000002C0  CE 5A 5D D0 58 5C D2 57-5B D1 54 5C D3 57 5F D6 "蝂]蠿\襑[裈\覹_?
seg000:000002D0  56 5E D7 52 5A D3 57 5E-D3 57 5E D3 59 5D D3 5A "V^識Z覹^覹^覻]覼"
seg000:000002E0  5E D4 5B 5F D5 5D 61 D7-5E 63 D6 5E 63 D6 5A 62 "^訹_誡a譤c謂c諾b"
seg000:000002F0  D3 5D 65 D6 5B 65 D7 5E-67 DC 56 60 D5 59 62 DB "覿e諿e譤g躒`誝b?
seg000:00000300  58 60 DB 57 5F DB 55 5E-DD 54 5D DC 56 60 DC 56 "X`踂_踀^軹]躒`躒"
seg000:00000310  60 DC 5D 66 DF 5F 68 E1-5D 65 DC 61 69 E0 61 68 "`躚f達h醈e躠i郺h"
seg000:00000320  DD 5D 64 D9 5C 63 D8 5F-66 DB 5C 64 DB 58 60 D7 "輂d賊c豞f踈d踃`?
seg000:00000330  5A 62 DB 60 67 E2 5C 64-DF 5C 64 E0 59 60 DB 5E "Zb踐g鈂d運d郰`踍"
seg000:00000340  65 E0 5F 64 DE 62 67 E1-62 66 DD 69 6D E4 67 69 "e郷d辀g醔f輎m鋑i"
seg000:00000350  DF 66 68 DE 65 69 DF 67-6B E1 66 6D E2 63 6A DF "遞h辝i遟k醘m鈉j?
seg000:00000360  60 69 DE 63 6A DF 64 6C-DD 6C 72 E3 6B 71 E2 66 "`i辌j遜l輑r鉱q鈌"
seg000:00000370  6C DD 6A 71 E0 6E 75 E4-6A 71 DE 65 6C D9 68 6F "l輏q鄋u鋔q辝l賖o"
seg000:00000380  DC 69 70 DD 6A 71 DE 67-6E DB 68 6F DE 68 6F DE "躨p輏q辡n踙o辢o?
seg000:00000390  66 6D DC 6D 76 E5 66 71-E0 65 72 E0 66 71 E0 67 "fm躮v錰q鄀r鄁q鄃"
seg000:000003A0  72 E1 67 73 DF 68 74 E0-67 73 DF 67 73 DF 6C 76 "r醙s遠t鄃s遟s遧v"
seg000:000003B0  E1 6D 77 E2 6D 78 E0 6C-77 DF 6D 78 E0 6F 7A E2 "醡w鈓x鄉w適x鄌z?
seg000:000003C0  6E 7A E0 6B 77 DD 6A 79-DD 69 78 DC 6A 78 DE 6B "nz鄈w輏y輎x躩x辦"
seg000:000003D0  79 DF 6B 79 DF 6B 79 DF-6C 7A E0 6C 7A E0 6F 7B "y遦y遦y遧z鄉z鄌{"
seg000:000003E0  E1 6E 77 DE 6E 77 DE 74-7B E2 76 7B E1 73 78 DE "醤w辬w辴{鈜{醩x?
seg000:000003F0  74 79 DF 77 80 E2 78 87-E3 71 83 DC 7A 8C E5 6D "ty遷€鈞囥q冘z屽m"
seg000:00000400  7F D8 70 82 DD 73 85 E0-70 81 DE 71 82 DF 74 83 "豴傒s呧p佫q傔t?
seg000:00000410  DF 78 86 DF 7D 8B E3 7A-87 DD 82 8E E0 81 8D DF "選嗊}嬨z囕値鄟嵾"
seg000:00000420  86 92 E0 82 8E DC 81 8E-DD 81 8E DD 80 8E DA 88 "啋鄠庈亷輥庉€広?
seg000:00000430  96 E2 86 93 DD 88 95 DF-85 92 DC 89 96 E0 8B 98 "栤啌輬曔厭軌栢嫎"
seg000:00000440  E2 8C 99 E3 8D 9C E1 8E-9E E1 91 A2 E1 95 A7 E2 "鈱欍崪釒炨憿釙р"
seg000:00000450  97 AA E3 96 AA E1 97 A9-DE 98 AA DF A0 B3 E6 A3 "棯銝棭迾牫妫"
seg000:00000460  B6 E9 A1 B2 E3 A2 B3 E4-A5 B8 E5 A4 B7 E4 A8 B9 "堕〔恽充ジ澶蜂ü"
seg000:00000470  E4 A5 B6 E1 AB BB E5 AB-BB E5 AD BB E5 B2 C0 EA "浈夺瀚诲宀狸"
seg000:00000480  B1 BF E9 B2 C1 E8 B1 C3-E8 B4 C6 EB B5 C4 EB B6 "笨椴凌泵璐齐的攵"
seg000:00000490  C2 EA BB C6 EC C0 C8 ED-BE C6 EB BD C5 EA C1 CC "玛黄炖软酒虢抨撂"
seg000:000004A0  F2 B8 C8 EC B6 CD ED B8-CF EF BB CA F1 BB BF F2 "蚋褥锻砀巷皇窕框"
seg000:000004B0  93 88 CE 77 5D AB 77 50-9B 83 56 9F 70 4A 92 65 "搱蝫]玾P泝V焢J抏"
seg000:000004C0  45 8C 60 46 8C 54 41 86-53 44 88 54 47 8B 51 47 "E宍F孴A哠D圱G婹G"
seg000:000004D0  8D 4A 40 86 52 47 8F 55-4A 93 4F 46 8F 51 47 93 "岼@哛G廢J揙F廞G?
seg000:000004E0  54 4C 99 5D 53 9F 5D 50-9A 60 53 9D 5C 51 9A 59 "TL橾S焆P歚S漒Q歒"
seg000:000004F0  51 9E 60 5D AC 63 64 B5-60 65 BA 5E 66 BF 5D 68 "Q瀈]琧d礰e篰f縘h"
seg000:00000500  C4 60 6C CC 5F 6C CE 5C-68 CE 5C 68 CE 5B 66 CE "腵l蘝l蝄h蝄h蝃f?
seg000:00000510  57 61 CC 56 60 CC 54 5B-CA 56 5C CD 59 60 CF 59 "Wa蘓`蘐[蔞\蚘`蟉"
seg000:00000520  60 CF 55 5D C8 52 5A C5-55 5E C6 5A 63 CB 5C 67 "`蟄]萊Z臮^芞c薥g"
seg000:00000530  CF 63 6E D6 5F 6C D6 62-6F D9 5E 6B D7 60 6D D9 "蟘n謃l謆o賌k譧m?
seg000:00000540  56 65 D3 56 63 D1 56 60-CC 51 57 C2 56 59 C2 4C "Ve覸c裋`蘍W耉Y翷"
seg000:00000550  4B B2 49 44 A7 4C 44 A3-42 37 94 50 41 9D 50 3F "K睮DD7擯A漃?"
seg000:00000560  9A 4A 38 93 4D 3A 91 49-34 89 47 33 86 42 2B 7D "欽8揗:慖4塆3咮+}"
seg000:00000570  46 30 7E 49 2F 7B 4B 2D-74 57 38 7D 4A 2C 73 58 "F0~I/{K-tW8}J,sX"
seg000:00000580  3A 81 58 3B 84 60 43 8C-5B 40 8A 5D 42 8C 5E 44 ":乆;刞C孾@奭B宆D"
seg000:00000590  90 56 3C 88 5C 42 8E 5A-40 8C 58 3C 88 59 3D 89 "怴<圽B嶼@孹<圷=?
seg000:000005A0  54 39 83 50 36 82 4D 37-86 56 40 92 57 45 98 56 "