《数字图像处理》实验指导书编写: 罗建军海南大学三亚学院10月目录一、概述 ....................................................................... 错误!未定义书签。
二、建立程序框架 ....................................................... 错误!未定义书签。
三、建立图像类 ........................................................... 错误!未定义书签。
四、定义图像文档实现图像读/写.............................. 错误!未定义书签。
五、实现图像显示 ....................................................... 错误!未定义书签。
六、建立图像处理类................................................... 错误!未定义书签。
七、实现颜色处理功能............................................... 错误!未定义书签。
(一) 亮度处理................................................................. 错误!未定义书签。
(二) 对比度处理............................................................. 错误!未定义书签。
(三) 色阶处理................................................................. 错误!未定义书签。
(四) 伽马变换................................................................. 错误!未定义书签。
(五) 饱和度处理............................................................. 错误!未定义书签。
(六) 色调处理................................................................. 错误!未定义书签。
八、实现几何变换功能............................................... 错误!未定义书签。
(一) 图像缩放................................................................. 错误!未定义书签。
(二) 旋转......................................................................... 错误!未定义书签。
(三) 水平镜像................................................................. 错误!未定义书签。
(四) 垂直镜像................................................................. 错误!未定义书签。
(五) 右转90度................................................................. 错误!未定义书签。
(六) 左转90度................................................................. 错误!未定义书签。
(七) 旋转180度............................................................... 错误!未定义书签。
九、实现平滑锐化功能............................................... 错误!未定义书签。
十、图像处理扩展编程............................................... 错误!未定义书签。
一、概述实验项目: 图像处理程序编程运行环境: Windows XP/编程工具: Visual C++ 6.0主要内容:(1) 建立程序框架, 实现图像的读取、保存、显示;(2) 编写颜色处理、几何变换、平滑锐化等图像处理代码, 并实现其调用;(3) 自行编写实现扩展的图像处理功能。
二、建立程序框架预备工作: 在本机的硬盘上以自己完整的学号和姓名建立一个文件夹。
上机编程的内容全部保存在该文件夹中。
每次下机前将该文件夹拷贝到网络服务器上本班的文件夹中; 下次上机时再从服务器上将文件夹拷贝到本机。
1. 新建应用程序运行Visual C++ 6.0;点击菜单”文件——新建”, 打开”新建”对话框;点击”工程”选项页; 选中”MFC AppWizard(exe)”; 在”位置”编辑框中选中自己所建立的文件夹; 在”工程名称”编辑框中输入DIP???, 其中???为自己姓名的拼音缩写, 如DIPLJJ; 按”确定”按钮, 进入向导过程。
2. 应用程序向导步骤1: 选择”单文档”, 其它不变,步骤2: 不作改变, 点击”下一步”;步骤3: 不作改变,步骤4: 取消”打印和打印预览”; 按下”高级”按钮, 在”文件扩展名”编辑框中输入bmp, 关闭; 点击”下一步”;步骤5: 选择”作为静态的DLL”, 点击”下一步”;步骤6: 将CDIPLJJView类的基类选择为CScrollView, 其它不变, 点击”完成”。
点击”确定”。
3. 应用程序框架及基本操作在完成向导过程后, 将建立一套应用程序框架, 该框架中包含如下几个类:CDIPLJJApp ——应用程序类CMainFrame ——主窗口框架类CDIPLJJDoc ——文档类CDIPLJJView ——视图类CAboutDlg ——关于对话框类( 其中LJJ应换为自己姓名的拼音缩写, 后同)每个类都有一个类定义文件.h, 和类实现文件.cpp。
在VC主界面左侧的组合窗口中, 切换到”ClassViev”选项页, 点击展开”DIPLJJ Classes”, 将列出该应用程序的所有类。
双击某个类, 将在编辑窗口中打开该类的.h文件; 点击展开类, 双击类中已实现的某个成员函数, 将打开该类的.cpp文件。
4. 修改”关于”对话框在VC主界面左侧的组合窗口中, 切换到”ResourceView”选项页, 展开”DIPLJJ resources”,展开”Dialog”, 双击”IDD_ABOUTBOX”, 对”关于”对话框进行编辑, 在”版权所有(C) ”之前加上自己的学号和姓名, 然后保存。
5. 组建和运行程序点击菜单”组建——组建”, 或点击相应的工具条按钮, 生成可执行程序( exe) ;点击菜单”组建——执行”, 或点击相应的工具条按钮, 运行该程序, 在程序中打开”关于”对话框。
三、建立图像类1. 建立类文件点击菜单”插入——类”, 打开”新建类”对话框; 在类的类型中选中”Generic Class”; 在名称中输入”LImage”; 确定。
建立起LImage 类的头文件LImage.h和源文件LImage.cpp。
2. 编写类定义代码打开LImage.h文件, 将LImage类的定义代码添加到该头文件中( 灰底部分为文件中已有的代码, 后同) :class LImage{public:LImage();virtual ~LImage();BOOL Create(int a_Width,int a_Height);void Destroy();BOOL IsValid();BOOL CopyFrom(LImage *a_pImg);BOOL LoadBmpFile(CString a_Filename);BOOL SaveBitmap(CString a_Filename);//属性int m_Width,m_Height; //图像的宽度, 高度, 以象素计int m_WidthBytes; //每行象素所占字节数int m_ImageSize; //象素数据总字节数BYTE* m_pBits; //图像数据块CDC m_DC;//显示BOOL BitBlt(HDC a_DestDC,int a_DestX,int a_DestY,int a_Width,int a_Height,int a_SrcX,int a_SrcY,DWORD a_Rop=SRCCOPY);BOOL StretchBlt(HDC a_DestDC,int a_DestX,int a_DestY,int a_DestWidth,int a_DestHeight,int a_SrcX,int a_SrcY,int a_SrcWidth,int a_SrcHeight,DWORD a_Rop=SRCCOPY);int FitBlt(HDC a_DestDC,int a_DestX,int a_DestY,int a_DestWidth,int a_DestHeight,int a_SrcX,int a_SrcY,int a_SrcWidth,int a_SrcHeight,DWORD a_Rop=SRCCOPY);protected:HBITMAP m_hBitmap;HDC m_hMemDC;private:HBITMAP m_hOldBitmap;};#endif// !defined(AFX_LIMAGE_H__4BFB411F_B5D3_4A26_8188_919613CE D4A8__INCLUDED_)3. 编写类实现代码打开LImage.cpp文件, 将LImage类的实现代码添加到该文件中。
(1) 构造及析构函数LImage::LImage(){m_hBitmap = NULL;m_pBits = NULL;m_hMemDC = NULL;}LImage::~LImage(){Destroy();}(2) 图像空间创立函数按给定的图像尺寸分配图像的内存空间, 并定义相关参数。
BOOL LImage::Create(int a_Width,int a_Height){Destroy();if( a_Width==0 || a_Height==0 ) return FALSE;if( a_Width<0 ) a_Width = -a_Width;if( a_Height<0 ) a_Height = -a_Height;BITMAPINFO bi;bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bi.bmiHeader.biWidth = a_Width;bi.bmiHeader.biHeight = -a_Height; //使图像原点在左上角; 若为正数则在左下角。