当前位置:文档之家› 第六章 彩色图像处理

第六章 彩色图像处理


H 360
3 S 1 min( R, G, B) ( R G B)
1 I ( R G B) 3
注意:实现中的范围调整问题
不等于实验中的转灰度后的图像
6.2.3 HSI彩色模型

从HSI到RGB的彩色转换
假设HSI值已归一化到[0, 1]范围内。首先将H乘 以360,恢复到[0°, 360°]范围内。根据H的范 围使用不同公式。
6.2.3 HSI彩色模型


RGB及CMY适合颜色的生成和显示,但不 适合人为指定颜色。 HSI模型与人眼对颜色的描述很相似,如 淡紫、深红等等。 H:Hue 色调 S:Saturation 饱和度 I:Intensity 强度/灰度
6.2.3 HSI彩色模型

RGB和HSI模型间的关系
6.2.3 HSI彩色模型
6.2 彩色模型


彩色模型(也称彩色空间或彩色系统)是为 了按照某种标准来指定颜色。 从本质上说,彩色模型是一个坐标系统, 在该系统下的一个子空间中,每种颜色都 对应其中一个点。
6.2 彩色模型
彩色模型的设计通常是为了便于硬件实现或 便于对颜色的控制。 RGB模型:在彩色显示器、彩色摄像机中 广泛使用 CMY / CMYK模型:用于彩色打印 HSI模型:与人描述和解释颜色的方式最 接近,便于人为指定颜色;同时该模型将 颜色和灰度信息分开,便于应用灰度图像 处理技术来处理彩色图像。

HSI模型中的 色调和饱和度
6.2.3 HSI彩色模型

基于(a)三角形和(b)圆 形彩色平面的HSI彩色 模型。三角形和圆形平 面垂直于灰度轴。
6.2.3 HSI彩色模型

从RGB到HSI的彩色转换
假设RGB值已归一化到[0, 1]范围内,则
如果B G 如果B G
1 ( R G ) ( R B) 1 2 cos 1/2 2 ( R G) ( R B)(G B)
数字图像处理
Digital Image Processing
第六章 彩色图像处理
电子科技大学中山学院计算机工程系 邹昆
Email:cszoukun@
第6章 彩色图像处理
在图像处理中,颜色的运用受两个主要因素 推动: 颜色是一个强有力的描绘子,它常常可简 化目标物的识别和提取。 人可以辨别几千种不同的颜色,但只能区 分出几十种灰度级,这使得颜色在人工图 像分析中显得特别重要。
6.2.3 HSI彩色模型
RGB图像和 对应的HSI 分量图像
(a) RGB图像 (b) 色调 (c) 饱和度 (d) 强度/灰度
6.2.3 HSI彩色模型
示例: 通过修改HSI分量 来改变图像外观
(a)-(c)修改后的HSI 分量图像 (d) 最终的RGB图像
补充内容
根据图像数据中是否包含调色板,可将图像 分为索引图像和非索引图像。 非索引图像:像素数据区存放的是颜色值。 真彩图像(24位以上)为非索引图,存放顺 序:B G R 索引图像:像素数据区存放的是颜色索引 值,其对应的颜色从调色板中获取。最常 见的索引图像为8位图像。
6.3 伪彩色图像处理


伪彩色(又称假彩色)图像处理是根据特定 的准则对灰度值赋以彩色的处理,即将灰 度图转换为彩色图。 其目的是为了方便人更清楚地分析灰度图 中的灰度层次。因为人眼对彩色的分辨能 力比对灰度的分辨能力更强。
6.1 彩色基础
注意:三原色并 不意味着所有颜 色均能由这三种 颜色按一定比例 混合得到
为何不一致? 眼内三种锥状体的光吸收情况 CIE(国际照明委员会)规定的三原色对应的光的波长为: 蓝:435.8nm 绿:546.1nm 红:700nm
6.1 彩色基础
三原色混色原理: 红+蓝=品红 绿+蓝=青 红+绿=黄 品红、青、黄称为合成色 它们是颜料的三原色
6.1 彩色基础

CIE色度图
如何看一种颜色的色 调和饱和度? 如何确定任何两种或 三种颜色之间的混色 ?
6.1 彩色基础

一般彩色显示器和 打印设备的色阶
6.1 彩色基础
习题6.2: 考虑任何两种有效的颜色c1和c2,其在图6.5 所示色度图中坐标为(x1, y1)和(x2, y2),推导出 计算构成给定颜色所需c1和c2百分比的通用表 达式,其中该颜色位于连接这两种彩色的直 线上。
6.1 彩色基础
6种颜色? No!
白光通过棱镜时看到的色谱
电磁波谱中的可见光部分
6.1 彩色基础


人眼所感知到的物体的颜色由物体反射光 的特性所决定。 人眼内的锥状体分为三类,分别对红、绿、 蓝光敏感。 对红光敏感的锥状体占65% 对绿光敏感的锥状体占33% 对蓝光敏感的锥状体占2%(敏感度最高)
RG扇区(0°≤H≤120°):
B I (1 S )
S cos H R I 1 cos(60 H )
G 3I ( R B)
其他两种情况见书P237
6.2.3 HSI彩色模型
图6.8对应的HSI分量。(a) 色调 (b) 饱和度 (c) 强度/灰度
//取与颜色c最接近的调色板索引值,适用于索引图像 BYTE GetNearestIndex(const CImage* pImgSrc,RGBQUAD c) { if ((!pImgSrc)||(pImgSrc->IsIndexed()==false)) return 0;
int ncolors = pImgSrc->GetMaxColorTableEntries();//取调色板颜色数目 RGBQUAD *prgbColors = new RGBQUAD[ncolors]; pImgSrc->GetColorTable(0,ncolors,prgbColors);//取调色板 long distance = 200000; int i,j = 0; long k; RGBQUAD color; for(i=0;i < ncolors;i++){ color = prgbColors[i]; k = (color.rgbBlue - c.rgbBlue)*(color.rgbBlue - c.rgbBlue)+ (color.rgbGreen - c.rgbGreen)*(color.rgbGreen - c.rgbGreen)+ (color.rgbRed - c.rgbRed)*(color.rgbRed - c.rgbRed); if (k == 0){ j = i; break; } if (k < distance){ distance = k; j = i; } } delete prgbColors; return (BYTE)j;
BYTE* p = (BYTE*)image->GetPixelAddress(x,y);//取像素值地址 RGBQUAD rgb; if( image->IsIndexed() ) {// 如果是索引图 int ncolors = image->GetMaxColorTableEntries();//取调色板颜色数 RGBQUAD *pColorTable = new RGBQUAD[ncolors]; image->GetColorTable(0, ncolors, pColorTable );//取调色板 rgb = pColorTable[*p];//得到像素值 delete [] pColorTable; } else{ // 非索引图,24位以上 rgb.rgbBlue = *p++; rgb.rgbGreen = *p++; rgb.rgbRed = *p++; if(image->GetBPP() > 24) rgb.rgbReserved = *p; }
用CImage快速存取像素值


使用GetPixel和SetPixel虽然方便,但效率 很低。 快速取像素方法:用GetPixelAddress函数 取像素地址(BYTE型指针)。判断是否为索 引图,不是索引图则用指针直接取RGB值, 每次取一个BYTE,即RGB当中一个分量。 是索引图则用指针取索引值,并获取调色 板,根据索引值从调色板中获取RGB值。
第6章 彩色图像处理
彩色图像处理分为两大类: 全彩色处理 图像为彩色图 伪彩色处理 图像为灰度图,为每个灰度前面章节中所介绍的图像处理方法,某些可 以直接应用于彩色图像处理,而其他的需要 做适当修改后才可应用于处理彩色图像。
本章内容可分为三大块: 颜色基础知识和颜色模型 伪彩色处理 全彩色处理
6.2.2 CMY和CMYK模型

CMY模型和RGB模型间的关系:
C 1 R M 1 G Y 1 B

等量的青色、品红和黄色应该产生黑色。 但实际产生的黑色不够纯正,另外加上价 格因素,引入黑色(打印的主色),构成 CMYK模型。

6.1 彩色基础
颜色的特性: 亮度:与灰度图像的灰度值类似 色调:任何一种颜色的光都是由若干波长不同的 光混合而成,其中比重最大的那种光的颜色即为 色调。 饱和度:由色调所对应光在混合光中的比重决定。 也可理解该纯色光被白光冲淡的多少,白光越多 饱和度越低。 色调和饱和度统称为色度。
//设置坐标为(x,y)的像素的颜色为c,适用于索引图像和非索引图像(非索 引图像取和c值最接近的值) void SetPixelColor(CImage* pImgSrc,long x,long y,RGBQUAD c) { if ((!pImgSrc)||(x < 0)||(y < 0)||(x >= pImgSrc->GetWidth())||(y >= pImgSrc->GetHeight())) return; if (pImgSrc->IsIndexed())//索引图像 SetPixelIndex(pImgSrc,x,y,GetNearestIndex(pImgSrc,c)); else {//非索引图像 BYTE* iDst = (BYTE*)pImgSrc->GetPixelAddress(x,y); *iDst++ = c.rgbBlue; *iDst++ = c.rgbGreen; *iDst++ = c.rgbRed; if(pImgSrc->GetBPP() > 24) *iDst = c.rgbReserved; } }
相关主题