光学图象处理课程设计.docx

上传人:b****3 文档编号:4866788 上传时间:2022-12-11 格式:DOCX 页数:40 大小:58.36KB
下载 相关 举报
光学图象处理课程设计.docx_第1页
第1页 / 共40页
光学图象处理课程设计.docx_第2页
第2页 / 共40页
光学图象处理课程设计.docx_第3页
第3页 / 共40页
光学图象处理课程设计.docx_第4页
第4页 / 共40页
光学图象处理课程设计.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

光学图象处理课程设计.docx

《光学图象处理课程设计.docx》由会员分享,可在线阅读,更多相关《光学图象处理课程设计.docx(40页珍藏版)》请在冰豆网上搜索。

光学图象处理课程设计.docx

光学图象处理课程设计

 

光学图象处理实验(课程设计)

指导说明书

 

信息物理与工程系

王振东

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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1