图像处理rgb格式

2016-07-23 20:34:54 LG1259156776 阅读数 4525

RGB格式

RGB组合格式

名字

RGB组合格式

描述

此格式用来匹配PC图形帧缓存。每个像素占据8,16,24或32个位,他们都是组合像素格式,其意为在内存中所有像素数据都是相邻排列的。当使用这些格式之一时,驱动应该上报颜色空间为V4L2_COLORSPACE_SRGB。

表2.6 组合RGB图像格式

定义 Byte 0 Byte 1 Byte 2 Byte 3
V4L2_PIX_FMT_RGB332 RGB1 r2 r1 r0 g2 g1 g0 b1 b0 - - -
V4L2_PIX_FMT_RGB444 R444 g3 g2 g1 g0 b3 b2 b1 b0 a3 a2 a1 a0 r3 r2 r1 r0 - -
V4L2_PIX_FMT_RGB555 RGBO g2 g1 g0 b4 b3 b2 b1 b0 a r4 r3 r2 r1 r0 g4 g3 - -
V4L2_PIX_FMT_RGB565 RGBP g2 g1 g0 b4 b3 b2 b1 b0 r4 r3 r2 r1 r0 g5 g4 g3 - -
V4L2_PIX_FMT_RGB555X RGBQ a r4 r3 r2 r1 r0 g4 g3 g2 g1 g0 b4 b3 b2 b1 b0 - -
V4L2_PIX_FMT_RGB565X RGBR r4 r3 r2 r1 r0 g5 g4 g3 g2 g1 g0 b4 b3 b2 b1 b0 - -
V4L2_PIX_FMT_BGR666 BGRH b5 b4 b3 b2 b1 b0 g5 g4 g3 g2 g1 g0 r5 r4 r3 r2 r1 r0 -
V4L2_PIX_FMT_BGR24 BGR3 b7 b6 b5 b4 b3 b2 b1 b0 g7 g6 g5 g4 g3 g2 g1 g0 r7 r6 r5 r4 r3 r2 r1 r0 -
V4L2_PIX_FMT_RGB24 RGB3 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0 -
V4L2_PIX_FMT_BGR32 RGR4 b7 b6 b5 b4 b3 b2 b1 b0 g7 g6 g5 g4 g3 g2 g1 g0 r7 r6 r5 r4 r3 r2 r1 r0 a7 a6 a5 a4 a3 a2 a1 a0
V4L2_PIX_FMT_RGB32 RGB4 a7 a6 a5 a4 a3 a2 a1 a0 r7 r6 r5 r4 r3 r2 r1 r0 g7 g6 g5 g4 g3 g2 g1 g0 b7 b6 b5 b4 b3 b2 b1 b0

第7位是符号位,a(alpha)的值在读取驱动时并未定义,所以编写驱动时忽略它吧,除非是在Overlay或输出Overlay时候协商了透明度,又或是在使用V4L2_CID_ALPHA_COMPONENT控制视频捕捉时候设置透明度部分。

例2.2 V4L2_PIX_FMT_BGR24 4 x 4像素图像

start + 00:    B00    G00    R00    B01    G01    R01    B02    G02    R02    B03    G03    R03
start + 12:    B10    G10    R10    B11    G11    R11    B12    G12    R12    B13    G13    R13
start + 24:    B20    G20    R20    B21    G21    R21    B22    G22    R22    B23    G23    R23
start + 36:    B30    G30    R30    B31    G31    R31    B32    G32    R32    B33    G33    R33

V4L2_PIX_FMT_SBGGR8('BA81')

名字

V4L2_PIX_FMT_SBGGR8 贝尔RGB格式

描述

这一般是数字相机的本地格式,与CCD设备的传感器阵列对应。每个像素只有一个值或是红色、绿色、蓝色,丢失的部分必须由相邻像素插值而来。第一行从左到右由蓝色和绿色组成,第二行是绿色和红色,每两行/列以此类推。

例2.3 V4L2_PIX_FMT_SBGGR8 4 x 4像素图像

start + 0:    B00    G01    B02    G03
start + 4:    G10    R11    G12    R13
start + 8:    B20    G21    B22    G23
start +12:    G30    R31    G32    R33

V4L2_PIX_FMT_SGBRG8 ('GBRG')

名字

V4L2_PIX_FMT_SGBRG8 贝尔RGB格式

描述

贝尔格式描述基本相同,只是像素排列规则不同。此格式是第一行从做到有包含绿色和蓝色,第二行是红色和绿色,每两行/列依此类推。

例2.4 V4L2_PIX_FMT_SGBRG8 4 x 4像素图像

start + 0:    G00    B01    G02    B03
start + 4:    R10    G11    R12    G13
start + 8:    G20    B21    G22    B23
start +12:    R30    G31    R32    G33

V4L2_PIX_FMT_SGRBG8 ('GRBG')

名字

V4L2_PIX_FMT_SGRBG8 贝尔RGB格式

描述

第一行从左到右包含绿色和蓝色,第二行包含红色和绿色,每两行/列依此类推。

例2.5 V4L2_PIX_FMT_SGRBG8 4 x 4像素图像

start + 0:    G00    R01    G02    R03
start + 4:    R10    B11    R12    B13
start + 8:    G20    R21    G22    R23
start +12:    R30    B31    R32    B33

V4L2_PIX_FMT_SRGGB8 ('RGGB')

名字

V4L2_PIX_FMT_SRGGB8 贝尔RGB格式

描述

第一行从左到右包含红色和绿色,第二行包含绿色和蓝色,每两行/列依此类推。

例2.6 V4L2_PIX_FMT_SRGGB8 4 x 4像素图像

start + 0:    R00    G01    R02    G03
start + 4:    G10    B11    G12    B13
start + 8:    R20    G21    R22    G23
start +12:    G30    B31    G32    B33

V4L2_PIX_FMT_SBGGR16 ('BYR2')

名字

V4L2_PIX_FMT_SBGGR16 贝尔RGB格式

描述

此格式与V4L2_PIX_FMT_SBGGR8很相似,不同是每个像素拥有16位深度。低数据存储在小地址内存中(低位机)。实际采样精度可能会比16位低,必须每个像素10位,值范围0~1023(如MT9T001)。

例2.7 V4L2_PIX_FMT_SBGGR16 4 x 4像素图像

start + 0:    B00low    B00high    G01low    G01high    B02low    B02high    G03low    G03high
start + 8:    G10low    G10high    R11low    R11high    G12low    G12high    R13low    R13high
start +16:    B20low    B20high    G21low    G21high    B22low    B22high    G23low    G23high
start +24:    G30low    G30high    R31low    R31high    G32low    G32high    R33low    R33high

V4L2_PIX_FMT_SRGGB10 ('RG10'), V4L2_PIX_FMT_SGRBG10 ('BA10'), V4L2_PIX_FMT_SGBRG10 ('GB10'), V4L2_PIX_FMT_SBGGR10 ('BG10')

名字

V4L2_PIX_FMT_SRGGB10 ('RG10'), V4L2_PIX_FMT_SGRBG10 ('BA10'), V4L2_PIX_FMT_SGBRG10 ('GB10'), V4L2_PIX_FMT_SBGGR10 ('BG10') 10bit贝尔格式扩展的16位格式

描述

这4个像素格式是每个颜色10位的raw sRGB/贝尔格式。每个颜色部分都存储在16位字段中,高6位是不用的,填充0。每n像素行包含n/2个绿色取样和n/2个蓝色取样或红色取样,红色和蓝色行交替。字节以低位机序列存储。他们通常是来描述如GRGR...BGBG...或RGRG...GBGB...等等。以下是其中的一个例子。

例2.8 V4L2_PIX_FMT_SBGGR10 4 x 4像素图像

每个代表一个字节,高字节的高6位为0
start + 0:    B00low    B00high    G01low    G01high    B02low    B02high    G03low    G03high
start + 8:    G10low    G10high    R11low    R11high    G12low    G12high    R13low    R13high
start +16:    B20low    B20high    G21low    G21high    B22low    B22high    G23low    G23high
start +24:    G30low    G30high    R31low    R31high    G32low    G32high    R33low    R33high

V4L2_PIX_FMT_SBGGR10ALAW8 ('aBA8'), V4L2_PIX_FMT_SGBRG10ALAW8 ('aGA8'), V4L2_PIX_FMT_SGRBG10ALAW8 ('agA8'), V4L2_PIX_FMT_SRGGB10ALAW8 ('aRA8')

名字

V4L2_PIX_FMT_SBGGR10ALAW8 , V4L2_PIX_FMT_SGBRG10ALAW8 , V4L2_PIX_FMT_SGRBG10ALAW8 , V4L2_PIX_FMT_SRGGB10ALAW8 10位贝尔格式压缩至8位。

描述

这些格式是每个颜色10位的raw sRGB/贝尔格式压缩到8位,使用A-LAW算法。每个颜色部分在内存中占据8位,其他与V4L2_PIX_FMT_SRGGB8特性类似。

V4L2_PIX_FMT_SBGGR10DPCM8 ('bBA8'), V4L2_PIX_FMT_SGBRG10DPCM8 ('bGA8'), V4L2_PIX_FMT_SGRBG10DPCM8 ('BD10'), V4L2_PIX_FMT_SRGGB10DPCM8 ('bRA8')

名字

V4L2_PIX_FMT_SBGGR10DPCM8, V4L2_PIX_FMT_SGBRG10DPCM8, V4L2_PIX_FMT_SGRBG10DPCM8, V4L2_PIX_FMT_SRGGB10DPCM8 10位贝尔格式压缩至8位。

描述

使用DPCM将每个颜色部分压缩至8位。DPCM调整是有损耗的,每个颜色在内存中占用8位,其他部分与V4L2_PIX_FMT_SRGGB10 ('RG10'), V4L2_PIX_FMT_SGRBG10 ('BA10'), V4L2_PIX_FMT_SGBRG10 ('GB10'), V4L2_PIX_FMT_SBGGR10 ('BG10')类似。

V4L2_PIX_FMT_SRGGB12 ('RG12'), V4L2_PIX_FMT_SGRBG12 ('BA12'), V4L2_PIX_FMT_SGBRG12 ('GB12'), V4L2_PIX_FMT_SBGGR12 ('BG12')

名字

V4L2_PIX_FMT_SRGGB12, V4L2_PIX_FMT_SGRBG12, V4L2_PIX_FMT_SGBRG12, V4L2_PIX_FMT_SBGGR12 12位贝尔格式扩展为16位

描述

每个颜色12位的raw sRGB/贝尔格式,每个颜色部分被保存在16位的字段中,高6位为0。每个n像素行包含n/2个绿色取样及n/2个蓝色或红色取样,红、蓝行交替。字节按低位机顺序存储在内存中,通常用来描述如GEGE...BGBG...或RGRG...RBRB...等。下边是其中一个的例子。

例2.9 V4L2_PIX_FMT_SBGGR12 4 x 4像素图片

start + 0:    B00low    B00high    G01low    G01high    B02low    B02high    G03low    G03high
start + 8:    G10low    G10high    R11low    R11high    G12low    G12high    R13low    R13high
start +16:    B20low    B20high    G21low    G21high    B22low    B22high    G23low    G23high
start +24:    G30low    G30high    R31low    R31high    G32low    G32high    R33low    R33high
2008-10-13 14:16:00 arau_sh 阅读数 5217

      对于进行图像处理的程序员来说,图像格式是必须了解的问题。本文不涉及压缩图像格式,只对YUV和RGB图像进行描述。


1. RGB图像和YUV图像区别

      RGB和YUV图像的区别在于色彩空间坐标系描述上不同,就如同我们用直角坐标和极坐标来描述方程一样。
      RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色. RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。
      YUV图像的坐标空间为HSL(hue,saturation,lightness/luminance)。其中H表示色相、H表示饱和度,L表示亮度。该颜色空间可以用一个圆锥来表示,如下图所示:



2. 色彩空间中图像的表示

      图像由像素组成的,在表示一个像素点时,像素点中坐标的位置不同会形成不同图像格式。如RGB和BGR。YUV和YVU。
      由于是使用计算机来存储或表示图像,连续的坐标值必须被离散化。可以使用8bit的空间来存储一个R值,也可以使用6bit的空间来存储R值。存储位数的不同也会形成不同的图像格式。如RGB24,RGB565。
      一幅图像是由多个像素组成的。由于在计算机中存储是线性的,可以被存储成(r1, g1, b1)(r2, g2, b2)...(rn, gn, bn),也可以被存成(r1,r2,...,rn)(g1,g2,...,gn)(b1,b2,...,bn)。不同像素之间坐标值的存储顺序也会形成不同的图像格式。前者被称为打包格式(packed), 后者被称为p(planar)。比如说YUV420 Planar,和YUV420 packed。通常状态下,默认的是打包格式,如YUV420。而如果是平面格式,会在其后加一个P标明,如UV420P.

      一幅图像是由多个像素组成的。图像的相邻像素点是存在相关性的,也许可以用某个像素点的坐标值来代替周围像素点的坐标值。这种不同像素点之间相关性的表示的不同方法,也会形成不同的图像格式。如YUV420和YUV422。


      YUV 的优点之一是,色度频道的采样率可比 Y 频道低,同时不会明显降低视觉质量。有一种表示法可用来描述 U 和 V 与 Y 的采样频率比例,这个表示法称为 A:B:C 表示法:
      •4:4:4 表示色度频道没有下采样。
      •4:2:2 表示 2:1 的水平下采样,没有垂直下采样。对于每两个 U 样例或 V 样例,每个扫描行都包含四个 Y 样例。
      •4:2:0 表示 2:1 的水平下采样,2:1 的垂直下采样。

      •4:1:1 表示 4:1 的水平下采样,没有垂直下采样。对于每个 U 样例或 V 样例,每个扫描行都包含四个 Y 样例。

      可以这么来记忆上述格式,A:B表示水平下采样,B:C表示垂直下采样


3. 具体格式

      具体格式见下列连接,讲的非常清楚。

      1, 图文详解YUV420数据格式

      2.  关于yuv 格式-Semi Planar和Planar

      3. 使用 8 位 YUV 格式的视频呈现

      4. YUV(一)-数据格式分析

4. 其他

      SP: SP(Semi-Planar)指的是YUV不是分成3个平面而是分成2个平面。Y数据一个平面,UV数据合用一个平面。UV平面的数据格式是UVUVUV...。

      Interlace/Progressive:这个术语和图像格式无关,和视频采集的扫描相关。interlace指的是隔行扫描,是把一帧图像分成上下两场,上场(Top field)的数据是整个图像的奇数行(1,3,5,7...),下场(Bottom field)的数据是整个图像的偶数行(2,4,6,8...)。两场穿插组合起来变成一帧完整图像。而progressive指的是逐行扫描,一帧图像的每一行都按顺序排放。

      上采样/下采样:所谓采样就是采集模拟信号的样本。 采样是将时间上、幅值上都连续的信号,在采样脉冲的作用下,转换成时间、幅值上离散的信号。所以采样又称为波形的离散化过程。 普通的奈奎斯特采样定理的前提是频率受限于(0,f)的带限信号。
      通常采样指的是下采样,也就是对信号的抽取。其实,上采样和下采样都是对数字信号进行重采,重采的采样率与原来获得该数字信号(比如从模拟信号采样而来)的采样率比较,大于原信号的称为上采样,小于的则称为下采样。上采样的实质也就是内插或插值。
      上采样是下采样的逆过程,也称增取样(Upsampling)或内插(Interpolating)。增取样在频分多路复用中的应用是一个很好的例子。

2016-03-10 23:04:31 HorizontalView 阅读数 2557

图像处理笔记 —— 图像的读取及RGB分离等



一. 图像的读取

matlab中图像的读取主要是 imread 函数,imread 函数需要输入您要读取的图片的路径,返回一个图像矩阵,如果是彩色图返回一个三维矩阵,如256*256*3,其中256×256是指图像中的维数256×256,后面的3位为RGB每个8bit的数值,其中(:,:,1)为红色,(:,:,2)为绿色,(:,:,3)为蓝色;如果是灰度表示的图片,则返回一个二维矩阵,如256*256,其中256×256是指图像中的维数256×256。

figure('NumberTitle','off','Name','原图');    % 图像显示窗口的设置
img = imread('4.1.06.tiff');            %图片读取
imshow(img);   %图片显示
title('原图');  %图片的 标题

二. RGB三元素的分离

在进行图像处理时,一般需要RGB三原色的分离,以下代码即为分离过程:先从图像矩阵中分别提取出三原色,然后分别显示,详情见代码注释

[r,c,z] = size(img);        %提取图像矩阵维数
red =zeros(256,256,3);      %分为构造红色,绿色,蓝色的图像矩阵
green =zeros(256,256,3);
blue =zeros(256,256,3);

subplot(222);           
red(:,:,1) = img(:,:,1);    %提取红色的色彩值
red=uint8(red);         %将double类型转换成8bits类型
imshow(red);            %显示仅有的红色图片
title('红色分离');

subplot(223);
green(:,:,2) = img(:,:,2);
green=uint8(green);
imshow(green);
title('绿色分离');

subplot(224);
blue(:,:,3) = img(:,:,3);
blue=uint8(blue);
imshow(blue);
title('蓝色分离');

三. 把彩色图片转化成灰度图片

在做图像处理时,经常会将彩色图片转换成灰度图来进行表示,matlab 给我们提供了很好的函数来进行转换,详情见源码:

I = rgb2gray(img);  %转换函数,输入为彩色图像矩阵,输出为灰度图像矩阵
figure(3);
imshow(I);

2019-03-29 14:18:20 tomy2426214836 阅读数 104516

RGB颜色空间

RGB(red,green,blue)颜色空间最常用的用途就是显示器系统,彩色阴极射线管,彩色光栅图形的显示器 都使用R、G、B数值来驱动R、G、B 电子枪发射电子,并分别激发荧光屏上的R、G、B三种颜色的荧光粉发出不同亮度的光线,并通过相加混合产生各种颜色;扫描仪也是通过吸收原稿经反射或透射而发送来 的光线中的R、G、B成分,并用它来表示原稿的颜色。RGB色彩空间称为与设备相关的色彩空间,因为不同的扫描仪扫描同一幅图像,会得到不同色彩的图像数据;不同型号的显示器显示同一幅图像,也会有不同 的色彩显示结果。显示器和扫描仪使用的RGB空间与CIE 1931 RGB真实三原色表色系统空间是不同的,后者 是与设备无关的颜色空间。btw:Photoshop的色彩选取器(Color Picker)。可以显示HSB、RGB、LAB和CMYK 色彩空间的每一种颜色的色彩值。

在计算机技术中使用最广泛的颜色空间是RGB颜色空间,它是一种与人的视觉系统结构密切相关的模型。根据人眼睛的结构,所有的颜色都可以看成三个基本颜色-红色(red)、绿色(green)和蓝色(blue)的不同组合,大部分显示器都采用这种颜色模型。对一幅三通道彩色数字图像对每个图像像素(x,y),需要指出三个矢量分量R、G、B;

根据美国国家电视制式委员会NTSC制式的标准,当白色的亮度用Y来表示是,它和红基色(R)、绿基色(G)、蓝基色(B)的关系可用如下的方程等式描述:
在这里插入图片描述

图1 RGB彩色空间
在这里插入图片描述

图2 人视网膜中三种不同视锥细胞的光谱相对敏感性

RGB对应到显示器的三个刺激值,组成三维正交坐标系统,该系统中任何颜色都落入RGB彩色立方体内,在RGB颜色模型中,黑色在原点处,白色位于离原点最远的角上,灰度级沿着这两点的连线分布,每一个分量图像都是其原色图像。

RGB颜色空间最大的优点就是适合于显示系统,直观且容易理解。但是对彩色描述上的应用还有以下不足:

(1) RGB颜色空间利用三个颜色分量的线性组合来表示颜色,因此不同的色彩难以用精确的数值来表示,定量分析困难。

(2) 在RGB颜色系统中,三个颜色分量之间是高度相关的,即只要亮度改变,三个分量都会相应的改变,如果一个颜色的某一个分量发生了一定程度的改变,那么这颜色很可能也要发生改变。

(3) RGB颜色空间是一种均匀性较差的颜色空间,人眼对于三个颜色分量的敏感程度是不一样的,如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。

HSV颜色空间

HIS(Hue-Intensity-Saturation)颜色空间是图像处理中另外一个常用的颜色空间,它从人的视觉系统出发,用色调(Hue)、饱和度(Saturation或Chroma)和亮度(Intensity或Brightness)来描述颜色。HIS颜色空间可以用图3的圆锥空间模型来描述。其中,色调H由角度表示,其取值范围是 ,其中表示红色,表示黄色,表示绿色,表示蓝色,表示品红色。饱和度S是HIS彩色空间中轴线到彩色点的半径长度,彩色点离轴线的距离越近,表示颜色的白光越多。强度I用轴线方向上的高度表示,圆锥体的轴线描述了灰度级,强度最小值时为黑色,强度最大值时为白色。每个和轴线正交的切面上的点,其强度值都是相等的。

HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个 模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和 色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。前面这一大段我相信看起来也比较费劲,虽然已经尽力准确的去解释了,但我还是建议具体使用请着重数学公式,结合图示理解 ,效果更佳。
在这里插入图片描述
在这里插入图片描述

色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。

饱和度 (Saturation):又称色度,是指色彩的强度或纯度。饱和度代表灰色与色调的比例,并以 0% (灰色) 到 100% (完全饱和) 来衡量。

亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。

虽然这种描述HIS颜色空间的圆锥模型相当复杂,但却能把色调、亮度和饱和度的变化情形表现得很清楚。通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,经常采用HIS颜色空间,它比RGB颜色空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HIS颜色空间上使用,它们可以分开处理而且是相互独立的。因此,在HIS颜色空间可以大大简化图像分析和处理的工作量。

必须说明,HIS颜色空间和RGB颜色空间只是同一物理量的不同表示方法
在这里插入图片描述

图3 HIS/HSV彩色空间(一)
在这里插入图片描述

图4 HIS/HSV彩色空间(二)

在HIS颜色空间中进行彩色图像分割有两个优点:

(1) H和S分量与人感受彩色的方式相似,彩色图像中的每一个均匀性彩色区域都对应一个相一致的色度和饱和度,色度和饱和度能够被用来进行独立于亮度的彩色区域分割。

(2) I分量与颜色信息无关。

Lab 颜色空间

Lab颜色空间是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另 外,这种模式是以数字化方式来描述人的视觉感应, 与设备无关,所以它弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。 由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着,RGB、CMYK所能描述的色彩信息,在Lab颜色空间中都能得以影身寸。

Lab颜色空间取坐标Lab,其中L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色, 负端代表兰色(a,b)有L=116f(y)-16, a=500[f(x/0.982)-f(y)], b=200[f(y)-f(z/1.183 )];其中: f(x)=7.787x+0.138, x〈0.008856; f(x)=(x)1/3,x〉0.008856

CIE-lab/luv色彩空间

CIE(Commission International del’Eclairage)国际标准照明委员会于1931年建立了一系列表示可见光谱的颜色空间标准。它有三个基本量,用X、Y、Z表示,通过X、Y、Z能够表示任何一种颜色,X、Y、Z的值能够利用R、G、B线性表示出来,相对于RGB颜色空间,XYZ颜色空间几乎能包含人类能够感觉到的所有颜色,但XYZ颜色空间仍然是一种不均匀的颜色空间。因此在CIE-XYZ颜色空间的基础上又有了CIE-Lab,CIE-Luv等颜色空间。国际照明委员会制定了Lab颜色空间,人类所能感觉到的任何颜色都可以在Lab颜色空间中表示出来,其颜色空间比RGB颜色空间还大,可以直接使用欧几里德距离来衡量两种颜色的差异性。这种模式是以数字化的方式来描述人的视觉感觉,它与显示器的色移、输出设备以及其他设备无关。Lab系统是一个优秀的亮度和彩色分离器,它在图像压缩方面很有用。其中L代表亮度,a的正方向代表红色,负方向代表绿色,b的正方向代表黄色,负方向代表蓝色。Lab颜色空间由XYZ转换而得
在这里插入图片描述

图5 CIE-Lab彩色空间

YUV颜色空间

在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y、B-Y, 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。 采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。根据美国国家电视制式委员会,NTSC制式的标准,当白光的 亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行 相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。

YUV、YCbCr:该颜色空间主要是基于人眼对亮度比对色度敏感这一特性而来的,将颜色分量和亮度分量分离开来。早期的黑白电视机和彩色电视机的原理也是有此而来的,具体转换公式可以参照ITU标准公式。

RGB三颜色分量转换为YUV422之后,图像的数据量便减少了1/3,如果是YUV420,则数据量便减少了一半。常用这种转换后的数据进行图像压缩编码。

也有一些图像边缘增强的算法,在此颜色空间展开。主要是因为色彩信息和亮度信息分离开来了。

CMYK颜色空间

CMYK(cyan,magenta,yellow)颜色空间应用于印刷工业,印刷业通过青©、品(M)、黄(Y)三原色油墨的不同 网点面积率的叠印来表现丰富多彩的颜色和阶调,这便是三原色的CMY颜色空间。实际印刷中,一般采用青 ©、品(M)、黄(Y)、黑(BK)四色印刷,在印刷的中间调至暗调增加黑版。当红绿蓝三原色被混合时,会产生 白色,但是当混合蓝绿色、紫红色和黄色三原色时会产生黑色。既然实际用的墨水并不会产生纯正的颜色, 黑色是包括在分开的颜色,而这模型称之为CMYK。CMYK颜色空间是和设备或者是印刷过程相关的,则工艺方法、 油墨的特性、纸张的特性等,不同的条件有不同的印刷结果。所以CMYK颜色空间称为与设备有关的表色空间。 而且,CMYK具有多值性,也就是说对同一种具有相同绝对色度的颜色,在相同的印刷过程前提下,可以用分种 CMYK数字组合来表示和印刷出来。这种特性给颜色管理带来了很多麻烦,同样也给控制带来了很多的灵活性。 在印刷过程中,必然要经过一个分色的过程,所谓分色就是将计算机中使 用的RGB颜色转换成印刷使用的CMYK 颜色。在转换过程中存在着两个复杂的问题,其一是这两个颜色空间在表现颜色的范围上不完全一样,RGB的 色域较大而CMYK则较小,因此就要进行色域压缩;其二是这两个颜色都是和具体的设备相关的,颜色本身没有 绝对性。因此就需要通过一个与设备无关的颜色空间来进行转换,即可以通过以上介绍的XYZ或LAB色空间来 进行转换。

CMY颜色空间

CMY是一种颜料混合配色体系

RGB是一种光混合配色体系C - Cyan青 〈互补色〉 R - Red 红 M - Magenta 品红 〈互补色〉 G - Green 绿 Y - Yellow 黄 〈互补色〉 B - Blue 蓝

工业印刷中用前一种配色体系(因为是用颜料印刷),但是如果用CMY来配黑色的话很难,往往配出的是一种灰黑色,所以实际应用时还单独有黑色,即K - 黑色,故而工业中实用的印刷使用CMYK体系。

·C和R相反,M和G相反,Y和B相反

其他颜色模型:

HSL颜色空间HSL(hue,saturation,lightness)颜色空间,这个颜色空间都是用户台式机图形程序的颜色表示, 用六角形锥体表示自己的颜色模型。

HSB颜色空间HSB(hue,saturation,brightness)颜色空间,这个颜色空间都是用户台式机图形程序的颜色表示, 用六角形锥体表示自己的颜色模型。

Ycc颜色空间 柯达发明的颜色空间,由于PhotoCd在存储图像的时候要经过一种模式压缩,所以 PhotoCd采用了 Ycc颜色空间,Ycc空间将亮度作由它的主要组件,具有两个 单独的颜色通道,采用Ycc颜色空间 来保存图像,可以节约存储空间。

XYZ颜色空间国际照明委员会(CIE)在进行了大量正常人视觉测量和统计,1931年建立了"标准色度观察者", 从而奠定了现代CIE标准色度学的定量基础。由于"标准色度观察者"用来标定光谱色时出现负刺激值,计算不便,也不易理解,因此1931年CIE在RGB 系统基础上,改用三个假想的原色X、Y、 Z建立了一个新的色度系统。将它匹配等能光谱的三刺激值,定名为"CIE1931 标准色度观察者 光谱三刺激值",简称为"CIE1931标准色度观察者"。这一系统叫做"CIE1931标准色度系统"或称为" 2° 视场XYZ色度系统"。CIEXYZ颜色空间稍加变换就可得到Yxy色彩空间,其中Y取三刺激值中Y的值, 表示亮度,x、y反映颜色的色度特性。定义如下:在色彩管理中,选择与设备无关的颜色空间是 十分重要的,与设备无关的颜色空间由国际照明委员会(CIE)制定,包括CIEXYZ和CIELAB两个标准。 它们包含了人眼所能辨别的全部颜色。而且,CIEYxy测色制的建立给定量的确定颜色创造了条件。 但是,在这一空间中,两种不同颜色之间的距离值并不能正确地反映人们色彩感觉差别的大小, 也就是说在CIEYxy色厦图中,在 不同的位置不同方向上颜色的宽容量是不同的,这就是Yxy颜色空间 的不均匀性。这一缺陷的存在,使得在Yxy及XYZ空间不能直观地评价颜色。
红包+折扣,阿里云上云大礼包!
https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=5wzgtzow
【全民云计算】 云主机低至4折
https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=5wzgtzow
【阿里云新用户】 云通信专享8折
https://www.aliyun.com/acts/alicomcloud/new-discount?userCode=5wzgtzow
【商标注册服务】 低至680
https://tm.aliyun.com/?userCode=5wzgtzow

2019-03-08 09:10:27 weixin_42927264 阅读数 2069

图像处理技术(RGB分离)

在这里插入图片描述
最近学习了图像处理技术,第一个小工程做的事将一张图片的rgb分离,存为三张图片,就像PS中的RGB通道的三张图片一样。

我们先准备两张24位真彩色图片,一张宽度像素为4的倍数,一张则不是。

我们来看下它的文件头和信息头都储存了什么信息:

位图文件头BITMAPFILEHEADER
这是一个结构,其定义如下:

typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;

这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:
bfType
指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。
bfSize
指定文件大小,包括这14个字节。
bfReserved1,bfReserved2
为保留字,不用考虑
bfOffBits
为从文件头到实际的位图数据的偏移字节数

位图信息头BITMAPINFOHEADER
这也是一个结构,其定义如下:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;

这个结构的长度是固定的,为40个字节(LONG为32位整数),各个域的说明如下:
biSize
指定这个结构的长度,为40。
biWidth
指定图象的宽度,单位是像素。
biHeight
指定图象的高度,单位是像素。
biPlanes
必须是1,不用考虑。
biBitCount
指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)(新的.bmp格式支持32位色,这里就不做讨论了)。
biCompression
指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。
biSizeImage
指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)。
如果biCompression为BI_RGB,则该项可能为零
biXPelsPerMeter
指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念。
biYPelsPerMeter
指定目标设备的垂直分辨率,单位同上。
biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2biBitCount。
biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。

一开始我想将原图的每个像素点取出来,然后将RGB分量取出来分别赋值,这样处理对于宽度为4的倍数的图片是没有问题的。但是到了不是4倍数的图片就出问题了。

后来了解到图片的读取和储存都是按字节来进行,而且是必须要是4 的倍数,那我们的解决方案就明确了,把所有字节读出来后再赋值。

那么我们怎么样读出所有的字节来呢?

if (bmpWidth % 4 != 0) {
		bmpWidth = (bmpWidth * infoHeader.biBitCount / 8 + 3) / 4 * 4;
	}
	else {
		bmpWidth = bmpWidth * infoHeader.biBitCount / 8;
	}

利用这个公式转换宽度,再乘以高度就是所有字节的数量了。

下面附上代码:

#pragma once
#include<iostream>
#include<fstream>
#include<Windows.h>

using namespace std;



bool readBmp(char *bmpName) {
	FILE *fb = fopen(bmpName, "rb");
	FILE* pfoutr = fopen("r.bmp", "wb");
	FILE* pfoutg = fopen("g.bmp", "wb");
	FILE* pfoutb = fopen("b.bmp", "wb");
	if (fb == 0) {
		return 0;
	}
	BITMAPFILEHEADER fileHeader;
	BITMAPINFOHEADER infoHeader;
	int bmpWidth =0;//图像的宽
	int bmpHeight=0;//图像的高
	int bmpOffset = 0;

	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fb);
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, fb);

	bmpHeight = infoHeader.biHeight;
	bmpWidth = infoHeader.biWidth;
	bmpOffset = fileHeader.bfOffBits;
	
	if (bmpWidth % 4 != 0) {
		bmpWidth = (bmpWidth * infoHeader.biBitCount / 8 + 3) / 4 * 4;
	}
	else {
		bmpWidth = bmpWidth * infoHeader.biBitCount / 8;
	}
	
	if (infoHeader.biBitCount >= 1) {
		
		int size1 = bmpHeight * bmpWidth;
		BYTE *img = new BYTE[size1];
		BYTE *img1 = new BYTE[size1];
		BYTE *img2 = new BYTE[size1];
		BYTE *img3 = new BYTE[size1];
		
		fseek(fb, bmpOffset, 0);
		fread(img, sizeof(BYTE), size1, fb);

		for (int i = 0;i < bmpHeight ;i++) {
			for (int j = 0;j < bmpWidth;j++) {
					switch (j % 3) {
					case 0:
						img1[i*bmpWidth + j] = 0;
						img2[i*bmpWidth + j] = 0;
						img3[i*bmpWidth + j] = img[i*bmpWidth + j];
						break;
					case 1:
						img1[i*bmpWidth + j] = 0;
						img2[i*bmpWidth + j] = img[i*bmpWidth + j];
						img3[i*bmpWidth + j] = 0;
						break;
					case 2:
						img1[i*bmpWidth + j] = img[i*bmpWidth + j];
						img2[i*bmpWidth + j] = 0;
						img3[i*bmpWidth + j] = 0;
						break;
					}
				
				
			}
		}
		fwrite(&fileHeader, sizeof(fileHeader), 1, pfoutr);
		fwrite(&infoHeader, sizeof(infoHeader), 1, pfoutr);
		fwrite(img1, sizeof(BYTE), size1, pfoutr);
		fwrite(&fileHeader, sizeof(fileHeader), 1, pfoutg);
		fwrite(&infoHeader, sizeof(infoHeader), 1, pfoutg);
		fwrite(img2, sizeof(BYTE), size1, pfoutg);
		fwrite(&fileHeader, sizeof(fileHeader), 1, pfoutb);
		fwrite(&infoHeader, sizeof(infoHeader), 1, pfoutb);
		fwrite(img3, sizeof(BYTE), size1, pfoutb);
	}


	
	fclose(fb);
	fclose(pfoutr);
	fclose(pfoutg);
	fclose(pfoutb);
	return 1;
}

int main() {
	char bmpName[] = "sea.bmp";
	readBmp(bmpName);
	
}


这代码我就是测试用,写代码时要注意规范,提取函数哈!

原图:
在这里插入图片描述

R通道:在这里插入图片描述

G通道:
在这里插入图片描述