图象的几何变换.docx
- 文档编号:4334156
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:17
- 大小:545.43KB
图象的几何变换.docx
《图象的几何变换.docx》由会员分享,可在线阅读,更多相关《图象的几何变换.docx(17页珍藏版)》请在冰豆网上搜索。
图象的几何变换
实验二、图象的几何变换
1.实验目的:
1)熟练运用某种编程工具语言实现图象的几何变换方法
2)通过实验,进一步增强学生对本课程的理解,并在此基础上使学生进一步掌握图像变换和图像增强的基本概念、基本理论和这些理论在实际图像处理中的应用,特别是要把学到的数字图像处理的各种方法灵活应用到实际中
2.实验内容:
1)实现图象的平移
2)实现图象任意角度的旋转(注意精度)
3)编写程序,实现图象的“无级”放大(2,3选一)
4)
完成本实验内容,具体实验采用VC++6.0
其流程图如右图所示:
3.实验步骤及源代码:
1)首先启动一幅位图如图1所示:
图1启动位图
2)设置图像缩放参数。
在资源视图中添加对话框如图,然后进行相关参数设定。
如下图所示:
添加对话框类【CDlgGeoTran】,具体代码如下所示:
//DlgGeoTran.h:
headerfile
/////////////////////////////////////////////////////////////////////////////
//CDlgGeoTrandialog
classCDlgGeoTran:
publicCDialog
{//Construction
public:
CDlgGeoTran(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CDlgGeoTran)
enum{IDD=IDD_DLG_GEOTrans};
longm_XOffset;
longm_YOffset;
//}}AFX_DATA
//Overrides
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//Implementation
protected:
DECLARE_MESSAGE_MAP()
};
//DlgGeoTran.cpp:
implementationfile
CDlgGeoTran:
:
CDlgGeoTran(CWnd*pParent/*=NULL*/)
:
CDialog(CDlgGeoTran:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CDlgGeoTran)
m_XOffset=0;
m_YOffset=0;
//}}AFX_DATA_INIT
}
voidCDlgGeoTran:
:
DoDataExchange(CDataExchange*pDX)
{CDialog:
:
DoDataExchange(pDX);
DDX_Text(pDX,IDC_EDIT_XOffset,m_XOffset);
DDX_Text(pDX,IDC_EDIT_YOffset,m_YOffset);
}
3)设置图像缩放参数。
在资源视图中添加对话框如下图,然后进行相应的资源参数设置。
添加对话框类【CDlgGeoZoom】,具体代码如下所示:
//DlgGeoZoom.h:
headerfile
/////////////////////////////////////////////////////////////////////////////
//CDlgGeoZoomdialog
classCDlgGeoZoom:
publicCDialog
{
public:
CDlgGeoZoom(CWnd*pParent=NULL);//standardconstructor
//DialogData
enum{IDD=IDD_DLG_GEOZoom};
floatm_XZoom;
floatm_YZoom;
//Overrides
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//Implementation
protected:
DECLARE_MESSAGE_MAP()
};
//DlgGeoZoom.cpp:
implementationfile
CDlgGeoZoom:
:
CDlgGeoZoom(CWnd*pParent/*=NULL*/)
:
CDialog(CDlgGeoZoom:
:
IDD,pParent)
{//{{AFX_DATA_INIT(CDlgGeoZoom)
m_XZoom=0.0f;
m_YZoom=0.0f;
//}}AFX_DATA_INIT
}
voidCDlgGeoZoom:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgGeoZoom)
DDX_Text(pDX,IDC_EDIT_XZoom,m_XZoom);
DDV_MinMaxFloat(pDX,m_XZoom,0.25f,4.f);
DDX_Text(pDX,IDC_EDIT_YZoom,m_YZoom);
DDV_MinMaxFloat(pDX,m_YZoom,0.25f,4.f);
//}}AFX_DATA_MAP
}
4)设置图像旋转参数。
在资源视图中添加对话框如下图,然后进行相应的资源参数设置。
添加对话框类【CDlgGeoRota】,具体代码如下所示:
//DlgGeoRota.cpp:
implementationfile
CDlgGeoRota:
:
CDlgGeoRota(CWnd*pParent/*=NULL*/)
:
CDialog(CDlgGeoRota:
:
IDD,pParent)
{
m_iRotateAngle=0;
}
voidCDlgGeoRota:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
DDX_Text(pDX,IDC_EDIT_Rotate,m_iRotateAngle);
DDV_MinMaxInt(pDX,m_iRotateAngle,0,360);
}
5)添加菜单资源项如下图所示。
然后添加消息,具体代码如下所示:
//图像平移
voidCCh1_1View:
:
OnGeomTran()
{
//平移位图
//获取文档
CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推)
if(:
:
DIBNumColors(lpDIB)!
=256)
{//提示用户
MessageBox("目前只支持256色位图的平移!
","系统提示",MB_ICONINFORMATION|MB_OK);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
return;
}
LONGlXOffset;
LONGlYOffset;
//创建对话框
CDlgGeoTrandlgPara;
//初始化变量值
dlgPara.m_XOffset=100;
dlgPara.m_YOffset=100;
//显示对话框,提示用户设定平移量
if(dlgPara.DoModal()!
=IDOK)
{
return;
}
//获取用户设定的平移量
lXOffset=dlgPara.m_XOffset;
lYOffset=dlgPara.m_YOffset;
//删除对话框
deletedlgPara;
//更改光标形状
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=:
:
FindDIBBits(lpDIB);
//调用TranslationDIB()函数平移DIB
if(TranslationDIB1(lpDIBBits,:
:
DIBWidth(lpDIB),:
:
DIBHeight(lpDIB),lXOffset,lYOffset))
{//设置标记
pDoc->SetModifiedFlag(TRUE);
/更新视图
pDoc->UpdateAllViews(NULL);
}
else
{//提示用户
MessageBox("分配内存失败!
","系统提示",MB_ICONINFORMATION|MB_OK);
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
//图像缩放
voidCCh1_1View:
:
OnGeomZoom()
{//获取文档
CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推)
if(:
:
DIBNumColors(lpDIB)!
=256)
{//提示用户
MessageBox("目前只支持256色位图的缩放!
","系统提示",MB_ICONINFORMATION|MB_OK);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
return;
}
//缩放比率
floatfXZoomRatio;
floatfYZoomRatio;
//创建对话框
CDlgGeoZoomdlgPara;
//初始化变量值
dlgPara.m_XZoom=0.5;
dlgPara.m_YZoom=0.5;
//显示对话框,提示用户设定平移量
if(dlgPara.DoModal()!
=IDOK)
{
return;
}
//获取用户设定的平移量
fXZoomRatio=dlgPara.m_XZoom;
fYZoomRatio=dlgPara.m_YZoom;
//删除对话框
deletedlgPara;
//创建新DIB
HDIBhNewDIB=NULL;
//更改光标形状
BeginWaitCursor();
//调用ZoomDIB()函数转置DIB
hNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);
//判断缩放是否成功
if(hNewDIB!
=NULL)
{
//替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
//更新DIB大小和调色板
pDoc->InitDIBData();
//设置脏标记
pDoc->SetModifiedFlag(TRUE);
//重新设置滚动视图大小
SetScrollSizes(MM_TEXT,pDoc->GetDocSize());
//更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
//提示用户
MessageBox("分配内存失败!
","系统提示",MB_ICONINFORMATION|MB_OK);
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
//图像旋转
voidCCh1_1View:
:
OnGeomRota()
{//获取文档
CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//锁定DIB
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
if(:
:
DIBNumColors(lpDIB)!
=256)
{
//提示用户
MessageBox("目前只支持256色位图的旋转!
","系统提示",MB_ICONINFORMATION|MB_OK);
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
return;
}
//缩放比率
intiRotateAngle;
//创建对话框
CDlgGeoRotadlgPara;
//初始化变量值
dlgPara.m_iRotateAngle=90;
//显示对话框,提示用户设定旋转角度
if(dlgPara.DoModal()!
=IDOK)
{//返回
return;
}
//获取用户设定的平移量
iRotateAngle=dlgPara.m_iRotateAngle;
//删除对话框
deletedlgPara;
//创建新DIB
HDIBhNewDIB=NULL;
//更改光标形状
BeginWaitCursor();
//调用RotateDIB()函数旋转DIB
hNewDIB=(HDIB)RotateDIB(lpDIB,iRotateAngle);
//判断旋转是否成功
if(hNewDIB!
=NULL)
{
//替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
//更新DIB大小和调色板
pDoc->InitDIBData();
//设置脏标记
pDoc->SetModifiedFlag(TRUE);
//重新设置滚动视图大小
SetScrollSizes(MM_TEXT,pDoc->GetDocSize());
//更新视图
pDoc->UpdateAllViews(NULL);
}
else
{//提示用户
MessageBox("分配内存失败!
","系统提示",MB_ICONINFORMATION|MB_OK);
}
//解除锁定
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//恢复光标
EndWaitCursor();
}
4.实验结果
1)图像平移实验结果
图2设置平移量
图3平移结果
2)图像缩放实验结果
图4设定缩放量
图5缩放结果
3)图像旋转实验结果
图6设定旋转角度
图7图像旋转结果
5.实验小结
本次实验完成了图像位移、图像任意角度的旋转、变换的实验内容,但在精度的控制方面还存在缺陷。
另外图像平移、变换等操作的实现程序较为简单,不能完成复杂的操作和处理,而且显示效果方面也有待于修改和改进。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图象 几何 变换