370 likes | 643 Views
第二章 数字图像处理基础. 讲解内容 图像数字化概念、图像文件 BMP 格式 重点 : 图像数字化和图像文件 BMP 格式 难点 : 图像文件 BMP 格式. 2.1 图像数字化 图像数字化 是将一幅画面转化成计算机能处理的形式——数字图像的过程。 模拟图像 数字图像 正方形点阵
E N D
第二章 数字图像处理基础 讲解内容 图像数字化概念、图像文件BMP格式 重点:图像数字化和图像文件BMP格式 难点:图像文件BMP格式
2.1 图像数字化 图像数字化是将一幅画面转化成计算机能处理的形式——数字图像的过程。 模拟图像数字图像 正方形点阵 具体来说,就是把一幅图画分割成如上图所示 的一个个小区域(像元或像素),并将各小区域灰度用整数来表示,形成一幅点阵式的数字图像。它包括采样和量化两个过程。像素的位置和灰度就是像素的属性。
2.1.1采样 将空间上连续的图像变换成离散点的操作称为采样。也就是用空间上部分点的灰度值代表图像,这些点称为采样点。 对一幅图像采样时,若每行(即横向)像素为M个,每列(即纵向)像素为N个,则图像大小为M×N个像素。 在进行采样时,采样点间隔的选取是一个非常重要的问题,它决定了采样后图像的质量,即忠实于原图像的程度。采样间隔的大小选取要依据原图像的细微浓淡变化来决定。一般,图像中细节越多,采样间隔应越小。根据一维采样定理,若一维信号g(t)的最大频率为ω,以T≤1/(2ω)为间隔进行采样,则能够根据采样结果g(iT) (i=…,-1,0,1,…)完全恢复g(t),即
2.1.2量化 模拟图像经过采样后,在空间上离散化为像素。但采样所得的像素值(即灰度值)仍是连续量。把采样后所得的各像素的灰度值从模拟量到离散量的转换称为图像灰度的量化。下图(a)说明了量化过程。若连续灰度值用z来表示,对于满足zi≤z<zi+1的z值,都量化为整数qi。qi称为像素的灰度值。z与qi的差称为量化误差。一般,像素值量化后用一个字节8 bit来表示。如图(b)所示,把由黑一灰一白的连续变化的灰度值量化为0~255共256级灰度值。
2.1.3采样与量化参数的选择 一幅图像在采样时,行、列的采样点与量化时每个像素量化的级数,既影响数字图像的质量,也影响到该数字图像数据量的大小。假定图像取M×N个样点,每个像素量化后的灰度二进制位数为Q,一般Q总是取为2的整数幂,即Q=2k,则存储一幅数字图像所需的二进制位数为 字节数为 b=M×N×Q (b)
对一幅图像,当量化级数Q一定时,采样点数M×N对图像质量有着显著的影响。采样点数越多,图像质量越好; 当采样点数减少时,图像的块状效应就逐渐明显。同理,当图像的采样点数一定时,采用不同量化级数的图像质量也不一样。量化级数越多,图像质量越好; 量化级数越少,图像质量越差,量化级数最小的极端情况就是二值图像,图像出现假轮廓。
一般,当限定数字图像的大小时,采用如下原则,可得到质量较好的图像:(1) 对缓变的图像,应该细量化、粗采样,以避免假轮廓。(2) 对细节丰富的图像,应细采样、粗量化,以避免模糊(混叠)。 对于彩色图像,是按照颜色成分——红(R)、绿(G)、蓝(B)分别采样和量化的。若各种颜色成分均按8 bit量化,即每种颜色量级别是256,则可以处理256×256×256=16 777 216种颜色。
数字图像根据灰度级数的差异可分为:黑白图像、灰度图像和彩色图像。数字图像根据灰度级数的差异可分为:黑白图像、灰度图像和彩色图像。 黑白图像 图像的每个像素只能是黑或白,没有中间的过渡,故又称为二值图像。二值图像的像素值为0或1。 例如
灰度图像 灰度图像是指灰度级数大于2的图像。但它不包含彩色信息。 彩色图像 彩色图像是指每个像素由R、G、B分量构成的图像,其中R、B、G是由不同的灰度级来描述。
问题: 这些黑白、灰度、彩色数字化图像如何表述呢? 又应该以何种形式储存下来便于处理和分析呢? 解决办法: 设备无关位图DIB
2.2 设备无关位图DIB 按不同的方式进行组织或存储数字图像像素的灰度,就得到不同格式的图像文件。图像文件按其格式的不同具有相应的扩展名。常见的图像文件格式按扩展名分为:RAW格式、BMP格式、TGA格式、PCX格式、GIF格式、TIFF格式、JPG格式等。这些格式是或都可被转换成DIB格式文件。 设备无关位图DIB本身携带有自己的颜色信息,与设备无关,任何运行Windows操作系统的计算机均可处理DIB,也只有采用DIB格式的文件被Win32 API所直接支持。 1.BMP格式文件 BMP文件是DIB中比较典型的一种,其文件可分为两大部分,文件头部分和象素点阵部分。文件头包含了DIB的结构数据,进一步分为三段,因此BMP一共由以下四个部分组成: 1)14字节的文件头; 2)40字节的信息头; 3)调色板; 4)位图数据。
1)位图文件头BITMAPFILEHEADER • 它的结构如下: • typedef struct tagBITMAPFILEHEADER{ • WORD bfType; /*指定文件类型,必须是0x424D,即字符串“BM” */ • DWORD bfSize; /*指定文件大小 */ • WORD bfReserved1;/*保留字 */ • WORD bfReserved2; /*保留字 */ • DWORD bfOffBits;/*文件头到实际的位图数据的偏移字节数* / • }BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER; • 该结构的长度是固定的,为14个字节 。 • bfType—用来标识本文件为BMP位图文件 • bfSize—记录此位图文件的实际长度 • bfOffBits—位图阵列相对于文件头的偏移距离
2)位图信息头BITMAPINFOHEADER 结构的长度为40个节 , 其结构如下: typedef struct tagBITMAPINFOHEADER{ DWORD bfSize; /* 指定这个结构的大小,为40个字节 LONG biWidth; /*指定图像的宽度,单位是像素 LONG biHeight; /*指定图像的高度,单位是像素 WORD biPlanes; /*必须是1 WORD biBitCount; /*指定表示颜色位数,1(黑白)8(256色)、24(真彩色) DWORD biCompression; /*指定是否压缩,分别为BI_RGB、BI_RLE4、BI_RLE8,一般情况下置为BI_RGB不压缩模式 DWORD biSizeImage; /*指定实际的位图数据占用的字节数 LONG biXPelsPerMeter; /*指定目标设备的水平分辨率 LONG biYPersPerMeter; /*指定目标设备的垂直分辨率 DWORD biClrUsed; /*指定本图像实际用到的颜色数 DWORD biClrImportant; /*指定本图像中重要的颜色数 }BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER;
3)palette(调色板) 调色板实际上是一个数组 ,数组中每个元素的类型为一个RGBQUAD结构,占4个字节。结构定义如下: typedef struct tagRGBQUAD{ BYTE rgbBlue; 蓝色分量 BYTE rgbGreen; 绿色分量 BYTE rgbRed; 红色分量 BYTE rgbReserved;保留值 }RGBQUAD; 有些位图,比如真彩色图,没有调色板。他们的位图信息头后直接是位图数据。 4)位图数据 它分两种情况:对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值;对于真彩色图,图像数据就是实际的R、G、B值。对于某一坐标点(x,y)处的地址计算公式为(以原点(0,0)在图像左上角为例): 灰度图:位图象素点阵首地址+(图像高度-1-y)*图像宽度(必须是4的倍数)+x 彩色图:位图象素点阵首地址+(图像高度-1-y)*图像宽度×3(必须是4的倍数)+x×3
4)位图数据 它分两种情况:对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值;对于真彩色图,图像数据就是实际的R、G、B值。对于某一坐标点(x,y)处的地址计算公式为(以原点(0,0)在图像左下角为例): 灰度图:位图象素点阵首地址+y*图像宽度(必须是4的倍数)+x 彩色图:位图象素点阵首地址+y*图像宽度×3(图像宽度×3必须是4的倍数)+x×3 下面两点请大家注意: (1) 位图数据每一行的字节数必须是4的整倍数,否则需要补齐。(2) BMP文件的数据存放格式为从下到上,从左到右。也就是说,位图数据是倒置的,读取BMP文件时,先读取的是最下面的数据,然后依次从下往上读取数据。
B G R a)位图是1,4,8位时,有调色板。 对于2色位图,用1位就可以表示该像素的颜色,因此一个字节可以表示8个像素; 对于16色位图,用4位可以表示一个像素的颜色,所以1个字节可以表示2个像素; 对于256色位图,一个字节刚好表示一个像素;
b) 位图是24位(真彩色)时,无调色板 B1 G1 R1 B2 G2 R2 : Bn Gn Rn 对于真彩色图,3个字节才能表示1个像素.
举例说明:lena.bmp lenacaise.bmp 图像信息: 灰度BMP图像; 彩色BMP图像; 宽度为140; 宽度为140; 高度为140; 高度为140; 不压缩; 不压缩; 采用灰度调色板; 没有调色板; 文件长度20680。 文件长度58856。 根据上述这些信息,利用VC以二进制方式打开文件并找出文件中在文件头部分所对应的值
图片信息比较:lena.bmp lenacaise.bmp 文件头: bfType “BM” “BM” bfSize 20680 58856 bfReserved1 0 0 bfReserved2 0 0 bfOffBits 1078 54 信息头: bfSize 40 40 biWidth 140 140 biHeight 140 140 biBitCount 8 24
bfSize-文件实际长度 0x000050C8=20680 bfOffsets-偏移距离 0x00000436=1078 bfType-’BM’ 位图文件头—lena.bmp在VC中打开的二进制内容
bfSize-40 图像宽度-140 高度-140 颜色位数-8 说明为灰度图像 biPlanes-1 位图信息头—lena.bmp在VC中打开的二进制内容
调色板—lena.bmp在VC中打开的二进制内容 bfType-’BM’
bfSize-文件实际长度 0x0000E5E8=58856 bfOffsets-偏移距离 0x00000036=54 bfType-’BM’ 位图文件头—lenacaise.bmp在VC中打开的二进制内容
bfSize-40 图像宽度-140 高度-140 颜色位数-24 说明为彩色图像 biPlanes-1 位图信息头—lenacaise.bmp在VC中打开的二进制内容 上述内容中无调色板
对于灰度图像,如何定位图像中任一点在图像文件中的位置,并找到该点象素的值?对于灰度图像,如何定位图像中任一点在图像文件中的位置,并找到该点象素的值? Photoshop中的像素坐标是以左上角为原点的,与BMP图像中的坐标上下方向正好相反,如图(x,y)=(100,39)对应photoshop中(100,100)处地址:位图象素点阵首地址+39×140+100 见下页:
如图(x,y)=(100,39)处地址:位图象素点阵首地址+39×140+100=6638=0x19EE,如下图(0x4E)=(78):如图(x,y)=(100,39)处地址:位图象素点阵首地址+39×140+100=6638=0x19EE,如下图(0x4E)=(78): (78)
对于真彩色图,3个字节才能表示1个像素,如何定位图像中任一点在图像文件中的位置,并找到该点象素的值? 如图(x,y)=(100,39)处地址:位图象素点阵首地址+39×140×3字节+100×3字节,见下页:
如图(x,y)=(100,39)处地址:位图象素点阵首地址+39×140×3字节+100×3字节=54+42000+300=16734=0x415E,如下图:(0x49,0x2F,0x82)=(73,47,130),与上图正好对应。如图(x,y)=(100,39)处地址:位图象素点阵首地址+39×140×3字节+100×3字节=54+42000+300=16734=0x415E,如下图:(0x49,0x2F,0x82)=(73,47,130),与上图正好对应。 (73,47,130)
举例说明:lena.bmp lenacaise.bmp 图像信息: 灰度BMP图像; 彩色BMP图像; 宽度为140; 宽度为140; 高度为140; 高度为140; 不压缩; 不压缩; 采用灰度调色板; 没有调色板; 根据上述已知的这些信息,计算灰度图和彩色图文件头大小(其中位图文件头、信息文件头、调色板分别多少)、位图象素点阵大小?
学习资料: 孙鑫老师的Visual C++视频教程,视频共分20课,平均每课两个多小时 http://net.stuun.com/program/VisualC/46545.html
2.3 Visual C++软件界面及相关功能介绍 Visual C++是C++语言的可视化编程工具
1、Visual C++开发环境介绍 (1)工作空间窗口 • 类浏览方式 • 在ClassView Tab页内,树状栏内每个节点对应一个类,分别为CAboutDlg、CImageShowApp、CImageShowDoc、CImageShowView、CMainFrame类以及Globals全局目录。 • 资源浏览方式 • 在ResourceView Tab页内,可对每种资源进行编辑或修改,如添加菜单、添加工具栏、添加对话框以及添加图标等等,如下图:
文件浏览方式 • 在左下方的FileView Tab页内,从中可看到Source Files、Header Files、Resource Files等,分别为程序实现文件(.cpp)、头文件(.h)和资源文件,一般情况下,每组相同文件名的头文件和实现文件对应一个类;除了上述的这些文件外,还有创建的中间文件,具体如下表:
(2)向导栏 方便查找类、类中成员变量、类中成员函数以及编译、链接及调试的工具条按钮窗口。 • (3)源代码窗口 代码编辑窗口。 • (4)输出信息窗口 输出编译、链接等信息。 2、Windows编程模型 • (1)应用程序创建过程图