版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图像缩放的VC+实现实验要求试用最邻近插值和双线性插值对所给图像进行缩小和放大操作。先缩小12倍,再放大12倍。描述图像的变化,分析变化的原因,并给出对两种插值方法的评价。实验原理1-最邻近插值(近邻取样法)最邻近插值是一种简单的插值算法,也称为零阶插值。它输出的像素灰度值就等于距离它映射到的位置最近的输入像素的灰度值。对于通过反向变换得到的的一个浮点坐标,对其进行简单的取整,得到一个整数型坐标,这个整数型坐标对应的像素值就是目的像素的像素值,也就是说,取浮点坐标最邻近的左上角点(对于DIB是右上角,因为它的扫描行是逆序存储的)对应的像素值。可见,最邻近插值简单且直观,但得到的图像质量不高;当
2、图像中包含像素之间灰度级有变化的细微结构时,最邻近查值法会在图像中产生人为的加工痕迹。2.双线性插值对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+uj+v),其中i、j均为非负整数,u、v为0,1)区间的浮点数,则这个像素得值f(i+u,j+v)可由原图像中坐标为(ij)、(i+lj)、(i,j+l)、(i+lj+l)所对应的周围四个像素的值决定,即:f(i+uj+v)=(l-u)(l-v)f(ij)+(l-u)vf(ij+l)+u(l-v)f(i+lj)+uvf(i+lj+l)其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。这就是双线性内插值法。双线性内插值法计算量
3、大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。概要设计本实验的系统软件整体流程图如下:本实验使用的平台是VC6.0,使用VC+实现的图形用户界面。2-功能模块的划分和描述由上面的程序整体流程图可以看出,本程序主要分为下面几个模块:读取灰度图像模块:该模块主要实现读入一幅灰度图像。设置放大缩小借数模块:可以自由设置图片要放大和缩小的比例,且设置了最大只能放大15倍,最小缩小0.001倍,不过可以多次放大和缩小。最近邻插值模块:实现最近邻插值放大和缩小。双线性插值模块:实现双线性插值放大和缩小。保
4、存处理后的图片模块:实现图片的保存。详细设计由于读取灰度图像模块、保存处理后的图片模块可以由系统自带的类CFileDialog类实现,因此本实验的重点是放在设置放大缩小倍数模块、最近邻插值模块、双线性插值模块这三个模块,以下是关于这三个模块的实现:设置放大和缩小比例系数本程序中新建了一个继承自对话框类CDialog的类SetClass用來接收用户输入的放大缩小比例的值,用户通过菜单的设置项来设置该系数,该对话框的界面如下:其中的X和Y分别是用來设置图片的横向和纵向放大系数。用户设置的变量的值存放在文档类的四个浮点型变量m_BXZoomRatio(横向放大倍数,初值为1.25),m_BYZoom
5、Ratio(纵向放大倍薮,初值为1.25),m_SXZoomRatio(横向缩小系数,初值为0.8),m_SYZoomRatio(纵向缩小系数,初值是0.8)中。其程序流程图如下:其代码实现如下:放大系数设置菜单项的响应函数voidCMyDIPDoc:OnZoombig()/TODO:AddyourcommandhandlercodehereSetClasssetclass;设置对话框if(setclass.DoModalf)=IDOK)将用户设置值存到文档类中的相应变量中m_BXZoomRatio=setclass.m_getx;m_BYZoomRatio=setclass.m_gety;缩
6、小系数设置菜单项的响应函数voidCMyDIPDoc:OnZoomsmall()/TODO:AddyourcommandhandlercodehereSetClasssetclass;if(setclass.DoModal()=IDOK)将用户设置值存到文档类中的相应变量中m_SXZoomRatio=setclass.m_getx;m_SYZoomRatio=setclass.m_gety;最近邻插值模块和双线性插值模块本程序实现这两个模块功能代码是在一个全局函数中实现的,其原型为:HGLOBALWINAPIZoomDIBfLPSTRIpDIB,floatfXZoomRatio,floatfY
7、ZoomRatio,BOOLtag);其中IpDIB是指向需处理的设备无关位图的指针,fXZoomRatio和fYZoomRatio分别为横向和纵向缩放系数,tag为一标记变量(tag=l时执行最近邻插值操作,tag=O时执行双线性插值操作)。程序流程图如下:其实现代码如下:HGLOBALWINAPIZoomDIB(LPSTRIpDIB,floatfXZoomRatio,floatfYZoomRatio,BOOLtag)/源图像的宽度和高度LONGIWidth;LONGIHeight;/缩放后图像的宽度和高度LONGINewWidth;LONGINewHeight;/缩放后图像的宽度(INew
8、Widtf,必须是4的倍数)LONGINewLineBytes;/指向源图像的指针LPSTRIpDIBBits;/指向源象素的指针LPSTRIpSrc;/缩放后新DIB句柄HDIBhDIB;/指向缩放图像对应象素的指针LPSTRIpDst;/指向缩放图像的指针LPSTRIpNewDIB;LPSTRIpNewDIBBits;/指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERIpbmi;/指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERIpbmc;/循环变量(象素在新DIB中的坐标)LONGi;LONGj;/象素在源DIB中的坐标
9、LONGiO;LONGjO;doublex,y;/图像每行的字节数LONGILineBytes;/找到源DIB图像象素起始位置IpDIBBits=:FindDIBBits(lpDIB);/获取图像的宽度IWidth=:DIBWidth(lpDIB);/计算图像每行的字节数ILineBytes=WIDTHBYTES(IWidth*8);/获取图像的高度Height=:DIBHeight(lpDIB);/计算缩放后的图像实际宽度/此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分INewWidth=(LONG)(:DIBWidth(lpDIB)*fXZoomRatio+0.5);
10、/计算新图像每行的字节数INewLineBytes=WIDTHBYTES(INewWidth*8);/计算缩放后的图像高度INewHeight=(LONG)(Height*fYZoomRatio+0.5);/分配内存,以保存新DIBhDIB=(HDIB):GlobalAlloc(GHND,INewLineBytes*INewHeight+*(LPDWORD)lpDIB+:PaletteSize(lpDIB);/判断是否内存分配失败讦(hDIB=NULL)/分配内存失败returnNULL;/锁定内存IpNewDIB=(char*):GlobalLock(HGLOBAL)hDIB);/复制DIB
11、信息头和调色板memcpy(lpNewDIB,IpDIB,*(LPDWORD)lpDIB+:PaletteSize(lpDIB);/找到新DIB象素起始位置IpNewDIBBits=:FindDIBBits(lpNewDIB);/获取指针Ipbmi=(LPBITMAPINFOHEADER)lpNewDIB;Ipbmc=(LPBITMAPCOREHEADER)lpNewDIB;/更新DIB中图像的高度和宽度if(IS_WIN30_DIB(lpNewDIB)/对于Windows3.0DIBlpbmi-biWidth=INewWidth;lpbmi-biHeight=INewHeight;else/
12、对于其它格式的DIBlpbmc-bcWidth=(unsignedshort)INewWidth;lpbmc-bcHeight=(unsignedshort)INewHeight;/针对图像每行进行操作for(i=0;iINewHeight;i+)/针对图像每列进行操作for(j=0;j=0)&(j0=0)&(iOIHeight)/指向源DIB第iO行,第jO个象素的指针IpSrc=(char*)lpDIBBits+ILineBytes*(IHeight-1-iO)+jO;/复制象素*lpDst=*lpSrc;else对于源图中没有的象素,直接赋值为255*(unsignedchar*)lpD
13、st)=255;else/否则,执行下面的双线性插值代码doublem=x-LONG(x);/X方向的小数部分doublen=y-LONG(y);/Y方向的小数部分unsignedcharrd,Id,lu,ru;/r:右;I:左;d:下;u:上unsignedcharpix;Id=*(char*)lpDIBBits+ILineBytes*(IHeight-1-LONG(y)+LONG(x);左下角点的像素值rd=*(char*)lpDIBBits+ILineBytes*(IHeight-1-LONG(y)+LONG(x)+1);/右下角点的像素值lu=*(char*)lpDIBBits+ILi
14、neBytes*(IHeight-1-LONG(y)-1)+LONG(x);/左上角点的核素值ru=*(char*)lpDIBBits+ILineBytes*(IHeight-1-LONG(y)-1)+LONG(x)+1);/右上角点的像素值pix=(1-m)*(1-n)*Id+(1-m)*n*lu+m*n*ru+m*(1-n)*rd;/双线性插值,得到变换后的像素*(unsignedchar*)lpDst)=pix;/将像素值赋给目的图片/返回returnhDIB;该函数分别在视图类CMyDIPView中下面的函数(也就是相应菜单项的响应函数)中调用:voidOnMenuitem32778(
15、);/最近邻插值缩小图片voidOnMenuitem32779();/最近邻插值放大图片voidOnMenuitem32780();/双线性插值放大图片voidOnMenuitem32781();/双线性插值缩小图片实验结果运行程序,各模块实验结果如下:读入灰度图片和设置放大缩小系数的结果读入图片:设置放大缩小系数:最近邻插值放大缩小图片结果再使用最近邻插值放大12倍:双线性插值放大缩小图片结果缩小12倍:再放大12倍:结果分析上面实验结果分别用最邻近插值和双线性插值对钟表图片进行缩小和放大操作。先缩小12倍,再放大12倍。我们可以看到用最近邻插值方法处理后的图片产生了严重的疵点,边界出现了毛疵,图像质量很差。而用双线性插值处理后的图片边界较为平滑,图像质量较好,但是图中的一些细节也被模糊了。产生上面结果的原因:最近邻插值是取距离源图像像素点最近的点的像
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026岚图区域市场岗位社会招聘备考题库带答案详解(综合卷)
- 2026甘肃兰州工业学院高层次人才引进98人备考题库(第一批)带答案详解(综合卷)
- 2026上海师范大学附属官渡实验学校招聘1人备考题库及答案详解【网校专用】
- 2026重庆奉节县教育事业单位招聘25人备考题库及完整答案详解1套
- 2026济钢集团招聘112人备考题库附参考答案详解(培优b卷)
- 2026黑龙江省大庆市“庆蓝优引·社会招引”市属学校人才招聘14人备考题库附答案详解(典型题)
- 2026新疆得仁水务发展有限公司市场化选聘公司及子公司管理人员6人备考题库及1套完整答案详解
- 2026福建福州职业技术学院诚聘高层次人才备考题库含答案详解(考试直接用)
- 2026年上半年长信保险经纪(四川)有限公司第二批人员招聘1人备考题库及答案详解(必刷)
- 2026福建泉州市晋江市社会组织综合党委招聘专职人员2人备考题库附答案详解(完整版)
- 招33人!泽库县公安局2026年面向社会公开招聘警务辅助人员考试参考题库及答案解析
- 盘点:2026年AI智能CRM系统主流品牌
- 装配式工程质量标准化管理手册
- DB42-T 2509-2026 数字乡村 地质资源信息化建设与应用规范
- 全国小学生英语口语表达训练题库考试
- 新闻发布培训
- 财税销售技巧培训课件
- GB/T 46894-2025车辆集成电路电磁兼容试验通用规范
- 《安全工程专业实验》课件全套 第1-8章 实验室安全-安全检测实验
- 江西省港口集团招聘笔试题库2026
- 给水工程可行性研究报告
评论
0/150
提交评论