
TIFF是一种比较灵活的图像格式,它的全称是Tagged Image File Format,文件扩展名为TIF或TIFF。该格式支持256色、24位真彩色、32位色、48位色等多种色彩位,同时支持RGB、CMYK以及YCbCr等多种色彩模式,支持多平台。TIFF文件可以是不压缩的,文件体积较大,也可以是压缩的,支持RAW、RLE、LZW、JPEG、 CCITT3组和4组等多种压缩方式。GIF GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。目前几乎所有相关软件都支持它,公共领域有大量的软件在使用GIF图像文件。GIF图像文件的数据是经过压缩的,而且是采用了可变长度等压缩算法。所以GIF的图像深度从lbit到8bit,也即GIF最多支持256种色彩的图像。GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。 GIF分为静态GIF和动画GIF两种,支持透明背景图像,适用于多种 *** 作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,所以归根到底GIF仍然是文件格式。 jpgjpg全名应该是JPEG JPEG 以 24 位颜色存储单个光栅图像。JPEG 是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。渐近式 JPEG 文件支持交错。 可以提高或降低 JPEG 文件压缩的级别。但是,文件大小是以图像质量为代价的。压缩比率可以高达 100:1。(JPEG 格式可在 10:1 到 20:1 的比率下轻松地压缩文件,而质量不会下降。)JPEG 压缩可以很好地处理写实摄影作品。但是,对于颜色较少、对比级别强烈、实心边框或纯色区域大的较简单的作品,JPEG 压缩无法提供理想的结果。有时,压缩比率会低到 5:1,严重损失了完整性。这一损失产生的原因是,JPEG 压缩方案可以很好地压缩类似的色调,但是 JPEG 压缩方案不能很好地处理亮度的强烈差异或处理纯色区域。 优点:摄影作品或写实作品支持高级压缩。 利用可变的压缩比可以控制文件大小。 支持交错(对于渐近式 JPEG 文件)。 广泛支持 Internet 标准。 缺点: 有损耗压缩会使原始数据质量下降。 当您编辑和重新保存 JPEG 文件时,JPEG 会混合原始数据的质量下降。这种下降是累积性的。 JPEG 不适用于所含颜色很少、具有大块颜色相近的区域或亮度差异十分明显的较简单的。jpg格式是一种格式,使一种比较常见的图画格式,如果你的是其他格式的话,你可以通过以下方法转化: 1、photoshop ,打开图画以后,按另存为,下面格式那里选择JPG格式就是了,这个方法比较简单,而且适合画质比较好的,要求比较高的转换。 2、如果你要求不高,你直接通过windows附带的图画程序,选择JPG格式就行了,这个来转换的话,画质嘛,马马虎虎,不过在网上嘛,过得去了! 如果JPG格式转其他格式,这样的方法同样适用。JPEG (Joint Photographic Experts GROUP)是由国际标准组织(ISO:International Standardization Organization)和国际电话电报咨询委员会(CCITT:Consultation Commitee of the International Telephone and Telegraph)为静态图象所建立的第一个国际数字图象压缩标准,也是至今一直在使用的、应用最广的图像压缩标准。JPEG由于可以提供有损压缩,因此压缩比可以达到其他传统压缩算法无法比拟的程度。JPEG的压缩模式有以下几种:顺序式编码(Sequential Encoding)一次将图象由左到右、由上到下顺序处理。递增式编码(Progressive Encoding)当图象传输的时间较长时,可将图象分数次处理,以从模糊到清晰的方式来传送图象(效果类似GIF在网络上的传输)。无失真编码(Lossless Encoding)阶梯式编码(Hierarchical Encoding)图象以数种分辨率来压缩,其目的是为了让具有高分辨率的图象也可以在较低分辨率的设备上显示。由于JPEG的无损压缩方式并不比其他的压缩方法更优秀,因此我们着重来看它的有损压缩。以一幅24位彩色图象为例,JPEG的压缩步骤分为:1颜色转换2DCT变换3量化4编码1颜色转换由于JPEG只支持YUV颜色模式的数据结构,而不支持RGB图象数据结构,所以在将彩色图象进行压缩之前,必须先对颜色模式进行数据转换。各个值的转换可以通过下面的转换公式计算得出:Y=0299R+0587G+0114BU=-0169R-03313G+05BV=05R-04187G-00813B其中,Y表示亮度,U和V表示颜色。转换完成之后还需要进行数据采样。一般采用的采样比例是2:1:1或4:2:2。由于在执行了此项工作之后,每两行数据只保留一行,因此,采样后图象数据量将压缩为原来的一半。2DCT变换DCT(Discrete Consine Transform)是将图象信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图象的高频部分(即图象细节)进行压缩,以达到压缩图象数据的目的。首先将图象划分为多个88的矩阵。然后对每一个矩阵作DCT变换(变换公式此略)。变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。3量化由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图象数据之间有了差异,这一差异是造成图象压缩后失真的主要原因。在这一过程中,质量因子的选取至为重要。值选得过大,可以大幅度提高压缩比,但是图象质量就比较差;反之,质量因子越小(最小为1),图象重建质量越好,但是压缩比越低。对此,ISO已经制定了一组供JPEG代码实现者使用的标准量化值。4编码从前面过程我们可以看到,颜色转换完成到编码之前,图象并没有得到进一步的压缩,DCT变换和量化可以说是为编码阶段做准备。编码采用两种机制:一是0值的行程长度编码;二是熵编码(Entropy Coding)。在JPEG中,采用曲徊序列,即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。行程长度编码是非常简单和常用的编码方式,在此不再赘述。编码实际上是一种基于统计特性的编码方法。在JPEG中允许采用HUFFMAN编码或者算术编码。
我自己研究的,用了两个月
处理图像只能对一个一个的像素颜色进行运算
颜色转换函数:
你只需提供转换之前的颜色,这个函数就能返回处理过的颜色
(只有 VB 的,适当修改下面的“08”、“06”可以得到其它颜色效果)
Function BrownColor(Color As Long) As Long
Dim SVal As Long
SVal = ((Color And &HFF) + (Color \ &H100 And &HFF) + (Color \ &H10000 And &HFF)) \ 3
BrownColor = RGB(SVal, SVal 08, SVal 06)
End Function
如果只是想把图像变黑白,只要把 08、06 删掉就可以了
人眼对于 RGB 三种颜色的亮度感觉不同(RGB 三色亮度比例: 3:6:1),有需要的话你可以自己添加代码
当h为m3的矩阵时,hsv2rgb是把hsv调色板转换成rgb调色板。
当h为mn3的矩阵时,hsv2rgb是把hsv图像转换成rgb图像。
什么是调色板呢?调色板是一个存贮各种颜色值的列表。
这样索引图像只需存贮列表中的索引就可以了,具体的颜色值只需要到颜色列表中去查找。
但是表示颜色的方法有很多种。
最常见的RGB,第一个分量表示红色,第二个绿色,第三个蓝色。
RGB虽然方便计算机处理,但对人并不直观
HSV则对人很直观,H表示颜色,S表示饱和度(可以理解为纯度),V为亮度。例如“有点浓的暗红色”对应成HSV即“H为红色,S比较高(纯),V比较低(暗)”。
H,S,V三个变量的取值均在0和1之间。
程序解释如下:
V=V-min(V(:));
V=V/max(V(:));
V=25+075V;
是将V的值映射到[025,1]之间
M=M-min(M(:));
M=M/max(M(:));
是将M映射到[0,1]之间
在前面,我们只介绍了三种图像的类型,分别位二值图像、灰度图像以及RGB图像。但我们现在常用的图像肯定是RGB图像,不过它只是色彩空间的一种类型,在实际的图像中,还有许多其他的色彩空间,对于会PS的读者来说肯定不会陌生。
比如GRAY色彩空间(灰度图像),XYZ色彩空间,YCrCb色彩空间,HSV色彩空间,HLS色彩空间,CIEL a b 色彩空间,CIEL u v 色彩空间,Bayer色彩空间等。
每个图像都有其擅长处理的内容,因此我们要掌握这些色彩空间图像的转换,以便后续更方便的处理图像的问题。
GRAY就是我们前面介绍的灰度图像,通常指8位灰度图像,其具有256个灰度级,像素值范围位[0,255]。
RGB转换位GRAY的数学公式如下:
Gray=0229 R+0587 G+0114B
而图像有GRAY色彩空间转换为RGB色彩空间时,最终所有通道的值都是相同的,其处理方式如下:
R=Gray
G=Gray
B=Gray
XYZ色彩空间是由CIE(International Commission on Illumination)定义的,是一种更便于计算的色彩空间,它不像RGB转换位GRAY,只能单向转换,XYZ色彩空间与RGB转换不会丢失任何值。
将RGB色彩空间转换为XYZ色彩空间,其转换公式为:
将XYZ色彩空间转换为RGB色彩空间,其转换公式为:
人眼视觉系统对颜色的敏感度要低于对亮度的敏感度。在传统的RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度的信息。所以,才有了YCrCb色彩空间。
在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。
从RGB色彩空间转换YCrCb色彩空间的数学公式如下:
Y=0229 R+0587 G+0114B
Cr=(R-Y)0713+delta
Cb=(B-Y)0564+delta
其中delta的值为:
从YCrCb色彩空间转RGB数学公式如下:
R=Y+1403(Cr-delta)
G=Y-0714 (Cr-delta)-0344 (Cb-delta)
B=Y+1773(Cb-delta)
RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异。而HSV色彩空间是一种面向视觉感知的颜色模型。HSV色彩空间是从心理学和视觉的角度出发,指出人眼色彩知觉主要包含3个要素:色调,饱和度,亮度。
说到这里,相信用过PS的都应该清楚HSV到底能干什么了吧?不过,我们还是介绍一些这3个要素,毕竟本篇博文就是专门将色彩空间理论知识的,不能有空缺。
色调(H):指光的颜色,色调与混合光谱中的主要光波长相关,例如“赤橙黄绿青蓝紫”分别表示不同的色调。如果从波长的角度考虑,不同的波长的光表现为不同的颜色,实际上它们体现的是色调的差异。
饱和度(S):指色彩的深浅层度,相对于纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。
亮度(V):反映的是人眼感受到的光的明暗程度,该指标与物体的反射度有关。对于色彩来讲,如果在其中掺入的白色越多,则其亮度越高;如果在其掺入的黑色越多,则亮度越低。
在具体的实现上,我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,通过调整色调值,我们就能选取不同的颜色,色调的取值范围为[0,360]。色调取值不同,颜色也不同,具体如下表所示:
饱和度的值为[0,1],饱和度的值为0时,只有灰度,饱和度越大,颜色值越丰富。至于亮度,其取值范围也是[0,1]。
例如,博主现在取色调=0,饱和度=1,亮度=1,就可以提取色彩深红色。
介绍完理论知识,HSV与上面的色彩空间一样,也需要与RGB进行转换,不过,我们这里转换之前,需要先将RGB色彩空间的值转换到[0,1]之间,然后在进行处理。具体处理如下:
V=max(R,G,B) 亮度
这里,H的计算结果可能小于0,如果出现这种情况,则需要对H进一步的处理计算。如下所示:
上述公式计算的结果肯定与前面说的色调,亮度,饱和度的范围一致。至于HSV转RGB,感兴趣的可以参考开发文档。
HLS与HSV色彩空间类似,都具有3要素。只是HLS色彩空间就L与V不同,其中HLS色彩空间的L(光亮度/明度)替换了亮度。
那么什么是光亮度/明度呢?
其实,光亮度/明度是用来控制色彩的明暗变换,它的取值范围同样也是[0,1]。我们在程序中,可以通过光亮度/明度的大小来衡量有多少光线从物体表面反射出来。光亮度/明度对于眼睛感知颜色很重要,因为当一个具有色彩的物体处于光线太强或者太暗的地方时,眼睛是无法准确获取物体颜色的。
说实话,编辑公式有点费劲,感兴趣的自己查询开发文档,后续在python中开发,我们都是使用cv2cvtColor()进行转换的。使用起来,你只需要了解其到底做什么的,并不需要知道其内部如何实现,但内部实现,就是上面的这些数学公式。
CIEL a b色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中如果人所观察的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。
CIEL a b 色彩空间中的L分量用于表示像素的亮度,取值范围为[0,100],表示从纯黑到纯白;a 分量表示从红色到绿色的范围,取值范围为[-127,127];b分量表示从**到蓝色的范围,取值范围为[-127127]。
由于CIEL a b 是在CIE的XYZ色彩空间上发展起来的,所以转换的时候,需要先将RGB转换为XYZ色彩空间,然后在转换为CIEL a b 。具体的数学公式感兴趣的查询开发文档。
CIEL u v 色彩空间同CIEL a b 色彩空间一样,是均匀的颜色模型。CIEL u v色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。
同样的,CIEL u v 色彩空间也需要先将RGB转换为XYZ色彩空间,然后在转换为CIEL u v ,具体公式感兴趣的可以查询开发文档。
Bayer色彩空间被广泛的应用在CCD和CMOS相机中。
色彩空间的理论知识,到这里基本就讲解完成了,感兴趣的可以自己扩展最后几个数学公式。
看到好文章,想保存怎么办!下载APP
颜色空间转换(一)

最初九月雪
2014-12-10分享收藏
颜色空间转换
不同彩色空间之间的转换。
1,CMY/CMYK颜色空间
青、品红、黄(CMY)(Cyan、Magenta、Yellow)彩色模型是彩色图象印刷行业使用的彩色空间,在彩色立方体中它们是红、绿、蓝的补色,称为减色基,而红、绿、蓝称为加色基。在CMY模型中,颜色是从白光中减去一定成分得到的。CMY坐标可以从RGB模型中得到:
C = 1 – R
M = 1 – G
Y = 1 – B
由于在印刷时CMY模型不可能产生真正的黑色,因此在印刷业中实际上使用的是CMYK彩色模型,K为第四种颜色,表示黑色(black ink):从CMY 到CMYK的转换:
K := min(C,M,Y)
C := C – K
M := M – K
Y := Y - K
[cpp] view plaincopy
//RGB转换为CMY
void rtRGB2CMY(RtScalar rgb, RtScalar& cmy)
{
cmyval[0] = 255 - rgbval[0];
cmyval[1] = 255 - rgbval[1];
cmyval[2] = 255 - rgbval[2];
}
//CMY转换为RGB
void rtCMY2RGB(RtScalar cmy, RtScalar& rgb)
{
rgbval[0] = 255 - cmyval[0];
rgbval[1] = 255 - cmyval[1];
rgbval[2] = 255 - cmyval[2];
}
//CMY转换为CMYK
void rtCMY2CMYK(RtScalar cmy, RtScalar& cmyk)
{
unsigned char temp = 0;
temp = min(min(cmyval[0], cmyval[1]), cmyval[2]);
if (temp == 255 )
{
cmyk = rtScalar(0, 0, 0, 0);
}
else
{
cmykval[0] = cmyval[0] - temp;
cmykval[1] = cmyval[1] - temp;
cmykval[2] = cmyval[2] - temp;
}
cmykval[3] = temp;
}
//CMYK转换为CMY
void rtCMYK2CMY(RtScalar cmyk, RtScalar& cmy)
{
cmyval[0] = cmykval[0] + cmykval[3];
cmyval[1] = cmykval[1] + cmykval[3];
cmyval[2] = cmykval[2] + cmykval[3];
}
2,HSI颜色空间
HSI色彩空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中 方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析 和处理的工作量。HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着 转换关系。
HSI 色彩模型是从人的视觉系统出发,用 H 代表色相 (Hue)、S 代表饱和度 (Saturation) 和 I 代表亮度 (Intensity) 来描述色彩。饱和度与颜色的白光光量刚好成反比,它可以说是一个颜色鲜明与否的指标。因此如果我们在显示器上使用 HIS 模型来处理图像,将能得到较为逼真的效果。
色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。
饱和度 (Saturation):又称色度,是指色彩的强度或纯度。饱和度代表灰色与色调的比例,并以 0% (灰色) 到 100% (完全饱和) 来衡量。
亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。


[cpp] view plaincopy
//RGB转换为HSI
void rtRGB2HSI(RtScalar rgb, RtScalar& hsi)
{
double maxv = 0, minv = 0, angle = 0;
RtScalar temp;
tempval[0] = rgbval[0] / 2550;
tempval[1] = rgbval[1] / 2550;
tempval[2] = rgbval[2] / 2550;
maxv = max(max(tempval[0], tempval[1]), tempval[2]);
minv = min(min(tempval[0], tempval[1]), tempval[2]);
hsival[2] = (tempval[0] + tempval[1] + tempval[2]) / 30;
hsival[1] = 10 - minv/hsival[2];
angle = (tempval[0] + tempval[0] - tempval[1] - tempval[2]) / 20 sqrt((tempval[0] - tempval[1])(tempval[0] - tempval[1]) + (tempval[0] - tempval[2])(tempval[1] - tempval[2]));
if (tempval[2] <= tempval[1])
hsival[0] = angle / PI 1800;
else
hsival[0] = (2 PI - angle)/PI 1800;
}
//HSI转换为RGB
void rtHSI2RGB(RtScalar hsi, RtScalar& rgb)
{
int flag = 0;
double t1 = 0, t2 = 0, tv1 = 0, tv2 = 0, tv3 = 0;
RtScalar temp;
temp = hsi;
tempval[0] = hsival[0] PI / 1800;
t1 = 20 PI / 30;
t2 = 20 t1;
if (tempval[0] >= t1 && tempval[0] < t2)
{
flag = 1;
tempval[0] -= t1;
}
if (tempval[0] >= t2)
{
flag = 2;
tempval[0] -= t2;
}
tv1 = (tempval[2] (1 - tempval[1])) 2550;
tv2 = (tempval[2] (1 + tempval[1] cos(tempval[0]) / cos(PI / 3 - tempval[0]))) 2550;
tv3 = (30 tempval[2] - tv1 - tv2) 2550;
switch (flag)
{
case 0:
rgb = rtScalar(tv2, tv3, tv1, 0);
break;
case 1:
rgb = rtScalar(tv1, tv2, tv3, 0);
break;
case 2:
rgb = rtScalar(tv3, tv1, tv2, 0);
break;
}
}
3,YUV颜色空间
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y、B-Y, 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。 采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。根据美国国家电视制式委员会,NTSC制式的标准,当白光的 亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=03R+059G+011B 这就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行 相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。
YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):
Y = 0299R + 0587G + 0114B
U = -0147R - 0289G + 0436B
V = 0615R - 0515G - 0100B
R = Y + 114V
G = Y - 039U - 058V
B = Y + 203U
[cpp] view plaincopy
// RGB转换为YUV
void rtRGB2YUV(RtScalar rgb, RtScalar& yuv)
{
yuvval[0] = 0299rgbval[0] + 0587rgbval[1] + 0114rgbval[2]; // y
yuvval[1] = -0147rgbval[0] - 0289rgbval[1]+ 0436rgbval[2]; // u
yuvval[2] = 0615rgbval[0] - 0515rgbval[1] - 01rgbval[2]; // v
}
// YUV转换为RGB
void rtYUV2RGB(RtScalar yuv, RtScalar& rgb)
{
rgbval[0] = yuvval[0] + 114yuvval[2]; // r
rgbval[1] = yuvval[0] - 039yuvval[1] - 058yuvval[2];
rgbval[2] = yuvval[0] + 203yuvval[1];
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)