没有合适的资源?快使用搜索试试~ 我知道了~
首页图象处理实验报告 图像的几何变换包括图像的缩放、平移和旋转。
资源详情
资源评论
资源推荐
湖北师范学院计算机科学与技术学院
图像处理课程设计
实验报告
班级:计算机科学与技术学院
0601
班
学号: 2006115010148
姓名: 徐理军
图像处理课程设计实验报告
湖北师范学院计算机科学与技术学院 0601 班
1
湖北师范学院计算机科学与技术学院
计算机图像处理课程设计报告
1. 实验题目:
1.1、图像的几何变换包括图像的缩放、平移和旋转。
1.2、图像的正交变换包括图像的傅里叶变换,离散变换。
1.3、将信源分别哈夫曼编码和香龙范诺编码并分别计算信源的熵、平均码长及编码效
率。
2. 实验目的:
2.1、加深对计算机图像处理课程理论方面的理解。
2.2、掌握计算机图像处理课程的应用。
2.3、掌握图像的几何变换、正交变换和编码方式。
3.实验内容与步骤:
3.1 图像的几何变换
图像的几何变换,通常包括图像的平移、图像的缩放和图像的旋转等。
3.1.1 图像的平移
3.1.1.1 源代码
/*************************************************************************
* 函数名称:
* TranslationDIB1()
* 参数:
* LPSTR lpDIBBits - 指向源 DIB 图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* LONG lXOffset - X 轴平移量(象素数)
* LONG lYOffset - Y 轴平移量(象素数)
* 返回值:
* BOOL - 平移成功返回 TRUE,否则返回 FALSE。
* 说明:
* 该函数用来水平移动 DIB 图像。函数不会改变图像的大小,移出的部分图像
* 将截去,空白部分用白色填充。
/************************************************************************/
BOOL WINAPI TranslationDIB1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, LONG lXOffset, LONG
lYOffset)
{
LPSTR lpSrc; // 指向源图像的指针
图像处理课程设计实验报告
湖北师范学院计算机科学与技术学院 0601 班
1
湖北师范学院计算机科学与技术学院
LPSTR lpDst; // 指向要复制区域的指针
LPSTR lpNewDIBBits; // 指向复制图像的指针
HLOCAL hNewDIBBits;
LONG i; // 象素在新 DIB 中的坐标
LONG j;
LONG i0; // 象素在源 DIB 中的坐标
LONG j0;
LONG lLineBytes; // 图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8); // 计算图像每行的字节数
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight); // 暂时分配内存,以保存新图像
if (hNewDIBBits == NULL)
{
return FALSE; // 分配内存失败
}
lpNewDIBBits = (char * )LocalLock(hNewDIBBits); // 锁定内存
for(i = 0; i < lHeight; i++) // 每行
{
for(j = 0; j < lWidth; j++) // 每列
{
// 指向新 DIB 第 i 行,第 j 个象素的指针
// 注意由于 DIB 中图像第一行其实保存在最后一行的位置,因此 lpDst
// 值不是(char *)lpNewDIBBits + lLineBytes * i + j,而是
// (char *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j
lpDst = (char *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;
i0 = i - lXOffset; // 计算该象素在源 DIB 中的坐标
j0 = j - lYOffset;
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
// 指向源 DIB 第 i0 行,第 j0 个象素的指针
// 同样要注意 DIB 上下倒置的问题
lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;
*lpDst = *lpSrc; // 复制象素
}
else
{
* ((unsigned char*)lpDst) = 255; // 对于源图中没有的象素,直接赋值为 255
}
图像处理课程设计实验报告
湖北师范学院计算机科学与技术学院 0601 班
2
湖北师范学院计算机科学与技术学院
}
}
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight); // 复制平移后的图像
LocalUnlock(hNewDIBBits); // 释放内存
LocalFree(hNewDIBBits);
return TRUE;
}
3.1.1.2 简要分析
由于每行像素是连续放置的,可以直接逐行地来复制图像。首先计算移出后可视的区域。
对于 x 轴方向,
当 tx
-width 时,图像完全移出了屏幕,不用做任何处理;
当-width< tx
0 时,图像区域的 x 范围从 0 到 width-
tx
,对应原图的范围从
tx
到 width;
当 0〈 tx〈width 时,图像区域的 x 范围从 tx 到 width,对应原图的范围从 0 到 width-tx;
当 tx
width 时,图像完全移出了屏幕,不用做任何处理;
对于 y 轴方向,
当 ty
-height 时,图像完全移出了屏幕,不用做任何处理;
当-height〈 ty
0 时,图像区域的 y 范围从 0 到 height-
ty
,对应原图的范 围从
ty
到
height;
当 0〈 ty〈height 时,图像区域的 y 范围从 ty 到 height,对应原图的范围从 0 到 height-ty;
当 ty
height 时,图像完全移出了屏幕,不用做任何处理;
当计算出经移动而可视的区域后,就可以利用位图存储的连续性,即同一行的像素在内存
中是相邻的这一规则进行计算。利用 memcpy 函数,从(x0,y0)点开始,一次可以拷贝一整行(宽
度为 x1-x0),然后将内存指针移到( x0,y0+1)处,拷贝下一行。这样拷贝到(y1-y0)行就完成了
全部操作,避免了单个像素的计算,从而提高了效率。
按照上面的描述,现在可以构造自己的图像几何变换函数库了。首先来完成图像的平移函数。图像的平
移函数操作不需要改变 DIB 的调色板和文件头,只要把指向 DIB 像素起始位置的指针和 DIB 高宽传递
给子函数就可以完成平移工作。
3.1.1.3 运行结果
3.1.2 图像的缩放
3.1.2.1 主要函数源代码
图像处理课程设计实验报告
湖北师范学院计算机科学与技术学院 0601 班
3
湖北师范学院计算机科学与技术学院
/*************************************************************************
*
* 函数名称:
* ZoomDIB()
* 参数:
* LPSTR lpDIB - 指向源 DIB 的指针
* float fXZoomRatio - X 轴方向缩放比率
* float fYZoomRatio - Y 轴方向缩放比率
* 返回值:
* HGLOBAL - 缩放成功返回新 DIB 句柄,否则返回 NULL。
* 说明:
* 该函数用来缩放 DIB 图像,返回新生成 DIB 的句柄。
************************************************************************/
HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio)
{
LONG lWidth; LONG lHeight; // 源图像的宽度和高度
LONG lNewWidth; LONG lNewHeight; // 缩放后图像的宽度和高度
LONG lNewLineBytes; // 缩放后图像的宽度(lNewWidth',必须是 4 的倍数)
LPSTR lpDIBBits; // 指向源图像的指针
LPSTR lpSrc; // 指向源象素的指针
HDIB hDIB; // 缩放后新 DIB 句柄
LPSTR lpDst; // 指向缩放图像对应象素的指针
LPSTR lpNewDIB; // 指向缩放图像的指针
LPSTR lpNewDIBBits;
LPBITMAPINFOHEADER lpbmi; // 指向 BITMAPINFO 结构的指针(Win3.0)
LPBITMAPCOREHEADER lpbmc; // 指向 BITMAPCOREINFO 结构的指针
LONG i; LONG j; // 循环变量(象素在新 DIB 中的坐标)
LONG i0; LONG j0; // 象素在源 DIB 中的坐标
LONG lLineBytes; // 图像每行的字节数
lpDIBBits = ::FindDIBBits(lpDIB); // 找到源 DIB 图像象素起始位置
lWidth = ::DIBWidth(lpDIB); // 获取图像的宽度
lLineBytes = WIDTHBYTES(lWidth * 8); // 计算图像每行的字节数
lHeight = ::DIBHeight(lpDIB); // 获取图像的高度
// 计算缩放后的图像实际宽度
// 此处直接加 0.5 是由于强制类型转换时不四舍五入,而是直接截去小数部分
lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5);
lNewLineBytes = WIDTHBYTES(lNewWidth * 8); // 计算新图像每行的字节数
lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5); // 计算缩放后的图像高度
hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB
+ ::PaletteSize(lpDIB));
图像处理课程设计实验报告
湖北师范学院计算机科学与技术学院 0601 班
4
剩余22页未读,继续阅读
xulijun
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10