数字图像处理-位图基础知识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章位图的基础知识
现代计算机和其他电子设备进行和完成的一系列工作为图像采集、获取、编码、存储、和传输,图像的合成和产生、图像的显示、绘制、和输出,图像变换、增强、恢复和重建,特征的提取和测量,目标的检测、表达和描述,序列图像的校正,图像数据库的建立、索引、查询和抽取,图像的分类、表示和识别,3D景物的重建复原,图像模型的建立,图像知识的利用和匹配,图像场景的解释和理解,以及基于它们的推理、判断、决策和行为规划。
图像增强图像增强是用以改善供人观看的图像的主观质量,而不一定追究图像降质的原因。
图像复原找出图像降质的原因,并尽可能消除它,使图像恢复本来面目。
常用的恢复有纠正几何失真、从已知图像信号和噪声信号的统计入手,用Wiener滤波等方法来改善信噪比。
图像变换图像处理的方法可以分为两大类空域法和频域法。
常用的图像变换有傅里叶变换、DCT变换、小波变换等。
图像编码根据香农的率失真真理,在传输和存储时,都可对数字图像进行一定方式编码,删除其中冗余信息,实现不失真压缩,或在容许失真限度内的进行有失真压缩,以换取更大的压缩率。
图像配准可以近似的看成匹配的过程,简单地说就是根据图像的某系区域或者特征,在另一幅图中找到对应的区域或者特征。
图像配准在图像识别、图像拼接、三维图像的重建等方面有着重要的应用。
图像分析和特征提取图像分析的内容分为特征提取、符号描述、目标检测、今晚匹配和识别等几个部分。
图像特征和指图像场中可用作标志的属性,其中有些是视觉直接感受到自然特征,如区域的亮度、彩色、纹理、或轮廓等有些事需要通过变换或测量才可得到的人为特征,如各种变换频谱、直方图、矩等。
图像特征提取就是从图像中提取出某些可能涉及到高层语义信息的图像特征。
目标和运动检测自动目标检测和交互目标检测。
图像分割人能方便地佛纳甘一副图像中找出感性趣的物体和区域,而要让计算机做到这一点需要他客观的测度,使之能按照灰度、颜色或几何特征性质等把一些物体或区域加以分离。
形状描述对于已经分离出来的区域或物体边界,用适当的数学语言来表示其统计或者区域之间的关系,得出一种简练的表达方式。
图像识别识别的景物是相对简单的原始是视觉机制理论不够完善,完善的视觉模型尚未建立。
模板匹配、统计识别等是一些常用的识别方法。
一副图像所包含的信息首先表现为光的强度I,它是随空间坐标(x,y),光线的波长u和时间t而变化的,图像函数可以表示为I = f (x,y,u,t) ;
若之考虑光的能量而不考虑光的波长,在视觉效果上只有黑白深浅之分,而无彩色变化,这时称为黑白图像(灰度图像)图像模型可表示为
I = f (x,y, t) =∫(0 –无穷) f(x, y, u,t)V(u)du
当考虑到波长光的彩色效应,则为彩色图像。
根据三基色原理,任何一种彩色可以分解为红、绿、蓝三种基色彩色图像可表示为
I = { R(x,y,t), G(x,y,t),B(x,y,t)}
其中 R(x,y,t) = ∫(0 –无穷) f(x,y,u,t)R(u)du
G(x,y,t) = ∫(0 –无穷) f(x,y,u,t)G(u)du
B(x,y,t) = ∫(0 –无穷) f(x,y,u,t)B(u)du
当图像内容随时间变化时,称为时变图像或运动图像。
当图像内容不随时间变化时,称为静止图像。
对于灰度图像而言,其函数为 I = f (x,y)
图像函数在某一点的值常称为强度或灰度,它与图像在该店的亮度相对应,并用正实数表示,而且这个数值的大小是有限的 0 <= f (x,y) < =B B表示最大亮度
连续的图像函数必须转换为离散的数据集才能被计算机处理,这一过程叫做数字图像采集。
数字图像采集由图像采集系统完成,经过成像、采样和量化得到数字图像。
采样是对空间坐标的量化过程,量化则是对图像函数值的离散化过程。
采样与量化统称为数字化。
数字化的图像一般都用二维矩阵表示。
颜色
3个基本颜色–红绿蓝所有颜色都是这三种基本颜色的不同组合。
区分颜色常用三种基本特征量亮度、色调、饱和度(色调和饱和度合成色度)
颜色可用亮度和色度共同表示当把红绿蓝三色混合时,通过改变三者各自的强度比例可得到白色以及其他各种色调和饱和度的彩色。
C = rR + gG + bB (R、G、B表示三种原色 r,g,b代表比例系数且有 r + g + b = 1) 建立颜色模型就是建立一个3-D坐标模型,其中每个空间点都代表某一种颜色
1 RGB模型(基于笛卡尔坐标系)
2 HIS模型(双棱锥上方定点为白下方顶点为黑任意界面上任意点的亮度与色度)
3 颜色模型转换对任何3个在[0,1]范围内的RGB值可转换为对应HIS模型I,S,H 分量对HIS模型中的HIS分量可转换为RGB模型中RGB分量
(注意彩色图片分别用两种模型中的单一分量显示的效果)
调色板的基本概念
计算机能够显示的颜色数量有限,必须使用一定的技术来管理和取舍颜色。
在windows中RGB宏将不同的RGB颜色值转换为24位的颜色值
COLORREF RGB (BYTE bred, BYTE bGreen, BYTE bBlue) ;其16进制数据表示形式为0x00bbggrr ;
调色板技术调色板就是在16色或者256色显示系统中,将图像出现最频繁的16或者156中颜色所组成的颜色表,对这些颜色按4位或者8位,即0到15或者255进行编号。
每一编号代表其中的一种颜色。
这种编号叫做颜色的索引号,4位或者8位的索引号与24位的颜色值的对应表叫做颜色查找表。
使用调色板的图像叫做调色板图像,它们的像素值并不是颜色值,而是颜色在调色板查找表中的索引号。
Windows保留了一个20种颜色的内部系统调色板,该调色板在所有显示位置中保持不变,在16色的显示系统中,系统调色板通过16中的抖动来产生其余4种颜色。
在256色的显示系统中,windows也保持20种颜色的次序。
其余236中颜色由当前的调色板分配。
真彩色不需要调色板其中的像素值就是24位的颜色值 16色系统通常采用Windows的内部系统调色板,一般并不直接操作调色板。
仅在256色显示系统中操作调色板。
调色板操作
当前活动的窗口或应用程序对当前调色板具有较高的控制优先级。
窗口中显示的每一个图像的调色板都保存在内存中,称为逻辑调色板,显示系统当前使用的调色板称为硬件调色板或者系统调色板。
(仅有一个系统调色板,由它决定了当前屏幕上实际的颜色显示)
最常用的调色板函数是调色板函数 BOOL CreatePalette (LPLOGPALETTE lpLogPalette) ; LOGPALETTE (调色板的版本号 + 调色板中的表现数 + 调色板表项数组) PALETTEENTRY (BYTE peRed, BYTE peGreen, BYTE peBlue, BYTE peFlags) ; peFlags 表示颜色被使用的方式 NULL PC_EXPLICT PC_NOCOLLAPSE PC_RESERVED
如果窗口或应用程序想按自己的调色板显示颜色就必须按自己的调色板载入系统调色板中,这叫做实现调色板。
实现调色板包括两个部分,将调色板选择到设备上下文中,并在设备上下文中是实现它
CPalette * SelectPalette (CPalette * pPalette, BOOL bForceBackground) ;
UINT RealizePalette () ;
Windows系统用调色板管理器来管理与调色板有关的操作。
定义了3个调色板消息用于通知窗口系统调色板的变化状态,窗口接受到这些消息时,可以进行适当的调色板操作来维护自身的显示
WM_QUERYNEWPALETTE
WM_PALETTECHANGED
WM_PALETTECHANGING
每一窗口接收到WM_PALETTECHANGED消息时都应该实现其逻辑调色板,并重画客户区。
Windows中的位图操作与调色板密切相关,windows使用两种不同的位图,即设备相关位图DDB 和设备无关位图DIB DIB位图文件中包含该位图的逻辑调色板的颜色表,其像素值是该调色板中的颜色索引表。
DDB位图中不包含调色板信息,其像素值是该系统调色板中的颜色索引值。
HPALETTE 与 CPalette对象的相互转换可由函数
CPalette::FromHandle 和 CPalette::GetSafeHandle 实现
自定义调色板操作函数
CopyPalette 拷贝调色板
GetSystemPalette 获取当前的系统调色板
CopyPalette实现调色板的拷贝
1先利用GetPaletteEntries判断源调色板是否为空但并不将源调色板的表项拷贝2得到源调色板表项数后,分配内存
3再次调用GetPaletteEntries将源调色板的表项拷贝到目标调色板GetSystemPalette 将当前正在使用的系统调色板进行拷贝,将返回调色板句柄
与设备相关位图 DDB
DDB中不包括颜色信息,因此在显示的时是以系统调色板为基础进行各位的颜色映射
MFC对DDB的BITMAP结构和对DDB位图操作进行了封装
BITMAP结构定义了DDB位图的类型、宽度、高度、颜色格式和像素位置
LoadBitmap (LPSTR strName) ;
BOOL CreateCompatibleBitmap (CDC * pDC, int nWidth, int nHeight) ;
函数初始化一个与pDC指定的设备上下文兼容的位图,位图与指定的设备上下文具有的颜色位面或相同的每个像素的位数。
BOOL CreateBitmap (int nWidth, int hHeight, UINT nPlanes, UINT nBitcount, const void * lpBits) ;
函数用于指定宽度、高度和位模式初始化依赖于设备的内存位图,对彩色位图来说 nPlanes 和nBitcount有一个要被设置为1 。
都设置为1时将建立一个黑白位图
int GetBitmap (BITMAP * pBitmap)
DWORD SetBitmapBits (DWORD dwCount, const void * lpBits) ;
HBITMAP 和CBitmap 对象相互转换可由函数
CBitmap::FromHandle () 和 CBitmap :: GetSafeHandle()是实现
CDC类提供了位图操作函数用于DDB位图操作
BOOL BitBlt (int x, int y, int nWidth, int nHeight, CDC * pSrcDC, int xSrc, int ySrc, DWORD dwRop) ;
光栅操作代码定义如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。
BLACKNESS 所有输出变黑
DSTINVERT 反转目标位图
MERGECOPY 使用AND操作符合并特征与源位图
MERGEPAINT 使用OR操作符合并特征与源位图
NOTSRCCOPY 拷贝反转源位图到目标
NOTSRCCERASE 反转使用布尔OR操作符合并源和目标位图的结果
PATCOPY 拷贝特征到目标位图
PATINVERT XOR操作合并目标位图和特征
PATPAINT OR操作合并并反转源位图和特征用OR操作符合并这项操作结果与目标位图
SRCAND 使用AND操作符合并目标像素和原位图
SRCCOPY 拷贝原位图到目标位图
SRCERASE 反转位图使用AND操作符合并
SRCINVERT 使用布尔XOR操作符合并目标像素和源位图
SRCPAINT 使用OR操作符合并目标像素和源位图
WHITENESS 所有输出变白
BOOL PatBlt (int x, int y, int nWidth, int nHeight, DWORD dwRop) ;
BOOL StretchBlt (int x, int y, int nWidth, int nHeight, CDC * pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) ;
将源矩形中的位图拷贝到目标矩形中,如果有必要,可以扩展或压缩该位图使其与目标矩形尺寸吻合。
压缩和扩展模式有SetStretchBltMode设置
显示DDB位图的基本过程
1 生成CBitmap类的对象使用CBitmap ::LoadBitmap 函数将位图加载入内存
2 生成CDC对象,用CDC::CreateCompatibleDC函数创建与显示设备上下文兼容的内存设备上下文CDC对象,
3 用CDC::SelectObject函数将位图对象选人创建的内存设备上下文中,并保存内存设备上下文中原有的位图指针
4 用CDC::BitBlt函数显示位图
5 如需要放大或者压缩位图可以采用CDC::StretchBlt函数
6 用CDC::SelectObject函数恢复内存设备上下文中的原有位图
与设备无关的位图
DIB位图
BITMAPFILEHEADER 位图文件头长度固定 14个字节
BITMAPINFOHEADER位图信息头结构长度固定 40个字节
PALETTE调色板
位图像素数据
BITMAPFILEHEADER {WORD bfType, DWORD bfSize, WORD bfReserved1 , WORD bfReserved2, DWORD bfOffBits} ;
BfType 指定文件类型 0x424D BM
bfSize 知道文件大小包含该结构的14个字节
bfOffBits 从文件头到实际数据的偏移字节三个部分的长度和
BITMAPINFOHEADER {DWORD biSize, LONG biWidth, LONG biHeight, WORD biplanes, WORD biBitsCount, DWORD biCompression, DWORD biSizeImage, LONG biXPelsPerMeter, LONG biYPelsPerMeter, DWORD biClrUsed, DWORD biClrImportant} ;
biSize 指定这个结构的长度
biWidth 指定图像的宽带
biHeight 指定图像的高度
biplanes 必须为1
biBitCount 指定表示颜色时要用到的位数 1 (黑白) 4 (16位图) 8 (256色图) 24 biCompression 是否压缩有效值为 BI_RGB BI_RLE8 BI_RLE4 BI_BITFIELDS biSizeImage 位图数据占用的字节数
biXPelsPerMeter 水平分辨率每米的像素个数
biYPelsPerMeter 垂直分辨率每米的像素个数
biClrUsed 实际用到得颜色数为0 用到的颜色为2的biBitcount次方biClrImportant 指定图像中重要的颜色为0 表示所有颜色都重要
调色板是针对需要调色板的文件而言(真彩图是不需要调色板的)
调色板实际是一个数组共有biClrUsed个元素每个元素的类型是一个RGBQUAD结构占4个字节
RGBQUAD {BYTE rgbBlue, BYTE rgbGreen, BYTE rgbRed, BYTE rgbReserved} ;
第四部分就是实际的图像数据对于用到调色板得位图图像数据就是该像素值在调色板中的索引值对于真彩色图图像数据就是实际的RGB值
对于2色位图用1位就可以表示该像素的颜色所有一个字节可以表示8个像素
对于16色位图用4位就可以表示一个像素的颜色一个字节可以表示2个像素
对于256色位图一个字节刚好可以表示一个像素
对于真彩色图三个字节才可以表示一个像素
DIB位图操作函数(这些函数并未封装到MFC中)
int SetDIBitsToDevice (HDC hdc, int xDest, int yDest, DWORD dwWidth, DWORD dwHeight, int xSrc, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID * lpvBits, CONST BITMAPINFO * pBitmapinfo, UINT fuColorUse) (调用成功返回的是绘制的行数)fuColorUse指定BITMAPINFO结构中的bmiColors包含的是RGB值还是调色板中的索引值
取值为DIB_PAL_COLORS(索引值) DIB_RGB_COLORS(真正的RGB数值)
int StretchDIBits (HDC hdc, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO * lpBitsInfo, UINT iUsage, DWORD dwRop);
图像的感知与获取
图像处理的一个先决条件就是将图像转化为数字形式图像数字化就是将连续图像离散化(取样和量化)。