版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一 VC图像处理基础1.1位图文件结构位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据。 其中 wetu 信息包括位图信息头和颜色表两部分。表 1-1 位图文件的结构位图文件头主要用于识别位图文件。以下是位图文件头结构的定义: typedef struct tagBITMAPFILEHEADER / bmfh WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits; BITMAPFILEHEADER;其中的 bfType 值应该是“BM” (0x4d42 , 标志该文件是位图文件。 bfS
2、ize 的值是位图文件的大小。位图信息结构的定义:typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors1; BITMAPINFO;可见位图信息也是由两部分组成的:位图信息头 + 颜色表1.位图信息头位图信息头包含了单个像素所用字节数以及描述颜色的格式, 此外还包括 位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息 头结构的定义:typedef struct tagBITMAPINFOHEADER / bmihDWORD biSize;LONG biWidth;LONG biHeig
3、ht;WORD biPlanes;WORD biBitCountDWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant; BITMAPINFOHEADER;下表是对结构体当中各个成员的说明:表 1-2 文件信息头结构说明说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常 参考的变量。(1对于每个像素的字节数,分别有以下意义:0,用在 JPEG 格式中。1,单色图,调色板中含有两种颜色,也就是我们通常说的黑
4、白图片。 4, 16色图。8, 256色图,通常说的灰度图。16, 64K 图,一般没有调色板,图像数据中每两个字节表示一个像素, 5个或 6个位表示一个 RGB 分量。24, 16M 真彩色图,一般没有调色板,图像数据中每 3个字节表示一个像 素,每个字节表示一个 RGB 分量。32, 4G 真彩色,一般没有调色板,每 4个字节表示一个像素,相对 24位 真彩图而言,加入了一个透明度,即 RGBA 模式。(2这个值通常为 0,表示使用 biBitCount 确定的全部颜色,例外是使 用的颜色树木小于制定的颜色深度的颜色数目的最大值。(3这个值通常为 0,表示所有的颜色都是必需的。2.颜色表
5、颜色表一般是针对 16位以下的图像而设置的,对于 16位和 16位以上的 图像,由于其位图像素数据中直接对对应像素的 RGB(A颜色进行描述,因而 省却了调色板。而对于 16位一下的图像,由于其位图像素数据中记录的只是 调色板索引值,因而需要根据这个索引到调色板去取得相应的 RGB(A颜色。 颜色表的作用就是创建调色板。下图是带调色板和不带调色板的位图的简单示意图 图 1-1 带调色板的位图和不带调色板的位图之间的区别颜色表是由颜色表项组成的,颜色表项结构的定义如下:typedef struct tagRGBQUAD / rgbqBYTE rgbBlue;BYTE rgbGreen;BYTE
6、rgbRed;BYTE rgbReserved; RGBQUAD;其中需要注意的问题是, RGBQUAD 结构中的颜色顺序是 BGR , 而不是平常的 RGB 。最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部 分:位图数据。 根据不同的位图, 位图数据所占据的字节数也是不同的, 比如, 对于 8位位图,每个字节代表了一个像素,对于 16位位图,每两个字节代表了一个像素,对于 24位位图,每三个字节代表了一个像素,对于 32位位图, 每四个字节代表了一个像素。1.2位图文件读写认识了位图文件的结构以后,对特定位图文件进行读写操作就显得简单 了。 下面介绍一个能够方便进行位图读写
7、操作的 C+类。 给出该类的使用参考, 对于实现代码中的关键部分做出讲解。class CFG_DIB : public CObjectpublic:/默认构造函数CFG_DIB(;/构造函数 , 根据图象宽和高 , 以及记录每个象素所需字节数来初始化CFG_DIB(int width, int height, int nBitCounts;virtual CFG_DIB(;public:HBITMAP m_hBitmap;LPBYTE m_lpDIBits; /DIB位的起始位置 LPBITMAPINFOHEADER m_lpBMPHdr; /BITMAPINFOHEADER信息LPVOID
8、m_lpvColorTable; /颜色表信息HPALETTE m_hPalette; /条调色板private:DWORD m_dwImageSize; /非 BITMAPINFOHEADER 或 BITMAPFILEHEADER 的位 int m_nColorEntries; /颜色表项的个数/显示参数public:CPoint m_Dest; /目的矩形域的左上角坐标 CSize m_DestSize; /显示矩形的宽度和高度 CPoint m_Src; /原矩形左下角坐标CSize m_SrcSize; /原矩形宽度和高度public:void InitDestroy(; /初始化变量
9、void ComputePaletteSize(int nBitCounts; /计算调色板大小void ComputeImage(; /计算图象大小/从 BMP 文件中读入 DIB 信息BOOL ReadFile(CFile* pFile;/从 BMP 文件中读入 DIB 信息 , 与 ReadFile 不同的是使用 CreateSection 创建位图位 BOOL ReadSection(CFile* pFile, CDC* pDC = NULL;/将 DIB 写入文件,保存成 BMP 图片格式BOOL WriteFile(CFile* pFile;/创建新的位图文件,根据参数 width
10、,height,nBitCounts 分配内存空间BOOL NewFile(int width, int height, int nBitCounts;/关闭位图文件BOOL CloseFile(;/显示位图BOOL Display(CDC* pDC;HBITMAP CreateBitmap(CDC* pDC; /用 DIB 创建 DDB HBITMAP CreateSection(CDC* pDC = NULL; /创建位图位数据,即象素数据 /如果 DIB 没有颜色表,可以用逻辑调色板BOOL SetLogPalette(CDC* pDC;/如果 DIB 有颜色表,可以创建系统调色板BOO
11、L SetWinPalette(;/把 DIB 对象的逻辑调色板选进设备环境里,然后实现调色板UINT UseLogPalette(CDC* pDC;/得到 BitmapInfoHeader 的大小,包含颜色表数据int GetHeaderSize(return sizeof(BITMAPINFOHEADER + sizeof(RGBQUAD * m_nColorEntries; /得到图像的高度int GetHeight(if(m_lpBMPHdr = NULL return 0;return m_lpBMPHdr->biHeight;/得到图像的宽度int GetWidth(if(m
12、_lpBMPHdr = NULL return 0;return m_lpBMPHdr->biWidth;/得到图像的大小int GetImageSize(return m_dwImageSize;long GetLineBit(; /得到一行的象素数;CFG_DIB提 供 了 两 个 从 位 图 文 件 读 取 位 图 数 据 的 方 法 :ReadFile 和 ReadSection ,二者不同之处,前者使用动态分配内存的方法初始化存储位位 图数据的指针, 后者则使用 API 函数, 根据位图信息初始化存储位图数据的指 针。方法 1m_lpDIBits = (LPBYTE new c
13、harm_dwImageSize;方法 2m_hBitmap = :CreateDIBSection(pDC->GetSafeHdc(,(LPBITMAPINFO m_lpBMPHdr, DIB_RGB_COLORS,(LPVOID* &m_lpDIBits, NULL, 0;对读取位图的过程中需要调用的对调色板进行操作的相关函数进行说明。 读取文件的过程中,计算出调色板大小,然后调用创建调色板函数: ComputePaletteSize(m_lpBMPHdr->biBitCount;SetWinPalette(;在显示位图之前,设置调色板:if(m_hPalette !=
14、 NULL :SelectPalette(pDC->GetSafeHdc(, m_hPalette, TRUE;位图的显示还是调用 Windows 的 API 函数来进行, 需要传递的参数包括当 前位图信息头,位图数据等:StretchDIBits(pDC->GetSafeHdc(, m_Dest.x, m_Dest.y,m_DestSize.cx, m_DestSize.cy,m_Src.x, m_Src.y,m_SrcSize.cx, m_SrcSize.cy,m_lpDIBits, (LPBITMAPINFO m_lpBMPHdr,DIB_RGB_COLORS, SRCCOP
15、Y;其中的 m_Dest, m_DestSize, m_Src, m_SrcSize分别代表了图像在当前设备上显示的左上角坐标和范围以及需要显示的源图像的左下角坐标和范围。 此处需要说明的是, 位图数据的字节数组是从图像的最下面一行开始逐行想上 存储的,所以在选取源位图的现实范围的时候需要特别注意!1.位图的存储。位图的存储用 WriteFile 实现。2.新位图的创建。新位图的创建由 NewFile 实现。需要的参数是位图的 宽度、高度、以及位图像素占用的位数。3.其它问题。存取位图数据的字节数组有个问题需要引起开发人员的注 意:字节数组中每个扫描行的字节数必需是 4的倍数,如果不足要用 0
16、补齐。 以下是处理的办法:DWORD dwBytes = (DWORD m_lpBMPHdr->biWidth * m_lpBMPHdr->biBitCount / 32;if(DWORD m_lpBMPHdr->biWidth * m_lpBMPHdr->biBitCount % 32 dwBytes+;dwBytes *= 4;m_dwImageSize = dwBytes * m_lpBMPHdr->biHeight;这段代码按照要求算出了用于记录图像数据的字节数组的大小。1.3 CFG_DIB的使用以下是 CFG_DIB的使用示例代码。#include &
17、quot;fg_dib.h"CFG_DIB m_fgdib;/new filem_fgdib.NewFile(width, height, nbitnum;/open fileCFile* pf;pf = new CFile;pf->Open(sFileName, CFile:modeRead;m_fgdib.ReadFile(pf;pf->Close(;delete pf;/draw BMPm_fgdib.Display(pDC;/close BMPm_fgdib.CloseFile(;二 选题一 图像的点运算实现图像的几种常用点运算,包括:灰度的线性变换、灰度的域值变
18、换、 灰度的窗口变换、灰度拉伸和灰度均衡。2.1 灰度的线性变换灰度的线性变换用到的线性灰度变换函数 f (x是一个一维线性函数: B A (f x f x f +=灰度变换方程为:fB D f D f D A A B +=A (式中参数 A f 为线性函数的斜率, B f 为线性函数的在 y 轴的截距, D A 表示输入图像 的灰度, B D 表示输出图像的灰度。当 A f >1时,输出图像的对比度将增大;当 A f <1时,输出图像的对比度将减少;当 A f =1且 B f 0时,操作仅使所有像素的灰度值上移或下移,其 效果是使整个图像更暗或更亮;如果 A f <0,暗区
19、域将变亮,亮区域将变暗,点运算完成了图像 求补运算。算法参考界面。 图 2-1灰度的线性变换参考界面2.2灰度的域值变换灰度的域值变换的操作过程是先由用户指定一个域值, 如果图像中某个像 素的灰度值小于该域值,则将该像素的灰度值设置为 0,否则灰度值设置为 255。灰度的域值变换可以将一幅灰度图像转换成黑白二值图像。 算法参考界面:图 2-2灰度的域值变换参考界面2.3灰度的窗口变换灰度的窗口变换限定一个窗口范围, 该窗口中的灰度值保持不变; 小于该 窗口下限的灰度值直接设置为 0;大于该窗口上限的灰度值直接设置为 255。灰度的窗口变换函数表达式如下:式中 L 表示窗口的下限, U 表示窗口
20、的上限。 算法参考界面:><=U x 255Ux L x L x 0x f ( 图 2-3灰度的窗口变换参考界面2.4灰度拉伸灰度拉伸和灰度的线性变换有点类似,都用到了灰度的线性变换。但不同之处在于灰度拉伸不是完全的线性变换,而是分段线性变换。灰度拉伸可以有选择的拉伸某段灰度区间以改善输出图像。如果一幅图像灰度几种在较暗的区域而导致图像偏暗, 可以用灰度拉伸功能来拉伸 (斜率 >1 物体灰度区间以改善图像:同样如果图像灰度几种在较量的区域而导致图像偏 亮,也可以用灰度拉伸功能来压缩(斜率 <1物体灰度区间以改善图像质量。算法参考界面: 图 2-4灰度拉伸参考界面2.3灰
21、度均衡灰度均衡有时也称为直方图均衡,目的是通过点运算使输入图像转换为在每一 灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的 。这对于在进行 图像比较或分割之前将图像转换位一致的格式是十分有益的。直方图均衡化处理的计算步骤 1 统计原始图象的直方图 rk 是归一化的输入图象灰度级; 2计算直方图累积分布曲线 ; 3用累积分布函数作变换函数进行图像灰度变换。根据计算得到的累积分布函数,建立输入图象与输出图象灰度级之间的对应关 系,并将变换后灰度级恢复成原先数范围。 例:表 2-1 64×64大小的图像灰度分布表 图 2-5 直方图均衡化处理处理过程如下: 由变换函数(a(b(
22、c810r P r P r P r P r P r T s 650r P r P r P r P r T s 440r P r P r P r T s 190r P r P r T s 3r 2r 1r 0r 3j j r 332r 1r 0r 20j j r 221r0r 10j j r 110r 00j j r 00. ( ( ( ( ( (. ( ( ( ( (. ( ( ( (. ( ( (=+=+=+=依此类推:s4=0.89, s5=0.95, s6=0.98, s7=1.0。 变换函数如图 2-5所示。这里只对图像取 8个等间隔的灰度级, 变换后的值也只能选择最靠近的一个灰 度级
23、的值。因此,对上述计算值加以修正:因为 r0->s0,r1->s1,r2->s2,r3->s3,r4->s4,r5->s5,r6->s6,r7->s7所以灰度级对应为 r0->1/7,r1->3/7,r2->5/7,r3->6/7,r4->6/7,r5->1,r6->1,r7->1可得到新的直方图。1s 1s 1s 76s 76s 75s 73s 71s 76543210, , ,三 选题二 图像的几何变换实现图像的几种常用几何变换算法,包括:图像的平移、图像的镜像变换、图 像的转置、图像的缩放和图
24、像的旋转。3.1图像的平移图像平移是图像操作中的一项基本功能,它是将图像沿 x 轴或者 y 轴方向移动 一定距离的操作。平移算法很简单,只要找到新图像的点在图像中的对应位置,然 后把信息保存就可以了。平移变换可以用矩阵形式表示如下:式中 (x*,y*为平移后的坐标, (x,y为平移前的坐标。 Tx 和 Ty 分别为 X 方向和 Y 方向的平移量。平移后有可能某些点不在原图中, 可以直接将它的像素值统一设置为 0或者 255(对于灰度图就是黑色或者白色 。同样,若有点不再原图中,也就说明原图中有点 被移出显示区域。 算法的参考界面和效果如下所示:图 3-1 图像平移的参考界面和效果图3.2图像的
25、镜像变换图像的镜像变换分为两种:水平镜像, 另外一种是垂直镜像 (或称为图像颠倒 。+=111001001yx y x T y T x T T y x y x *1图像垂直镜像是指把定义好的图像区域上下翻转地显示在屏幕上。分析图像垂 直镜像的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第 一行与最后的第 n 行相互交换,第二行与第 n - 1行交换 ,依此类推,从而实 现了图像的垂直镜像。只需采用按行交换的方式,即可方便地修改缓冲区内容,实 现图像的垂直镜像。基本步骤如下:(1将原图像读入缓冲区,并擦除原图像;(2计算图像的高度,即行数 height ;计算图像宽度 widt
26、h ;根据宽度、 高度生成新缓冲区;(3把第一行与最末行交换,第 2行与第 n -1行交换,依此类推,直 至全部交换完毕。既原图中的 (x、 y 点,在新生成的图象中对应为 x1=x, y1=height-1-y。把原图中的象素值读入新缓冲区的 (x1, y1 点处。(4把交换后的图像缓冲区内容重新显示在屏幕上。 图 3-2 图像垂直镜像效果图水平镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析水平镜像变 换过程可以发现:每行图像信息的处理方式是相同的,而且行顺序不发生变化,只 是每一行的像素信息按从左到右的顺序进行了左右颠倒,从而实现了水平镜像变换。 因此,采用按行逐点变换的方式实现图
27、像的镜像。首先,对于左上角为(left, top ,右下角为(right, bottom 矩形区域图像,给出 其中任意点(x0, y0镜像变换后的新坐标(x, y 的坐标变换公式:x = right -x0 +lefty = y0根据以上公式,对各个像素点计算新坐标后,直接把它显示在屏幕的相应位置 上。如果完全逐点地进行交换,处理一个像素点就要读取一次像素值,从而降低了 变换速度。由于像素点是顺序存放在各个 bit 位上,每读取一个字节就包含了 8个像 素点的信息,只需设置不同的位屏值 bitmask ,就可以获得不同像素点的信息。因此 采用按行逐字节变换的方式,每读一次就进行 8个像素点的变
28、换,以提高变换速度。 将一矩形区域的图像进行水平镜像变换的基本步骤如下:(1 用 getimage(把图像保存到内存缓冲区,并擦除原图像。(2 计算图像高度,即行数高度 height 和宽度 width ;计算保存一行图像信息占 用的字节数 linebytes 。计算公式如下:height = bottom -top +1;width = right -left +1;linebyte = (width +7 /8 *4;(3 对图像进行镜像。(4 释放内存图像缓冲区。 图 3-3 图像水平镜像效果图3.3图像的转置图像的转置操作是将图像像素的 x 坐标和 y 坐标互换。该操作将改变图像的大 小,图像的高度和宽度
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宜春学院《立法学》2025-2026学年期末试卷
- 江西工程学院《畜牧微生物学》2025-2026学年期末试卷
- 东华理工大学《思想政治教育课程与教学论》2025-2026学年期末试卷
- 萍乡学院《金融法》2025-2026学年期末试卷
- 华东交通大学《市场调研与预测》2025-2026学年期末试卷
- 安庆医药高等专科学校《传热学》2025-2026学年期末试卷
- 泉州纺织服装职业学院《计量经济学》2025-2026学年期末试卷
- 矿山提升设备操作工安全强化知识考核试卷含答案
- 皖北卫生职业学院《健康教育与健康促进》2025-2026学年期末试卷
- 安徽中澳科技职业学院《中国文化概况英语》2025-2026学年期末试卷
- 睡眠监测室工作制度
- 2026年山东济南历下区九年级中考语文一模考试试题(含解析)
- 2026四川成都双流区面向社会招聘政府雇员14人备考题库及答案详解(有一套)
- 眼科护理操作规范
- 肺结节诊治指南
- 茶叶生物化学理论考试题库(100题)
- 2022年03月广东深圳市宝安区松岗人民医院公开招聘专业技术人员笔试参考题库含答案解析
- GB/T 40815.2-2021电气和电子设备机械结构符合英制系列和公制系列机柜的热管理第2部分:强迫风冷的确定方法
- GB/T 27664.1-2011无损检测超声检测设备的性能与检验第1部分:仪器
- GA/T 669.7-2008城市监控报警联网系统技术标准第7部分:管理平台技术要求
- (完整word版)wincc中使用VBS脚本读写SQLServer数据库文件
评论
0/150
提交评论