光学图象处理课程设计.docx
《光学图象处理课程设计.docx》由会员分享,可在线阅读,更多相关《光学图象处理课程设计.docx(40页珍藏版)》请在冰豆网上搜索。
光学图象处理课程设计
光学图象处理实验(课程设计)
指导说明书
信息物理与工程系
王振东
2003年5月
一、实验(课程设计)目的:
通过本实验(课程设计),掌握数字图象处理的基本原理;掌握VisualC++、或Matlab、或VB等WINODWS编程软件的使用;掌握程序的编辑、编译和调试方法;掌握基本数字图象文件格式;掌握图象输入、输出软件接口。
二、实验(课程设计)仪器
PC微型计算机一台,VisualC++、或Matlab、或VB等WINODWS编程软件。
实验样图及图像程序接口。
三、实验(课程设计)原理
在PC机平台及WINODWS操作系统上,以通用编程软件通过软件编程实现数字图象文件的读取、存储、显示,同时设计一种或几种数字图象处理算法并调试实现,将处理结果以图象方式显示,完成数字图象处理的基本过程。
四、实验(课程设计)步骤
1.按要求进行设计选题(选题范围附后);
2.查阅相关资料,筛选并确定算法;
3.仔细阅读相关软件使用手册,了解软件编程方法;
4.按格式输入编制好的程序;
5.对程序进行编译,查找语法错误;
6.根据编译过程指出的错误,修改错误,直到编译通过;
7.开始调试算法,通过观察输出结果的变化,查找算法错误,直至算法调试正确;
8.完成程序整理,并编译出最终版本的可执行程序;
9.根据要求完成课程设计(实验)报告。
五、实验(课程设计)要求
在进行实验(课程设计)前要预习,必须基本掌握其中一种WINODWS编程软件的使用。
熟悉数字图象处理的基本原理和过程,掌握基本数字图象文件格式;掌握图象输入、输出软件接口。
掌握设计数字图象处理算法的过程和方法并调试实现。
六、实验(课程设计)结果
实验(课程设计)报告。
源程序和可执行程序。
七、选题范围
(一)通用选题
1.图象编码:
a.哈夫曼编码,b.游程长度编码,c.香农编码,d.其它熵编码;
2.图象变换:
a.快速二维离散傅氏变换,b.离散余弦变换,c.离散沃尔什变换,d.离散小波变换;
3.图象增强:
a.灰度级校正,b.灰度级变换,c.直方图修正,d.直方图均衡,e.同态增晰,f.噪声平滑,g.中值滤波,h.锐化,i.几何校正;
4.图象复原:
a.反向滤波,b.最小二乘滤波,c.同态滤波,d.卡尔曼滤波;
5.图象分割:
a.阈值分割,b.边界检测,c.骨架提取,d.区域生长,e.同分裂合并,f.区域标记;
6.图象识别:
a.边界表达(链码,曲线拟合,转折能量法),b.边界描述(矩形度,圆形度,矩,傅立叶形状描述),c.Hough变换,d.广义Hough变换,e.区域表达(四叉树,骨架),f.区域描述(投影,不变矩),g.纹理描述符,h.贝叶斯判决,i.模板匹配;
7.图象重建:
a.傅立叶变换重建,b.滤波反投影重建,c.代数迭代重建。
(二)专用选题
1.光斑定位问题的研究。
即通过对一个光斑图象的处理,精确地找出光斑的中心坐标,并确定其定位精度;
2.数值方法提高图象分辨率的研究。
即通过对一个图象的数学插值处理,获得比物理图象分辨率更高的图象,并对不同数学插值算法的效果和可实现性进行比较;
3.中值滤波算法的优化设计研究。
包括效果优化和计算量优化。
4.图象匹配识别。
即已知一幅标准图象,然后与其它图象进行比较,判断该图象与标准图象的匹配程度。
5.光学自动对焦算法。
在光学系统成像过程中,通过所成的像清晰与否来判断光学系统的对焦是否准确。
6.自选。
八、实验(课程设计)报告要求
1.标题、作者(可多人,但不超过三人,排名分先后);
2.背景或关于该类方法的概述。
可在通用选题中一个题目中选择某一小类的问题进行研究,或选择一个专用选题讨论;
3.所选择的方法的讨论(包括效果、可实现性,至少两种以上的方法,以及详细的实现流程);
4.源程序及详细说明;
5.结论,包括实际效果以及与预期的对比及原因分析;
6.参考文献,不少于8篇,必须有杂志文章4篇;
7.篇幅不少于4000字。
九、实验(课程设计)报告样例
数值方法提高图像分辨率的研究
作者:
XXX,XXX,XXX
单位:
南京理工大学
摘要:
本文采用了两种插值方法提高图像分辨率,……(略)……本实验的程序是在VB环境中完成的。
关键字:
象素分辨率
一、提高图像分辨率的背景
图像分辨率(即区分细节的程度)与采样点和灰度级的个数紧密相关。
……(略)……
二、预处理步骤
直方图均衡化
①原理:
由于原图像较为暗淡,故采用直方图均衡化增强其整体对比度。
……(略)……
②流程图:
③计算量:
乘法运算256*3=768次,加法运算lenx*leny+2*256=lenx*leny+512次。
……(略)……
三、两种插值方法
都是将预处理后的ii(lenx,leny)插值生成dest(2*lenx-1,2*leny-1),对应的原象素不加处理,边缘上的插值点采用简单的两点平均法,新行新列的插值点用四点平均法,所有的插值点都是用原象素矩阵生成的。
1.两点平均法
①原理:
如图4.1,原行原列中的插值点取两点平均法,即为拉格朗日插值的线性处理。
……(略)……
2.三次的拉格朗日插值法
……(略)……
3.对三次样条插值的讨论
……(略)……
所以要解得次线性方程组,……(略)……。
四、结论:
速度:
由于本程序是在VB环境中进行的,所以运行速度较慢,大约需3-4秒钟才能出来一幅图像。
两种方法的比较:
……(略)……。
六.源程序及详细说明(略):
七.参考文献:
……(略)……
十、实验(课程设计)图象接口程序代码
//dibapi.h
#ifndef_INC_DIBAPI
#define_INC_DIBAPI
//DIB句柄
DECLARE_HANDLE(HDIB);
//DIB常量
#definePALVERSION0x300
/*DIB宏*/
//判断是否是Win3.0的DIB
#defineIS_WIN30_DIB(lpbi)((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))
//计算矩形区域的宽度
#defineRECTWIDTH(lpRect)((lpRect)->right-(lpRect)->left)
//计算矩形区域的高度
#defineRECTHEIGHT(lpRect)((lpRect)->bottom-(lpRect)->top)
//在计算图像大小时,采用公式:
biSizeImage=biWidth'×biHeight。
//是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示
//大于或等于biWidth的,离4最近的整倍数。
WIDTHBYTES就是用来计算
//biWidth'
#defineWIDTHBYTES(bits)(((bits)+31)/32*4)
//PCX文件头结构
typedefstruct{
BYTEbManufacturer;
BYTEbVersion;
BYTEbEncoding;
BYTEbBpp;
WORDwLeft;
WORDwTop;
WORDwRight;
WORDwBottom;
WORDwXResolution;
WORDwYResolution;
BYTEbPalette[48];
BYTEbReserved;
BYTEbPlanes;
WORDwLineBytes;
WORDwPaletteType;
WORDwSrcWidth;
WORDwSrcDepth;
BYTEbFiller[54];
}PCXHEADER;
//函数原型
BOOLWINAPIPaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette*pPal);
BOOLWINAPICreateDIBPalette(HDIBhDIB,CPalette*cPal);
LPSTRWINAPIFindDIBBits(LPSTRlpbi);
DWORDWINAPIDIBWidth(LPSTRlpDIB);
DWORDWINAPIDIBHeight(LPSTRlpDIB);
WORDWINAPIPaletteSize(LPSTRlpbi);
WORDWINAPIDIBNumColors(LPSTRlpbi);
WORDWINAPIDIBBitCount(LPSTRlpbi);
HGLOBALWINAPICopyHandle(HGLOBALh);
BOOLWINAPISaveDIB(HDIBhDib,CFile&file);
HDIBWINAPIReadDIBFile(CFile&file);
BOOLWINAPIDIBToPCX256(LPSTRlpDIB,CFile&file);
HDIBWINAPIReadPCX256(CFile&file);
#endif//!
_INC_DIBAPI
//************************************************************************
//文件名:
dibapi.cpp
//DIB(IndependentBitmap)API函数库:
//
//PaintDIB()-绘制DIB对象
//CreateDIBPalette()-创建DIB对象调色板
//FindDIBBits()-返回DIB图像象素起始位置
//DIBWidth()-返回DIB宽度
//DIBHeight()-返回DIB高度
//PaletteSize()-返回DIB调色板大小
//DIBNumColors()-计算DIB调色板颜色数目
//CopyHandle()-拷贝内存块
//SaveDIB()-将DIB保存到指定文件中
//ReadDIBFile()-重指定文件中读取DIB对象
//DIBToPCX256()-将指定的256色DIB对象保存为256色PCX文件
//ReadPCX256()-读取256色PCX文件
//************************************************************************
#include"stdafx.h"
#include"dibapi.h"
#include
#include
#include
#include
/*Dib文件头标志(字符串"BM",写DIB时用到该常数)*/
#defineDIB_HEADER_MARKER((WORD)('M'<<8)|'B')
/*************************************************************************
*函数名称:
*PaintDIB()
*参数:
*HDChDC-输出设备DC
*LPRECTlpDCRect-绘制矩形区域
*HDIBhDIB-指向DIB对象的指针
*LPRECTlpDIBRect-要输出的DIB区域
*CPalette*pPal-指向DIB对象调色板的指针
*返回值:
*BOOL-绘制成功返回TRUE,否则返回FALSE。
*说明:
*该函数主要用来绘制DIB对象。
其中调用了StretchDIBits()或者
*SetDIBitsToDevice()来绘制DIB对象。
输出的设备由由参数hDC指
*定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数
*lpDIBRect指定。
************************************************************************/
BOOLWINAPIPaintDIB(HDChDC,
LPRECTlpDCRect,
HDIBhDIB,
LPRECTlpDIBRect,
CPalette*pPal)
{
LPSTRlpDIBHdr;//BITMAPINFOHEADER指针
LPSTRlpDIBBits;//DIB象素指针
BOOLbSuccess=FALSE;//成功标志
HPALETTEhPal=NULL;//DIB调色板
HPALETTEhOldPal=NULL;//以前的调色板
//判断DIB对象是否为空
if(hDIB==NULL)
{//返回
returnFALSE;
}
//锁定DIB
lpDIBHdr=(LPSTR):
:
GlobalLock((HGLOBAL)hDIB);
//找到DIB图像象素起始位置
lpDIBBits=:
:
FindDIBBits(lpDIBHdr);
//获取DIB调色板,并选中它
if(pPal!
=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
//选中调色板
hOldPal=:
:
SelectPalette(hDC,hPal,TRUE);
}
//设置显示模式
:
:
SetStretchBltMode(hDC,COLORONCOLOR);
//判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&
(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
{//原始大小,不用拉伸。
bSuccess=:
:
SetDIBitsToDevice(hDC,//hDC
lpDCRect->left,//DestX
lpDCRect->top,//DestY
RECTWIDTH(lpDCRect),//nDestWidth
RECTHEIGHT(lpDCRect),//nDestHeight
lpDIBRect->left,//SrcX
(int)DIBHeight(lpDIBHdr)-
lpDIBRect->top-
RECTHEIGHT(lpDIBRect),//SrcY
0,//nStartScan
(WORD)DIBHeight(lpDIBHdr),//nNumScans
lpDIBBits,//lpBits
(LPBITMAPINFO)lpDIBHdr,//lpBitsInfo
DIB_RGB_COLORS);//wUsage
}
else
{//非原始大小,拉伸。
bSuccess=:
:
StretchDIBits(hDC,//hDC
lpDCRect->left,//DestX
lpDCRect->top,//DestY
RECTWIDTH(lpDCRect),//nDestWidth
RECTHEIGHT(lpDCRect),//nDestHeight
lpDIBRect->left,//SrcX
lpDIBRect->top,//SrcY
RECTWIDTH(lpDIBRect),//wSrcWidth
RECTHEIGHT(lpDIBRect),//wSrcHeight
lpDIBBits,//lpBits
(LPBITMAPINFO)lpDIBHdr,//lpBitsInfo
DIB_RGB_COLORS,//wUsage
SRCCOPY);//dwROP
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)hDIB);
//恢复以前的调色板
if(hOldPal!
=NULL)
{
:
:
SelectPalette(hDC,hOldPal,TRUE);
}
//返回
returnbSuccess;
}
/*************************************************************************
*函数名称:
*CreateDIBPalette()
*参数:
*HDIBhDIB-指向DIB对象的指针
*CPalette*pPal-指向DIB对象调色板的指针
*返回值:
*BOOL-创建成功返回TRUE,否则返回FALSE。
*说明:
*该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
*最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。
这样
*可以用最好的颜色来显示DIB图像。
************************************************************************/
BOOLWINAPICreateDIBPalette(HDIBhDIB,CPalette*pPal)
{//指向逻辑调色板的指针
LPLOGPALETTElpPal;
//逻辑调色板的句柄
HANDLEhLogPal;
//调色板的句柄
HPALETTEhPal=NULL;
//循环变量
inti;
//颜色表中的颜色数目
WORDwNumColors;
//指向DIB的指针
LPSTRlpbi;
//指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFOlpbmi;
//指向BITMAPCOREINFO结构的指针
LPBITMAPCOREINFOlpbmc;
//表明是否是Win3.0DIB的标记
BOOLbWinStyleDIB;
//创建结果
BOOLbResult=FALSE;
//判断DIB是否为空
if(hDIB==NULL)
{//返回FALSE
returnFALSE;
}
//锁定DIB
lpbi=(LPSTR):
:
GlobalLock((HGLOBAL)hDIB);
//获取指向BITMAPINFO结构的指针(Win3.0)
lpbmi=(LPBITMAPINFO)lpbi;
//获取指向BITMAPCOREINFO结构的指针
lpbmc=(LPBITMAPCOREINFO)lpbi;
//获取DIB中颜色表中的颜色数目
wNumColors=:
:
DIBNumColors(lpbi);
if(wNumColors!
=0)
{//分配为逻辑调色板内存
hLogPal=:
:
GlobalAlloc(GHND,sizeof(LOGPALETTE)
+sizeof(PALETTEENTRY)
*wNumColors);
//如果内存不足,退出
if(hLogPal==0)
{//解除锁定
:
:
GlobalUnlock((HGLOBAL)hDIB);
//返回FALSE
returnFALSE;
}
lpPal=(LPLOGPALETTE):
:
GlobalLock((HGLOBAL)hLogPal);
//设置版本号
lpPal->palVersion=PALVERSION;
//设置颜色数目
lpPal->palNumEntries=(WORD)wNumColors;
//判断是否是WIN3.0的DIB
bWinStyleDIB=IS_WIN30_DIB(lpbi);
//读取调色板
for(i=0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{//读取红色分量
lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
//读取绿色分量
lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
//读取蓝色分量
lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;
//保留位
lpPal->palPalEntry[i].peFlags=0;
}
else
{//读取红色分量
lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;
//读取绿色分量
lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;
//读取红色分量
lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue;
//保留位
lpPal->palPalEntry[i].peFlags=0;
}
}
//按照逻辑调色板创建调色板,并返回指针
bResult=pPal->CreatePalette(lpPal);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)hLogPal);
//释放逻辑调色板
:
:
GlobalFree((HGLOBAL)hLogPal);
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)hDIB);